C++, ограничения конструктора

Я изучаю C++, и я не могу понять значение полужирного предложения ниже:

Из руководства IBM:

Следующие ограничения относятся к конструкторам и деструкторам:

  • У конструкторов и деструкторов нет типов возврата, и при этом они не могут возвращать значения.
  • Ссылки и указатели не могут использоваться на конструкторах и деструкторах, потому что их адреса не могут быть взяты.
  • Конструкторы не могут быть объявлены с виртуальным ключевым словом.
  • Конструкторы и деструкторы не могут быть объявлены статичные, константа, или энергозависимые.
  • Объединения не могут содержать объекты класса, которые имеют конструкторов или деструкторы.

Вы могли предоставить мне пример?Спасибо!

10
задан Pie86 3 April 2010 в 13:07
поделиться

3 ответа

Предложение означает, что вы не можете принимать указатель на конструктор или деструктор. Вот пример:

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

Обоснование таково:

  1. Конструктор ничего не возвращает (хотя это может быть функция, возвращающая инициализированный объект). Каким будет тип возвращаемого значения для функции-члена?
  2. Конструктор на самом деле не является функцией-членом в том смысле, что его нельзя вызвать для объекта (например, s.member () ).
  3. Для каждого конструктора и деструктора может быть создано несколько реальных функций. Один конструктор может выделять память, другой - нет (но по-прежнему таким же образом инициализирует члены класса). Один деструктор может уничтожить базовые подобъекты, другой - нет. При каждом вызове ctor / dtor в исходном коде компилятор выбирает для вызова фактический «низкоуровневый» ctor / dtor; этот выбор делается во время компиляции. Это невозможно сделать, если вы вызовете его через указатель.
    Вероятно это означает, что "их адреса не могут быть взяты".
24
ответ дан 3 December 2019 в 14:18
поделиться

Вы не можете создать указатель функции (или ссылку), указывающий на конструктор.

11
ответ дан 3 December 2019 в 14:18
поделиться

Первое предположение состоит в том, что вы не можете создать ссылку или указатель на конструктор / деструктор. Конечно, «ссылка или указатель» в этом случае (если бы они были возможны) имели бы тип «ссылка на член» или «указатель на член», поскольку эти функции-члены не являются статическими. Однако такая интерпретация проблематична по одной причине: в C ++ нет такой вещи, как ссылка на член.

По сути, упоминание «ссылки» в этой интерпретации не имеет никакого смысла: вы не можете иметь ссылку на любую нестатическую функцию-член класса, независимо от того, является ли она конструктор / деструктор или нет. В C ++ такого просто нет.

Если приведенная выше интерпретация верна (как предполагалось в других ответах), более значимой (но все же не префектной) формулировкой будет

  • Указатели не могут использоваться в конструкторах и деструкторах, потому что их адреса не могут быть взяты.

Упоминание «ссылок» в этом контексте не имеет никакого смысла.

1
ответ дан 3 December 2019 в 14:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: