Есть ли у встроенных типов конструкторы по умолчанию? - PullRequest
41 голосов
/ 25 февраля 2011

После прочтения этой статьи я отметил, что int () возвращает 0, потому что временное int является инициализированным значением, а не потому, что int() вызывает конструктор по умолчанию для int. (Статья, согласно моему пониманию, несовершенна.)

Я также сказал, что примитивные (встроенные) типы не имеют конструкторов. Оригинальный автор попросил меня проверить Раздел $ 10.4.2 (TC ++ PL), в котором написано

Встроенные типы также имеют конструкторы по умолчанию ($ 6.2.8)

Но я все еще думаю, что утверждение «C ++ позволяет даже встроенным типам (примитивным типам) иметь конструкторы по умолчанию». имеет недостатки (согласно C ++ 03).

Я думаю, что Бьярне в TC ++ PL смешал «конструктор как нотация, т.е. ()» с фактическим вызовом конструктора. Инициализация значения не была введена в то время, когда Бьярн писал книгу, верно? Так что текст в TC ++ PL некорректен в соответствии с C ++ 98 и C ++ 03?

Что вы, ребята, думаете?

EDIT

Я лично (по почте) спросил Бьярне о некорректном тексте в TC ++ PL, и это был его ответ

Я думаю, что вы путаете "фактические вызовы конструктора" с концептуально имеющим конструктор. Считается, что встроенные типы имеют конструкторы (какие бы слова ни использовались стандартом для описания их поведения).

Ответы [ 3 ]

43 голосов
/ 25 февраля 2011

Простой ответ: Технически нет.

Длинный ответ:

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

int x(5);  // Looks like a constructor. Behaves like one: x is initialized.
int y();   // Fail. Actually a function declaration.
// BUT
int z = int(); // Looks like a constructor. Behaves like a constructor (0 init).

int a(b);  // Again.

Так что технически нет конструкторов для базовых типов POD. Но для всех намерений и целей они действуют так же, как они имеют конструктор копирования и конструктор по умолчанию (при инициализации с фигурными скобками).

Если это похоже на утку и крякает как утка, то это очень похоже на утку.

24 голосов
/ 25 февраля 2011

Конструктор - это функция-член (конструкторы полностью определены в разделе 12 стандарта C ++, который охватывает специальные функции-члены, такие как конструкторы и деструкторы).

Функция-член может быть определена только для типа класса (C ++ 03 9.3 / 1 говорит, что «функции, объявленные в определении класса, за исключением функций, объявленных с помощью спецификатора друга, называются функциями-членами этого класса») .

Таким образом, не относящиеся к классам типы (включая фундаментальные типы, типы массивов, ссылочные типы, типы указателей и типы перечислений) не имеют конструкторов.

У меня нет копии языка программирования C ++ для чтения контекста цитаты, что «встроенные типы также имеют конструкторы по умолчанию», но я бы предположил, что Страуструп использует либо Термин «конструктор» в свободном, нетехническом смысле, или значение термина или способ его использования в Стандарте изменились между тем, когда книга была опубликована, и когда язык был стандартизирован. Я предполагаю, что первое гораздо более вероятно, чем второе.

5 голосов
/ 25 февраля 2011

Как уже отмечали другие, Стандарт противоречит TC ++ PL в нескольких случаях, часто связанных с терминологией.Сам Бьярне Страуструп хорошо суммирует ситуацию:

(...) Однако [TC ++ PL] не является справочным руководством или текстом стандартов.Если вам нужна точная и полная информация на 100%, вам следует обратиться к тексту стандарта ISO C ++. (...)

...