С++, ограничения конструктора
Я изучаю С++, и я не могу понять смысл жирного текста ниже:
Из Руководство IBM:
К конструкторам и деструкторам применяются следующие ограничения:
- Конструкторы и деструкторы не имеют типов возврата и не могут возвращать значения.
- Ссылки и указатели нельзя использовать для конструкторов и деструкторов, потому что их адреса не могут быть приняты.
- Конструкторы не могут быть объявлены с помощью ключевого слова virtual.
- Конструкторы и деструкторы не могут быть объявлены как static, const или volatile.
- Союзы не могут содержать объекты класса, которые имеют конструкторы или деструкторы.
Не могли бы вы привести мне пример?
Спасибо!
Ответы
Ответ 1
Предложение означает, что вы не можете взять указатель на конструктор или деструктор. Вот пример:
class Sample{
private: int x;
public: Sample() { x = 100; };
public: void* member() { x = 200; };
};
template <class X>
void call_me(Sample s, X function){
(s.*function)();
};
call_me(s, &Sample::member); //valid
call_me(s, &Sample::Sample); //invalid
call_me(s, &Sample::~Sample); //invalid
Обоснование таково:
- Конструктор ничего не возвращает (хотя можно подумать о функции, которая возвращает инициализированный объект). Каким будет тип возврата в качестве функции-члена?
- Конструктор на самом деле не является функцией-членом в том смысле, что он не может быть вызван на объект (например,
s.member()
).
- Может быть создано несколько фактических функций для каждого конструктора и деструктора. Один конструктор может выделять память, а другой может (но все же инициализировать члены класса одинаковым образом). Один деструктор может уничтожить базовые подобъекты, а другой - нет. В каждом вызове ctor/dtor в исходном коде компилятор выбирает фактический "низкий уровень" ctor/dtor для вызова; этот выбор выполняется во время компиляции. Это невозможно сделать, если вы вызываете его с помощью указателя.
Возможно, это означает, что "их адреса не могут быть приняты".
Ответ 2
Вы не можете сделать указатель на функцию (или ссылку), указывающий на конструктор.
Ответ 3
Первое предположение заключается в том, что вы не можете создать ссылку или указатель на конструктор/деструктор. Разумеется, "ссылка или указатель" в этом случае (если бы они были возможны) имела бы тип "ссылка на член" или "указатель-член", поскольку эти функции-члены не являются статическими. Однако эта интерпретация является проблемой по одной причине: в С++ нет такой вещи, как ссылка на член.
В принципе, упоминание "ссылки" в этой интерпретации не имеет никакого смысла: вы не можете иметь ссылку на любую нестатическую функцию-член класса, независимо от того, является ли это конструктором/деструктором или нет. В С++ просто нет такой вещи.
Если приведенная выше интерпретация верна (как и другие ответы), более значимая (но еще не префектная) формулировка будет
- Указатели нельзя использовать для конструкторов и деструкторов, потому что их адреса не могут быть приняты.
Упоминание "ссылок" в этом контексте не имеет никакого смысла.
Ответ 4
они не могут быть статическими или виртуальными