Конструктор с параметрами это
Конструкторы (Руководство по программированию на C#)
Каждый раз, когда создается класс или структура, вызывается конструктор. Класс или структура может иметь несколько конструкторов, принимающих различные аргументы. Конструкторы позволяют программисту задавать значения по умолчанию, ограничивать число установок и писать код, который является гибким и удобным для чтения. Дополнительные сведения и примеры см. в разделах Использование конструкторов и Конструкторы экземпляров.
Конструкторы без параметров
Если не предоставить конструктор для класса, C# создаст конструктор по умолчанию, который создает экземпляр объекта и задает переменным-членам значения по умолчанию, как показано в статье Значения по умолчанию типов C#. Если не предоставить конструктор для структуры, C# будет использовать неявный конструктор без параметров, чтобы автоматически инициализировать каждое поле значением по умолчанию. Дополнительные сведения и примеры см. в разделе Конструкторы экземпляров.
Синтаксис конструктора
Статические конструкторы
В приведенных выше примерах показаны конструкторы экземпляров, которые создают новый объект. В классе или структуре также может быть статический конструктор, который инициализирует статические члены типа. Статические конструкторы не имеют параметров. Если вы не предоставили статический конструктор для инициализации статических полей, компилятор C# инициализирует статические поля значениями по умолчанию, как показано в статье Значения по умолчанию типов C#.
В следующем примере статический конструктор используется для инициализации статического поля.
Можно также определить статический конструктор с помощью определения тела выражения, как показано в следующем примере.
Дополнительные сведения и примеры см. в разделе Статические конструкторы.
Использование конструкторов (Руководство по программированию на C#)
Каждый раз, когда создается класс или структура, вызывается конструктор. Конструкторы имеют имя, совпадающее с именем класса или структуры, и обычно инициализируют члены данных нового объекта.
В следующем примере класс с именем Taxi определяется с помощью простого конструктора. Затем оператор new создает экземпляр этого класса. Конструктор Taxi вызывается оператором new сразу после того, как новому объекту будет выделена память.
Если класс не является статическим, компилятор C# выделяет классам без конструкторов открытый конструктор без параметров, позволяющий создавать экземпляры классов. Дополнительные сведения см. в статье Статические классы и члены статических классов.
Создание экземпляров класса можно запретить, сделав конструктор закрытым, следующим образом:
Дополнительные сведения см. в разделе Закрытые конструкторы.
Кроме того, объекты на основе structs (включая все встроенные числовые типы) можно инициализировать или назначить, а затем использовать, как в следующем примере:
В связи с этим вызывать конструктор без параметров для типа значения необязательно.
Оба класса и structs могут определять конструкторы, принимающие параметры. Конструкторы, принимающие параметры, необходимо вызывать с помощью оператора new или base. Классы и structs могут определять также несколько конструкторов; для определения конструктора без параметров ни один их них не требуется. Пример:
Этот класс можно создать, воспользовавшись одним из следующих операторов:
Конструктор может использовать ключевое слово base для вызова конструктора базового класса. Пример:
В этом примере конструктор базового класса вызывается перед выполнением соответствующего ему блока. Ключевое слово base можно использовать как с параметрами, так и без них. Любые параметры для конструктора можно использовать как параметры для base или как часть выражения. Дополнительные сведения см. в разделе base.
Применение ключевого слова this в приведенном выше примере привело к вызову конструктора:
Конструкторы могут иметь пометку public, private, protected, internal, protected internal или private protected. Эти модификаторы доступа определяют, каким образом пользователи класса смогут создавать класс. Дополнительные сведения см. в статье Модификаторы доступа.
Конструктор можно объявить статическим, используя ключевое слово static. Статические конструкторы вызываются автоматически непосредственно перед доступом к статическим полям и обычно используются для инициализации членов статического класса. Дополнительные сведения см. в разделе Статические конструкторы.
Спецификация языка C#
Дополнительные сведения см. в разделах Конструкторы экземпляров и Статические конструкторы в Спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
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 параметром можно двумя способами
Конструкторы
Понятие «Конструктор» (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».
Урок №116. Конструкторы
На этом уроке мы рассмотрим конструкторы в языке С++.
Конструкторы
Когда все члены класса (или структуры) являются открытыми, то мы можем инициализировать класс (или структуру) напрямую, используя список инициализаторов или uniform-инициализацию (в C++11):
Однако, как только мы сделаем какие-либо переменные-члены класса закрытыми, то больше не сможем инициализировать их напрямую. Здесь есть смысл: если вы не можете напрямую обращаться к переменной (потому что она закрыта), то вы и не должны иметь возможность напрямую её инициализировать.
Как тогда инициализировать класс с закрытыми переменными-членами? Использовать конструкторы.
Конструктор — это особый тип метода класса, который автоматически вызывается при создании объекта этого же класса. Конструкторы обычно используются для инициализации переменных-членов класса значениями, которые предоставлены по умолчанию/пользователем, или для выполнения любых шагов настройки, необходимых для используемого класса (например, открыть определенный файл или базу данных).
В отличие от обычных методов, конструкторы имеют определенные правила их именования:
конструкторы всегда должны иметь то же имя, что и класс (учитываются верхний и нижний регистры);
Обратите внимание, конструкторы предназначены только для выполнения инициализации. Не следует пытаться вызывать конструктор для повторной инициализации существующего объекта. Хотя это может скомпилироваться без ошибок, результаты могут получиться неожиданные (компилятор создаст временный объект, а затем удалит его).
Конструкторы по умолчанию
Конструктор, который не имеет параметров (или содержит параметры, которые все имеют значения по умолчанию), называется конструктором по умолчанию. Он вызывается, если пользователем не указаны значения для инициализации. Например: