Что означают следующие фразы в C++:инициализация нуля, значения по умолчанию и значения?

StackOverflow https://stackoverflow.com/questions/1613341

  •  06-07-2019
  •  | 
  •  

Вопрос

Что означают следующие фразы в C++:

  • нулевая инициализация,

  • инициализация по умолчанию и

  • инициализация значения

Что о них должен знать C++-разработчик?

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

Решение

Следует понимать, что «инициализация значений» является новой для стандарта C++ 2003 — ее не существует в исходном стандарте 1998 года (я думаю, что это единственное отличие, которое выходит за рамки пояснения).Видеть Кирилл В.Ответ Лядвинского для определений прямо из стандарта.

См. предыдущий ответ о поведении operator new подробнее о различном поведении этих типов инициализации и о том, когда они срабатывают (и когда они отличаются от C++98 до C++03):

Основная суть ответа:

Иногда память, возвращаемая новым оператором, будет инициализирована, а иногда это не будет зависеть от того, является ли тип, который вы создаете, POD или это класс, который содержит члены POD и использует конструктор по умолчанию, созданный компилятором. .

  • В C++1998 существует два типа инициализации:ноль и по умолчанию
  • В C++2003 был добавлен третий тип инициализации — инициализация значений.

Мягко говоря, это довольно сложно, и когда применяются разные методы, они едва заметны.

Обязательно следует иметь в виду, что MSVC следует правилам C++98 даже в VS 2008 (VC 9 или cl.exe версии 15.x).

В следующем фрагменте показано, что MSVC и Digital Mars следуют правилам C++98, а GCC 3.4.5 и Comeau следуют правилам C++03:

#include <stdio.h>
#include <string.h>
#include <new>

struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m

int main()
{
    char buf[sizeof(B)];
    memset( buf, 0x5a, sizeof( buf));

    // use placement new on the memset'ed buffer to make sure 
    //  if we see a zero result it's due to an explicit 
    //  value initialization
    B* pB = new(buf) B();   //C++98 rules - pB->m is uninitialized
                            //C++03 rules - pB->m is set to 0
    printf( "m  is %d\n", pB->m);
    return 0;
}

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

Стандарт С++ 03 8.5/5:

К инициализация нулями объект типа T означает:
— если T — скалярный тип (3.9), объекту присваивается значение 0 (ноль), преобразованное в T;
— если T является типом класса, не являющимся объединением, каждый нестатический элемент данных и каждый подобъект базового класса инициализируются нулем;
— если T является типом объединения, первый именованный элемент данных объекта инициализируется нулем;
— если T — тип массива, каждый элемент инициализируется нулем;
— если T является ссылочным типом, инициализация не выполняется.

К инициализация по умолчанию объект типа T означает:
— если T не является типом класса POD (пункт 9), вызывается конструктор по умолчанию для T (и инициализация является неправильной, если T не имеет доступного конструктора по умолчанию);
— если T — тип массива, каждый элемент инициализируется по умолчанию;
— в противном случае объект инициализируется нулем.

К инициализировать значение объект типа T означает:
— если T — тип класса (пункт 9) с объявленным пользователем конструктором (12.1), то вызывается конструктор по умолчанию для T (и инициализация является неправильной, если T не имеет доступного конструктора по умолчанию);
— если T является типом класса, не являющимся объединением, без объявленного пользователем конструктора, то каждый нестатический член данных и компонент базового класса T инициализируется значением;
— если T — тип массива, то каждый элемент инициализируется значением;
— в противном случае объект инициализируется нулем

Программа, которая вызывает инициализацию по умолчанию или инициализацию значения объекта ссылочного типа, является неправильной.Если T является типом с указанием cv, для этих определений нулевой инициализации, инициализации по умолчанию и инициализации значения используется неквалифицированная cv версия T.

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