1.4.1. Назначение конструктора

В С++ при определении переменных часто их сразу инициализируют, например:

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(«Петров»);

В последнем случае конструктор задается явно. Заметим, что в классе должен быть один конструктор по умолчанию и один или несколько – с аргументами.