у конструктора могут быть параметры
Конструкторы (Руководство по программированию на C#)
Каждый раз, когда создается класс или структура, вызывается конструктор. Класс или структура может иметь несколько конструкторов, принимающих различные аргументы. Конструкторы позволяют программисту задавать значения по умолчанию, ограничивать число установок и писать код, который является гибким и удобным для чтения. Дополнительные сведения и примеры см. в разделах Использование конструкторов и Конструкторы экземпляров.
Конструкторы без параметров
Если не предоставить конструктор для класса, C# создаст конструктор по умолчанию, который создает экземпляр объекта и задает переменным-членам значения по умолчанию, как показано в статье Значения по умолчанию типов C#. Если не предоставить конструктор для структуры, C# будет использовать неявный конструктор без параметров, чтобы автоматически инициализировать каждое поле значением по умолчанию. Дополнительные сведения и примеры см. в разделе Конструкторы экземпляров.
Синтаксис конструктора
Статические конструкторы
В приведенных выше примерах показаны конструкторы экземпляров, которые создают новый объект. В классе или структуре также может быть статический конструктор, который инициализирует статические члены типа. Статические конструкторы не имеют параметров. Если вы не предоставили статический конструктор для инициализации статических полей, компилятор C# инициализирует статические поля значениями по умолчанию, как показано в статье Значения по умолчанию типов C#.
В следующем примере статический конструктор используется для инициализации статического поля.
Можно также определить статический конструктор с помощью определения тела выражения, как показано в следующем примере.
Дополнительные сведения и примеры см. в разделе Статические конструкторы.
Тесты по программированию на С++
Вопросы теста по «Объектно-ориентированное программирование на языке C++»
— любой тип данных, определяемый пользователем
— * тип данных, определяемый пользователем и сочетающий в себе данные и функции их обработки
— структура, для которой в программе имеются функции работы с нею
5.Тест. Членами класса могут быть
— * как переменные, так и функции, могут быть объявлены как private и как public
— только переменные, объявленные как private
— только функции, объявленные как private
— только переменные и функции, объявленные как private
— только переменные и функции, объявленные как public
6. Что называется конструктором?
— * метод, имя которого совпадает с именем класса и который вызывается автоматически при создании объекта класса
— метод, имя которого совпадает с именем класса и который вызывается автоматически при объявлении класса (до создания объекта класса)
— метод, имя которого необязательно совпадает с именем класса и который вызывается при создании объекта класса
— метод, имя которого совпадает с именем класса и который необходимо явно вызывать из головной программы при объявлении объекта класса
— переменная, содержащая указатель на класс
— класс, который содержит в себе данные и методы их обработки
8. Отметьте правильные утверждения
— * конструкторы класса не наследуются
— конструкторов класса может быть несколько, их синтаксис определяется программистом
— * конструкторов класса может быть несколько, но их синтаксис должен подчиняться правилам перегрузки функций
— конструктор возвращает указатель на объект
— * конструктор не возвращает значение
9. Что называется деструктором?
— метод, который уничтожает объект
— метод, который удаляет объект
— * метод, который освобождает память, занимаемую объектом
— системная функция, которая освобождает память, занимаемую объектом
7. Выберите правильные утверждения
— * у конструктора могут быть параметры
— конструктор наследуется, но должен быть перегружен
— конструктор должен явно вызываться всегда перед объявлением объекта
— * конструктор вызывается автоматически при объявлении объекта
— объявление каждого класса должно содержать свой конструктор
— * если конструктор не создан, компилятор создаст его автоматически
10. Выберите правильные утверждения
— * деструктор не наследуется
— деструктор наследуется, но должен быть перегружен
— * это механизм, посредством которого производный класс получает элементы родительского и может дополнять либо изменять их свойства и методы
— это механизм переопределения методов базового класса
— это механизм, посредством которого производный класс получает все поля базового класса
— это механизм, посредством которого производный класс получает элементы родительского, может их дополнить, но не может переопределить
12. Выберите правильное объявление производного класса
— class MoreDetails:: Details;
— class MoreDetails: public class Details;
— * class MoreDetails: public Details;
— class MoreDetails: class(Details);
13. Выберите правильные утверждения:
— если элементы класса объявлены как private, то они доступны только наследникам класса, но не внешним функциям
— * если элементы класса объявлены как private, то они недоступны ни наследникам класса, ни внешним функциям
— если элементы объявлены как public, то они доступны наследникам класса, но не внешним функциям
— * если элементы объявлены как public, то они доступны и наследникам класса, и внешним функциям
14. Возможность и способ обращения производного класса к элементам базового определяется
— ключами доступа: private, public, protected в теле производного класса
— только ключом доступа protected в заголовке объявления производного класса
— * ключами доступа: private, public, protected в заголовке объявления производного класса
— ключами доступа: private, public, protected в теле базового класса
15. Выберите правильные соответствия между спецификатором базового класса, ключом доступа в объявлении производного класса и правами доступа прозводного класса к элементам базового
— * ключ доступа – любой; в базовом классе: public; права доступа в производном классе – такие же, как ключ доступа
— функция другого класса, среди аргументов которой есть элементы данного класса
— * функция, объявленная в классе с атрибутом friend, но не являющаяся членом класса;
— функция, являющаяся членом класса и объявленная с атрибутом friend;
— функция, которая в другом классе объявлена как дружественная данному
17. Выберите правильные утверждения:
— * одна функция может быть дружественной нескольким классам
— дружественная функция не может быть обычной функцией, а только методом другого класса
— * дружественная функция объявляется внутри класса, к элементам которого ей нужен доступ
— дружественная функция не может быть методом другого класса
— * определение функции, в которой типу обрабатываемых данных присвоено условное обозначение
— прототип функции, в котором вместо имен параметров указан условный тип
— определение функции, в котором указаны возможные варианты типов обрабатываемых параметров
— определение функции, в котором в прототипе указан условный тип, а в определении указаны варианты типов обрабатываемых параметров
2. Выберите правильные утверждения:
— * по умолчанию члены класса имеют атрибут private
— по умолчанию члены класса имеют атрибут public;
— члены класса имеют доступ только к элементам public;
— * элементы класса с атрибутом private доступны только членам класса
3. Переопределение операций имеет вид:
— имя_класса, ключевое слово operation, символ операции
— * имя_класса, ключевое слово operator, символ операции, в круглых скобках могут быть указаны аргументы
— имя_класса, ключевое слово operator, список аргументов
— имя_класса, два двоеточия, ключевое слово operator, символ операции
— * при обращении через имя объекта – точка, при обращении через указатель – операция «->»
— при обращении через имя объекта – два двоеточия, при обращении через указатель – операция «точка»
— при обращении через имя объекта – точка, при обращении через указатель – два двоеточия
— при обращении через имя объекта – два двоеточия, при обращении через указатель – операция «->»
20. Полиморфизм – это :
— * средство, позволяющее использовать одно имя для обозначения действий, общих для родственных классов
— средство, позволяющее в одном классе использовать методы с одинаковыми именами;
— средство, позволяющее в одном классе использовать методы с разными именами для выполнения одинаковых действий
— средство, позволяющее перегружать функции для работы с разными типами или разным количеством аргументов.
21. Полиморфизм реализован через механизмы:
— * перегрузки функций, виртуальных функций, шаблонов
— перегрузки функций, наследования методов, шаблонов;
— наследования методов, виртуальных функций, шаблонов
— перегрузки функций, наследования, виртуальных функций.
22. Виртуальными называются функции:
— * функции базового класса, которые могут быть переопределены в производном классе
— функции базового класса, которые не используются в производном классе;
— функции базового класса, которые не могут быть переопределены в базовом классе;
— функции производного класса, переопределенные относительно базового класса
23. Выберите правильный вариант выделения динамической памяти под переменную X типа float:
— * float *ptr = new float; X = *ptr;
— float * ptr = &X; X = new float;
24. Полиморфизм в объектно-ориентированном программировании реализуется:
— * через механизмы перегрузки (функций и операций), виртуальные функции и шаблоны
— через механизмы перегрузки (функций и операций) и шаблоны;
— через виртуальные функции и шаблоны;
— через механизмы перегрузки (функций и операций) и виртуальные функции
25. Дано определение класса
monstr(int he, int arm);
monstr(int he=50, int arm=10);
26.Тест. Укажите свойства и методы, доступные внешним функциям
— health, armo
monstr(int he, int arm);
monstr(int he=50, int arm=10);
— * int color;
monstr(int he=50, int arm=10);
— health, armo, color
monstr(int he=50, int arm=10);
BestProg
C++. Классы. Часть 2. Конструктор класса. Особенности использования конструкторов в классах. Конструктор по умолчанию. Параметризированные конструкторы. Примеры классов, содержащих конструкторы
В данной теме рассматривается понятие конструктора на примере unmanaged ( native ) классов. Материалы данной темы также касаются и конструкторов managed- классов.
Содержание
Поиск на других ресурсах:
1. Что называется конструктором класса? Какое назначение конструктора?
Конструктор класса – это специальный метод (функция) класса. Конструктор вызывается при создании объекта класса. Как правило, конструктор используется для:
Конструктор предназначен для формирования экземпляра объекта класса. Имя конструктора класса совпадает с именем класса.
2. В какой момент работы программы осуществляется вызов конструктора класса?
Вызов конструктора осуществляется при создании объекта класса. Конструктор класса вызывается компилятором.
3. Может ли конструктор иметь параметры? Примеры конструкторов с разным количеством параметров
Конструктор может иметь любое количество параметров. Также конструктор может быть без параметров (конструктор по умолчанию).
Объявление класса и его методов имеет вид
Демонстрация вызова конструкторов при объявлении объектов класса
4. Обязательно ли в классе описывать конструктор?
Не обязательно. При создании объекта класса, который не содержит ни одного конструктора, будет вызываться неявно заданный конструктор по умолчанию (default constructor), выделяющий память для объекта класса. Однако, в классе можно объявить собственный конструктор по умолчанию. Такой конструктор называется: явно заданный конструктор по умолчанию.
5. Что такое конструктор по умолчанию ( default constructor )? Примеры
Конструктор по умолчанию – это конструктор класса, который объявляется без параметров. Если класс не содержит явным образом определенный конструктор, тогда при создании объекта автоматически вызывается конструктор по умолчанию. Конструктор по умолчанию просто выделяет память для объекта класса, если он объявляется.
Однако, при создании объекта класса компилятор автоматически вызовет конструктор по умолчанию.
Конструктор по умолчанию автоматически вызовется только тогда, если в классе не объявлено ни одного конструктора. Как только в классе объявить любой другой конструктор с параметрами, то при объявлении
компилятор выдаст ошибку.
Демонстрация вызова явным образом заданного конструктора по умолчанию
6. Сколько конструкторов по умолчанию может иметь класс?
Каждый класс может иметь только один конструктор по умолчанию. Это связано с тем, что в классе не может быть двух методов (функций) с одинаковой сигнатурой.
7. Может ли конструктор возвращать значение?
8. Пример объявления и использования класса, который содержит несколько конструкторов. Реализация типа string в классе
Например, нужно объявить класс, который содержит информацию об имени работника и его возраст.
Реализация конструкторов и деструктора класса
9. Как работает конструктор класса в случае, когда в классе объявлен объект другого класса (подобъект)? Пример
Объявление объекта класса CMyLine
После такого объявления конструкторы вызовутся в следующей последовательности:
10. Как работает конструктор класса в случае, когда создается объект класса, который есть производным (унаследованным) от другого класса?
Если есть два класса, один из которых базовый а другой — унаследованный от базового, то в этом случае последовательность вызовов следующая:
Да, может. Такой конструктор называется приватным конструктором (private constructor).
12. В каких случаях могут создаваться приватные конструкторы?
При объявлении обычного объекта класса, конструкторы, которые размещены в разделе private (приватные конструкторы), есть недоступными.
Чтобы использовать приватные конструкторы, нужно выполнение одного из трех условий:
13. Как будет работать программа, если попробовать создать объект класса, в котором объявлен приватный конструктор по умолчанию?
В этом случае будет ошибка компиляции.
Попытка создать объект класса приведет к ошибке компиляции
То же самое будет, если попробовать создать статический объект
14. Может ли в классе быть объявлено два конструктора, которые принимают одинаковое количество параметров?
Да, может. Однако с условием, что типы параметров будут отличаться. Для класса должно выполняться правило:
Этот вопрос тесно связан с темой перегрузки функций.
15. Какие конструкторы называются параметризованными?
Параметризованный конструктор – это конструктор класса, который имеет параметры.
16. Какие существуют способы инициализации членов объекта с помощью конструктора, который получает один параметр? Пример
Для конструктора, получающего один параметр существует два способа инициализации:
Общий вид объявления класса
Объявить объект класса CMyInt с использованием конструктора с 1 параметром можно двумя способами
Создание объектов и конструкторы
Разбираем основные моменты, связанные с написанием собственных конструкторов классов в Java.
Процесс создания объектов — один из важных аспектов программирования на Java. Под созданием подразумевают как минимум две основные операции: создание нового объекта класса и инициализацию полей объекта.
В этой статье мы рассмотрим:
Программист, преподаватель Skillbox. Пишет про Java.
Что такое конструкторы классов
Следовательно, конструктор класса Cat называется Cat (). В результате работы этого конструктора будет создан новый объект класса Cat. Цель конструктора — правильно инициализировать объект перед его использованием.
Самый простой способ создать объект — это строка вида:
Рассмотрим порядок создания объекта. В этой строке выполняется три действия:
Приведённый выше код можно разбить на две строки:
Выполнять отдельно создание объекта не имеет смысла, так как в таком случае мы не сможем с ним работать — ведь ссылка на него нигде не сохранится.
В первой строке кода переменная murka объявляется как ссылка на объект типа Cat. Здесь важно понять, что объектная переменная фактически не содержит никакого объекта. Значение любой объектной переменной в Java представляет собой ссылку на объект, размещённый в памяти. В данный момент переменная murka пока ещё не ссылается на объект (содержит пустое значение null).
Во второй строке кода создаётся новый объект типа Cat, а ссылка на него присваивается переменной murka. С этого момента переменная murka оказывается ассоциированной с объектом. Чтобы работать с объектами, нужно сначала создать их и задать их исходное состояние. Затем к этим объектам можно применять методы.
Теперь взглянем на код класса Cat (без методов):
Видно, что все объявленные в классе переменные в результате работы конструктора получили значение — объект готов к использованию. Мы можем вызывать различные методы класса, просматривать значение переменных — никаких ошибок не появится.
Важно: Конструкторы имеются у всех классов, независимо от того, определите вы их или нет, поскольку Java автоматически предоставляет конструктор, используемый по умолчанию (без параметров) и инициализирующий все переменные экземпляра их значениями, заданными по умолчанию.
Для справки: Для числовых типов данных значением по умолчанию является нулевое, для типа boolean — логическое значение false, а для ссылочных типов — пустое значение null.
Но как только вы определите свой собственный конструктор, конструктор по умолчанию предоставляться не будет. Следовательно, если мы удалим конструктор из класса Cat и попытаемся создать объект через new Cat (), то объект будет создан, но все переменные в классе получат значения по умолчанию.
Сразу отметим, что полагаться на действия по умолчанию не следует. Если поля инициализируются неявно, программа становится менее понятной.
Как работают параметризованные конструкторы
В предыдущем примере использовался конструктор без параметров, который также называется конструктором по умолчанию. В некоторых случаях этого оказывается достаточно, но зачастую конструктор должен иметь один или несколько параметров. Добавление параметров в конструктор происходит точно так же, как и добавление параметров в метод, — для этого достаточно объявить их в скобках после имени конструктора.
Важно: Класс может иметь несколько различных конструкторов. Они (кстати, как и методы) отличаются между собой количеством, типом и порядком следования параметров. Если в классе несколько конструкторов с разным набором параметров, это называется перегрузкой конструктора.
Например, конструкторы ниже являются разными и вполне могут существовать в одном классе и иметь разную логику:
Заметьте, что конструкторы ниже для компилятора одинаковы и вызовут ошибку при запуске программы (тип, количество и порядок следования параметров идентичны):
Разберём пример применения параметризованного конструктора класса Cat с добавленным полем имени:
Как видно, в этих конструкторах очень много кода повторяется, что в целом не очень удобно и повышает вероятность ошибки: ведь если нам потребуется поменять один конструктор, необходимо будет не забыть внести изменения в другой.
Для этого применяется вызов конструктора из конструктора с использованием ключевого слова this, которое означает ссылку на текущий объект. Обратиться к конструктору из другого конструктора можно через вызов this () — так будет выполнен конструктор без параметров. Если же нужен конструктор с параметрами, их указывают в скобках.
Применять ключевое слово this для вызова другого конструктора очень удобно — нужно лишь один раз написать общий код для конструирования объекта.
Важно: вызов другого конструктора всегда должен стоять первой строкой в конструкторе.
Вот пример оптимизации кода первого из конструкторов:
Обратите внимание: Несколько слов насчёт ключевого слова this. Синтаксис языка Java не запрещает использовать имена параметров или локальных переменных, совпадающие с именами переменных экземпляра (класса). В таком случае говорят, что локальная переменная или параметр скрывает переменную экземпляра. При этом доступ к скрытой переменной экземпляра обеспечивается с помощью ключевого слова this.
Приведённый ниже пример конструктора класса Cat показывает, каким образом лучше выполнять присваивание переданных в конструктор параметров переменным класса:
При выборе имён параметров рекомендую в первую очередь ориентироваться на читаемость кода. Чтобы, взглянув на этот код спустя некоторое время, вы сразу могли понять, что здесь происходит.
Но в целом читаемость кода — это отдельная и довольно обширная тема.
Инициализация полей объекта
Основная задача конструкторов — подготовка объекта к работе с ним и установка значений для полей (переменных) объекта. Но есть и другие варианты установки значения для полей. Это явная инициализация и так называемые блоки инициализации.
Явная инициализация — это возможность присвоить полю соответствующее значение указанным ниже образом:
Здесь присваивание выполняется до вызова конструктора. Такой подход оказывается полезным в тех случаях, когда требуется, чтобы поле имело конкретное значение — независимо от вызова конструктора класса.
Блоки инициализации выглядят так:
Такой блок выполняется каждый раз, когда создаётся объект данного класса. В этом примере начальное значение поля id задаётся в блоке инициализации объекта. Причём неважно, какой именно конструктор используется для создания экземпляра класса. Первым выполняется блок инициализации, а вслед за ним — тело конструктора.
В таком случае блок инициализации будет выполнен при первом обращении к этому классу. Попробуйте выполнить вот такой код:
Что в итоге
При таком многообразии способов инициализации полей класса трудно отследить все возможные пути создания объекта. Поэтому рассмотрим подробнее действия, которые происходят при вызове конструктора:
1. Если в первой строке кода одного конструктора вызывается второй конструктор, то второй конструктор выполняется с предоставляемыми аргументами.
3. Выполняется тело конструктора.
Естественно, код, отвечающий за инициализацию полей, нужно организовать так, чтобы в нём можно было легко разобраться. Например, было бы странным, если бы вызов конструкторов класса зависел от порядка объявления полей. Такой подход чреват ошибками.
Инициализировать статическое поле следует, задавая его начальное значение или используя статический блок инициализации — в случае, если для инициализации статического поля требуется сложный код.
На заметку: важный момент, о котором часто забывают при написании собственных конструкторов, — в конструкторах не должно содержаться никакой бизнес-логики. Их задача — корректное создание объектов и подготовка их к дальнейшему использованию. Вся логика должна находиться в соответствующих методах.
Для изучения — пример, который содержит все элементы, описанные в статье. А именно:
Мы рассмотрели все возможные пути создания объектов и инициализации их полей в Java. Теперь вы сможете создавать свои объекты любым из представленных способов, а также осознанно читать в коде порядок создания объектов других классов.
Конструкторы
Понятие «Конструктор» (constructor) неотделимо от понятия класса. Конструкторы — это специальные функции, вызываемые автоматически при инициализации объектов. Их имена совпадают с именами классов, которым они принадлежат, и они не имеют типа возврата. У одного класса может быть более одного конструктора, различающихся сигнатурами. Конструкторы полезны для инициализации полей класса. Интересно, что компилятор создает конструктор по умолчанию без параметров, он устанавливает поля в 0, false или null (для объектов).
Рассмотрим пример. Создадим класс «Треугольник» с тремя полями и одним методом, вычисляющим его периметр.
Результат выполнения программы: периметр = 0
АНАЛИЗ
В окне ошибок первый раз появляются 3 предупреждения (но не ошибки!):
Полю «Конструктор.Triangle.c» нигде не присваивается значение, поэтому оно всегда будет иметь значение по умолчанию 0 (тоже для полей a и b).
Так как сработал конструктор без параметров Triangle(), то всем сторонам треугольника был присвоен 0. Добавим в определение класса строку: Triangle(); и запустим программу. Получим сообщение об ошибке:
Тип «Конструктор.Triangle» уже определяет член «Triangle» с такими же типами параметров.
Это подтверждает тот факт, что конструктор с нулем параметров уже был создан. Теперь добавим в описание класса конструктор с тремя параметрами:
А в метод Main() первую строку заменим на:
Результат выполнения программы: периметр = 12
То есть, мы выполнили инициализацию полей (a, b, c) объекта tr, на что указывает ключевое слово this в операторах конструктора. Иначе нам бы пришлось указывать разные имена: a = d; где d был бы тогда первым элементом в списке параметров. Оператор типа a = a оставит значение поля a=0, а компилятор выдаст предупреждение:
Проведено присвоение той же переменной; действительно выполнить такое назначение, а не иное?
Практический совет: Не устранив синтаксические ошибки, вы не получите работающую программу. Но иногда предупреждения сигнализируют и о возможных крупных несуразностях вашего кода.
Напомним, что так как по умолчанию поля класса являются закрытыми (private), то их нельзя изменить непосредственно в программе, например:
tr.c = 7;
В этом случае получим сообщение об ошибке:
«Конструктор.Triangle.c» недоступен из-за его уровня защиты.
Ошибка устранится, если к описанию поля с добавим модификатор public:
public int c;
Однако это не является хорошим тоном в ООП, поле перестает быть защищенным.
В отличие от структур классы относятся к ссылочным (reference) типам данных, их экземпляры (объекты) “живут” в куче (heap). Поэтому при создании объекта резервируется для полей место в куче, и в зависимости от конструктора полям задаются значения 0, false или null (для конструктора по умолчанию), либо соответствующие значения (для конструктора с параметрами).
Проверьте на практике правильность следующих утверждений:
1) Можно ли создать конструктор по умолчанию? — Да.
2) Если создается свой конструктор, будет ли компилятор генерировать конструктор по умолчанию? — Нет.
3) Если в своём конструкторе не будут инициализированы некоторые поля, будут ли они автоматически инициализированы компилятором? — Да.
4) Разрешается ли инициализировать переменные там, где их объявляют? — Да.
Пример конструктора при наследовании класса
Воспользуемся готовым классом Random из библиотеки System. Создадим дочерний класс RwName («Random with Name»), добавим в него поле s и два метода, а также модифицируем конструктор класса:
Теперь объект класса получит наименование через конструктор, а два метода класса стали более специфичными. Даже если вы не указали в объявлении класса имя «родителя», он все равно будет наследовать конструктор класса Object.
Статический конструктор
Конструктор можно также объявить как static. Статический конструктор, как правило, используется для инициализации компонентов, применяемых ко всему классу, а не к отдельному экземпляру объекта этого класса. Поэтому члены класса инициализируются статическим конструктором до создания каких-либо объектов этого класса:
Важно, что конструктор типа static вызывается автоматически, причем до конструктора экземпляра. Из этого следует, что статический конструктор должен выполняться до любого конструктора экземпляра. У статических конструкторов отсутствуют модификаторы доступа — они пользуются доступом по умолчанию, а следовательно, их нельзя вызывать из программы.
ВЫВОД
При создании классов путем наследования точнее выбирайте родительский класс. Число конструкторов вашего класса может быть более одного, исходите из соображений вашего удобства их использования.
Оставьте комментарий Отменить ответ
Рекомендую курсы GeekBrains с гарантией трудоустройства:
Факультет Разработки на C#
Научитесь разрабатывать веб-сервисы и приложения, используя C#. Получите практический опыт и реализуете 9 собственных проекта для портфолио.
C# Уровень 2
Глубокое понимание принципов объектно-ориентированного программирования.
C# Уровень 3
Вы научитесь:
Создавать оконные приложения с помощью WPF;
Применять принципы многопоточного и паралельного программирования, технологию TPL;
Эффективно работать с базами данных;
Проходить собеседования на вакансию «Junior C# Developer».