В С++ класс имеет несколько конструкторов. Поскольку мы только знакомимся с классами, все конструкторы сразу описывать не буду. Опишу самый простой: конструктор по умолчанию. Имейте в виду, что кроме конструктора по умолчанию есть другие конструкторы.
Первый и самый логичный вопрос: "Что такое конструктор в C++?".
Определение из Википедии:
В объектно-ориентированном программировании конструктор класса (от англ. constructor, иногда сокращают ctor) — специальный блок инструкций, вызываемый при создании объекта.
Ага, прочитал такое и понял всё сразу, как же. Думаю, мало кому понятно такое определение. Попробовал ещё поискать:
Конструктор C++ — это особый метод, имеющий имя, совпадающее с именем класса.
Конструктор — это помощник инициализации элементов класса для инициализации их внутри класса.
То, что конструктор имеет имя — враньё. У конструктора нет имени. Он как безымяная переменная, у которой есть только тип. Т. е. в синтаксисе С++ для описания конструктора используется тип, где этот тип только собственный класс, пропущенное имя, скобки параметров, скобки кода выполнения. Но мне ради вашего понимания придётся немного поврать в этом. Т. е. будем временно считать, что у конструктора действительно есть имя и оно совпадает с названием класса.
Посмотрим пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//Листинг #1 Конструктор класса Borland C++ 3.1
#include <iostream.h>
#include <conio.h>
classMyClass//Объявили класс MyClass
{
inta;//int a=100; не выйдет, но очень надо/ Для этого и нужен конструктор класса
public:
voidShow()//Функция внутри класса (метод класса)
{
cout<<a;//Метод Show отображает значение а
}
MyClass()//Конструктор. Конструктор всегда имеет то же имя, что и класс
{
cout<<"Wwedi a: ";//Конструктор есть особый метод. В этом примере
cin>>a;//внутри конструктора выводится на экран просьба ввести а и вовнутрь private в a присваивается введенное значение
}
}obj1,obj2,obj3;// 3 объекта типа MyClass
intmain()
{
intt;
clrscr();//Для очистки экрана при первом запуске программы
obj1.Show();//Выполняется вызов объекта. Во время вызова объекта
obj2.Show();//сначала выполняется код конструктора
while(cin.get()!='\n');//Это для того, чтобы нормально сработала пауза. (www.cyberforum.ru/cpp-beginners/thread1260162.html#post6641410)
cin.get();//Ожидаем нажатие Enter
//clrscr(); //После нажатия очищаем экран
}
В общем код достаточно простой, но думаю для начинающих нужен подробный разбор.
Конструкторы в С++ играют роль внедренцев в сам процесс создания объектов. В нашем случае объект объявлен глобально. Процесс создания глобальных объектов выполняется до начала работы функции main, поэтому в данном случае сначала работает сборка объявленного объекта, а только потом потом очистка экрана. Благодаря конструктору можно внедриться в процесс момента создания объекта, обозначив объекту или первичное значение данных, или первичное поведение. Обычно конструкторы используют только для инициализации внутрених для класса данных. По той причне, что очистка экрана выполняется после производства компилятором работ по сборке объекта, первая очистка экрана, из листинга #1, может давать элемент холостого хода: как будто бы не работает. По той же причине очистку экрана глобального объекта лучше делать после объявления глобальных объектов.
В С++ имя конструктора должно совпадать с именем класса.
Допускается использовать несколько конструкторов с одинаковым именем, но различными параметрами.
Конструктор по умолчанию — это конструктор с пустым списком параметров, т. е. с пустыми круглыми скобками.
Конструктором по умолчанию может быть любой конструктор, каждый параметр которого имеет аргумент по умолчанию.
С этого момента считаем, что заблуждались, но осознали, что у конструктора нет имени.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Конструктор класса Листинг #2.1 clang
#include <iostream>
usingnamespacestd;
classMyClass{
public:
MyClass(){//<-- если пустые круглые скобки, то конструктор по умолчанию
cout<<"MyClass ctor"<<'\n';
}
};
intmain(){
MyClass obj1;//<-- конструктор по умолчанию может быть вызван так
}
Конструктор по умолчанию срабатывает в момент объявления объекта, если объекту не указывать скобок. Это отображено в листинге #2.1. Только не запутайтесь: в описании класса куглые скобки есть, в объявлении объекта их нет.
Есть вариант ошибиться и использовать для вызова конструктора по умолчанию круглые скобки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//Конструктор класса Ошибка! Листинг #2.2 clang
#include <iostream>
usingnamespacestd;
classMyClass{
public:
MyClass(){
cout<<"MyClass ctor"<<'\n';
}
MyClass(constintx=200){
cout<<"MyClass ctor()"<<'\n';
}
};
intmain(){
MyClass obj1();//Объявление функции obj1 с возвращаемым типом MyClass
intfoo();//это как если так
}
Показанная ошибка может встречаться у некоторых новичков. Запомните, что конструктор по умолчанию для своего запуска пустых круглых скобок не требует. С пустыми круглыми скобками мы получаем объявление функции, возвращающей объект, тип которого указанный класс.
cout<<obj1();//Используем функцию, описанную в любом месте программы
}
intobj1(){
return100;
}
В общем, постарайтесь не угодить в такую ловушку.
Обычно конструкторы класса помещают в public.
C++
1
2
3
4
5
6
7
classMyClass//Объявили класс
{//Начало класса
public://Всё что в public доступно по всей программе
MyClass()//Конструктор класса MyClass
{
}
};//Конец класса. Обязательно оканчивается точкой с запятой
Конструктор схож с методом, но отличается от метода тем, что нет у него имени и он не возвращает никакого типа, даже void не возвращает. На всякий случай напомню, что методами часто называют функции, описанные внутри класса.
Резюмируем наиболее важное и даю знать то, о чём написано не было:
Прямая инициализация элементов класса при описании класса не допускается. (В современном С++, кажется с С++11 этот момент изменён, стало можно)
Конструктор — это помощник инициализации элементов класса для инициализации их внутри класса.
Конструктор класса предназначен для присваивания начального значения элементу класса вовнутрь класса.
Конструктор — специальный вид инструкций, вызываемый во время создания объекта.
Конструктор выполняется только один раз. В момент создания объектов.
Конструктор не имеет имени, но создаётся видимость, что его имя — название класса.
Конструктор автоматически вызывается при создании объекта (создании экземпляра класса).
Конструктор никогда не возвращает значение.
Если в классе есть static переменная (или объект), то такой объект будет сконструирован до функции main, также до начала работы функции main будет сконструирована глобальная переменная (или глобальный объект).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
usingnamespacestd;
classM1{
public:
staticintx;//конструируется до main (static переменная класса)
inty;//конструируется после начала работы main (non-static переменная класса)
};
M1a;//Конструируетс до main (глобальный объект a)
intmain()
{
M1b;//Конструируется уже после запуска main (глобальный объект b)
}
Есть несколько разновидностей конструкторов.
Обычно конструкторы описывают в public секции класса. Но есть случаи, когда их закрывают в private
C++
1
2
3
4
5
6
7
classMyClass//Объявили класс
{//Начало класса
public://Все что в public доступно по всей программе
MyClass()//Конструктор класса MyClass
{
}
};//Конец класса. Обязательно оканчивается точкой с запятой
14 комментариев на «“С++ для начинающих Конструктор Класса”»
Когда-то я где-то такое прочитал, именно так и было написано, но это не так и будет исправлено.
Вот так написано в стандарте в русском переводе:
3.6.1. Функция main
main function
1 Программа должна содержать глобальную функцию с именем main, которая обозначает начало программы. Требуется ли, чтобы во freestanding-окружении программа содержала описание функции main, зависит от реализации.
Замечание. В независимом окружении (комментарий: см 1.4, §7 ■ ) действия перед стартом программы и при ее завершении считаются зависящими от реализации; действия перед стартом включают выполнение конструкторов из области действия пространства имен со статическим классом памяти; завершение включает выполение деструкторов для объектов со статическим классом памяти. ■
Если говорить проще, то "Если в классе есть static переменная (или объект), то такая переменная (или такой объект) будут сконструированы до начала работы функции main, также до начала работы функции main будет сконструирована глобальная переменная (или глобальный объект)".
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
usingnamespacestd;
classM1{
public:
staticintx;//конструируется до main (static переменная класса)
inty;//конструируется после начала работы main (non-static переменная класса)
};
M1a;//Конструируетс до main (глобальный объект a)
intmain()
{
M1b;//Конструируется уже после запуска main (глобальный объект b)
Очень хорошо описанно!Спасибо.
супер! то что надо!
И правда супер! Огромное спасибо, очень помогло…
Супер, спасибо большое!)
Мне одному кажется или Админы на сайте вырезают все плохие коменты?
На самом деле все очень доступно описано специально для такого как я жирного нечего несмыслящего парня. СПАСИБО!!!
Вы — СУПЕР!!!
невозможно обратиться к private член, объявленному в классе
Конструктор – специальный вид инструкций, вызываемый во время вызова объекта
как я понимаю правильнее : «вызываемый во время создания объекта»
Да. Спасибо.
И правда супер! Огромное спасибо, очень помогло…
Скажите насколько точно это утверждение :
Объекты конструируются до входа в функцию main();
Я взял его в заключении главы. Я создаю объекты в main()
Когда-то я где-то такое прочитал, именно так и было написано, но это не так и будет исправлено.
Вот так написано в стандарте в русском переводе:
Если говорить проще, то "Если в классе есть static переменная (или объект), то такая переменная (или такой объект) будут сконструированы до начала работы функции main, также до начала работы функции main будет сконструирована глобальная переменная (или глобальный объект)".
до этого урока всё было понятно, а в этом уроке ничего не понял! 👿
Конструктор класса служит для предварительной записи значений в объект класса. Это неясно?