C ++, ограничения конструктора - PullRequest
10 голосов
/ 03 апреля 2010

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

Из Руководство IBM :

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

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

Не могли бы вы привести пример? Спасибо!

Ответы [ 4 ]

24 голосов
/ 03 апреля 2010

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

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 для вызова; этот выбор сделан во время компиляции. Это невозможно сделать, если вы вызываете его через указатель.
    Вероятно, это - это то, что подразумевается под "их адреса не могут быть взяты".
11 голосов
/ 03 апреля 2010

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

1 голос
/ 03 апреля 2010

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

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

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

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

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

0 голосов
/ 23 января 2014

они не могут быть статическими или виртуальными

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...