C ++ конструктор по умолчанию для примитивов? - PullRequest
1 голос
/ 28 апреля 2020

Так что я понимаю, что если у меня есть SomeType foo, будет вызван конструктор по умолчанию для SomeType и будет инициализирована foo. Но если у меня есть int x - это не определено в соответствии со спецификацией c. Почему не вызывается конструктор по умолчанию (int())?

Ответы [ 2 ]

4 голосов
/ 28 апреля 2020

Почему не вызывается конструктор по умолчанию (int())?

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

Пояснение:

int x;

не вызывает неопределенного поведения. Использование x без инициализации или явной установки значения является причиной неопределенного поведения.

Один пример

Это позволяет программисту выделять большие куски памяти в качестве буфера, который можно использовать позже для инициализировать объекты, используя размещение new.

char* buffer = new char[SOME_LARGE_BUFFER_SIZE];

и позже

// Construct an object in dynamically allocated memory, buffer.
SomeObject* obj = new (buffer+offset) SomeObject;

Учитывая использование buffer, инициализация каждого элемента buffer не имеет значения для пользователя , Стоимость инициализации таких объектов является ненужной наложением с учетом варианта использования.

1 голос
/ 28 апреля 2020

Ваша интуиция на самом деле права. В ретроспективе int x; неинициализация (а также SomeType foo; может оставить некоторые элементы неинициализированными) является постоянным источником ошибок и ошибок безопасности. Рациональным было, как указал R Саху , «не платить за то, что вам не нужно», что является основной философией C ++. Теперь может показаться смешным, что инициализация локальной переменной int может быть источником проблем с производительностью, особенно с сегодняшними оптимизаторами, но в старые времена это было.

Сегодня все еще существует необходимость в инициализации переменных после того, как они определены (например, подумайте о массивах, которые вам нужно заполнить впоследствии). Но способ, которым это обрабатывается в C ++, неудачен (задним числом).

Лучшим вариантом было бы не допустить неинициализированных переменных, если программист явно не запрашивает их, например:

int x = unitialized; // where uninitialized is a keyword

... опять же, оглядываясь назад * чтобы инициализировать ваши переменные, например, int x{};

(почти) всегда использует auto, что заставляет вас инициализироваться, например, auto x = int{};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...