Вопрос

Я прочитал книгу S. Lippman «Внутри объектной модели C ++», есть ли такой код

class Foo { public: int val; Foo *pnext; };
void foo_bar()
{
// Oops: program needs bar's members zeroed out
Foo bar;
Foo* baz = new Foo(); // this line i added myself
if ( bar.val || bar.pnext )
// ... do something
// ...
}

И он говорит, что «конструктор по умолчанию не синтезируется для этого фрагмента кода.

Глобальные объекты гарантированно будут иметь связанную память «обнуляется» при запуске программы. Локальные объекты, выделенные на стеке программных и объектов Heap, выделенных в свободном магазине, не имеют связанной памяти; Скорее, память сохраняет произвольный битовой шаблон своего предыдущего использования ».

В этом коде объект BAZ был создан в куче, и в соответствии с тем, что было сказано выше, этот объект не является глобальным, и он не будет называться конструктором по умолчанию. Я правильно понимаю?

Это было полезно?

Решение

Клаженки в new Foo() указать инициализация значения; Это в основном означает, что каждый член нулевой инициализирован. Если вместо этого вы сказали new Foo, Затем участники останутся неонициализированными, как и для вашей автоматической переменной.

К сожалению, чтобы инициализировать стоимость автоматической переменной, вы не можете написать Foo bar(), поскольку это объявляет функцию. Вам понадобиться

Foo bar{};        // C++11
Foo bar = Foo();  // Historical C++

Другие советы

Когда вы делаете это:

Foo* baz = new Foo();

Вы динамично выписываете Foo экземпляр и инициализация ценности Это. Для стручков это означает, что участники получают ноль инициализированы. Если вы сказали это (при условии неглобального контекста):

Foo* baz = new Foo;

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

Это также относится к автоматическим случаям хранения:

Foo f0; // default initializaiton: members not zeroed out.
Foo f1 = Foo(); // value initialization: members zeroed out.
Foo f2{}; // C++11 value initialization: members zeroed out.
Foo f3(); // Ooops! Function declaration. Something completely different.

Если у класса нет конструктора по умолчанию (и никакого другого конструктора), компилятор создаст его для вас. Это должно, или вы не сможете создавать экземпляры класса. Однако сгенерированный конструктор по умолчанию ничего не будет делать.

Что добавить пустой набор скобок в new Foo() DO, является значением инициализации выделенного объекта, что означает, что участники инициализируются к своим значениям «по умолчанию», которые равны нулю для целочисленных и плавучих значений, и nullptr для указателей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top