В С++ при определении переменных часто их сразу инициализируют, например:
int x=5;
Предположим, что при определении объекта
String s;
мы хотели бы проинициализировать его, например, пустой строкой:
len=0; line[0]=’\0’.
Для структур эта инициализация выполняется так:
String s={“”,0};
Для объектов класса такая инициализация запрещена в силу принципа инкапсуляции.
Поэтому и возникает проблема: внутри описания класса инициализировать нельзя по синтаксису языка, но и вне класса записать
s.len=0; s.line[0]=’\0’;
тоже нельзя, т.к. член-данные из части private недоступны. ( Заметим, что если определить их в части public, то их можно инициализировать таким образом:
String s={«»,0}; т. е. как структуру)
Следовательно, инициализацию должна выполнять специальная член-функция класса.
Определение. Член-функция класса, предназначенная для инициализации член-данных класса при определении объектов класса, называется конструктором. Конструктор всегда имеет имя класса.
Для решения нашей задачи можно записать такой конструктор:
Strring::String(){ len=0;line[0]=’\0’;} (1)
объявив его обязательно в теле класса следующим образом:
String();
Тогда при определении объектов, например
String s1,s2;
он будет всегда вызываться неявно и выполнять инициализацию объектов. Так как конструктор не имеет аргументов, то он называется конструктором по умолчанию.
В классе можно задать не один конструктор, а несколько. Для класса String можно задать конструктор с аргументом, аналогичный функции Fill:
String::String(const char * s)
{{for(len=0;line[len]=s[len];len++);
}
Тогда объекты можно определить таким образом:
String s1,s2(«Иванов»),s3= String(«Петров»);
В последнем случае конструктор задается явно. Заметим, что в классе должен быть один конструктор по умолчанию и один или несколько – с аргументами.