Инструменты пользователя

Инструменты сайта


examination:oop:question32

32. Конструкторы умолчания: назначение, способы задания, программирование

Конструктор по умолчанию является конструктором, вызываемым без аргумента.

	class Name {
		const char* s;
		//...
		};
	class Table {
		Name* p;
		size_t sz;
	public:
		Table (size_t  s=l5) {p=new Name[sz=s]};
		~Table() {delete [] p;}
		Name* lookup(const char*);
		bool insert (Name*);
	};

В приведенном примере, l5 является аргументом по умолчанию, поэтому Table::Table(size_t) является коструктором по умолчанию. Если пользователь объявил конструктор по умолчанию, он и будет задействован. В противном случае (и если пользователь не объявил другие конструкторы) компилятор попытается при необходимости сгенерировать конструктор по умолчанию. Конструктор по умолчанию, сгенерированный компилятором, неявно вызывает конструкторы по умолчанию для членов класса и конструкторы базовых классов. Например:

	struct Tables{
		int i;
		int vi[10];
		Table t1;
		Table vt[10];
	};
 
	Tables tt;

В этом примере переменная tt будет инициализированна сгенерированным конструктором по умолчанию, который вызовет Table[l5] для tt.t1 и каждого элемента tt.vt. С другой стороны, tt.i и элементы tt.vi не проинициализированы, потому что их тип не является классом. Причина различной обработки классов и встроенных типов заключается в совместимости с С и в боязни вызвать дополнительные затраты времени на этапе выполнения.

Так как константы и ссылки должны быть проинициализированны, класс, содержащий члены, являющиеся константами или ссылками, не может быть сконструирован по умолчанию, если только программист не предоставил явно конструктор. Например:

struct X {
		const int a;
		const int& r;
	}
	X x;	// ошибка: нет коструктора по молчанию для Х

Конструкторы по умолчанию можно вызывать явно. Встроенные тины также имеют конструкторы по умолчанию.

examination/oop/question32.txt · Последние изменения: 2014/01/15 12:22 (внешнее изменение)