Пространства имён
Варианты
Действия

Инициализация нулём

Материал из cppreference.com
< cpp‎ | language
 
 
 
 

Задаёт нулевое начальное значение объекта.

Содержание

[править] Синтаксис

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

static T объект ;(1)
T () ;

T t = {} ;

T {} ; (начиная с C++11)

(2)
CharT массив [ n ] = " короткая-последовательность ";(3)

[править] Объяснение

Инициализация нулём выполняется в следующих случаях:

1) Для каждой именованной переменной со статической или локальной для потока (начиная с C++11) длительностью хранения, которая не подлежит константной инициализации перед любой другой инициализацией.
2) Как часть последовательности инициализации значением для неклассовых типов и для элементов, инициализированных значением классовых типов, не имеющих конструкторов, включая инициализацию значением элементов агрегатов, для которых не заданы инициализаторы.
3) Когда массив любого символьного типа инициализируется строковым литералом меньшего размера, то оставшиеся элементы массива инициализируются нулями.

Эффекты инициализация нулём:

  • Если T является типом объединения:
  • все биты заполнения инициализируются нулевыми битами, и
  • первый нестатический именованный элемент данных объекта инициализируется нулём.
  • Если T является типом массива, каждый элемент инициализируется нулями.
  • Если T является ссылочным типом, ничего не делается.

[править] Примечания

Как описано в нелокальной инициализации, статические и локальные в потоке (начиная с C++11) переменные, которые не инициализируются константами, инициализируются нулями до того, как произойдет любая другая инициализация. Если в определении неклассовой нелокальной переменной не указан инициализатор, то инициализация по умолчанию не делает ничего, оставляя результат предыдущей нулевой инициализации неизменённым.

Указатель, инициализированный нулём, является значением нулевого указателя своего типа, даже если значение нулевого указателя не является целочисленным нулём.

[править] Пример

#include <iostream>
#include <string>
 
struct A
{
    int a, b, c;
};
 
double f[3];   // инициализация нулём тремя значениями 0.0
 
int* p;        // инициализация нулём нулевым значением указателя
               // (даже если значение не целочисленный 0)
 
std::string s; // инициализация нулём неопределённым значением, затем
               // инициализация по умолчанию значением "" конструктором
               // по умолчанию std::string
 
int main(int argc, char*[])
{
    delete p; // безопасно удаляется нулевой указатель
 
    static int n = argc; // инициализируется нулём значением 0, затем инициализируется
                         // копированием argc
    std::cout << "n = " << n << '\n';
 
    A a = A(); // эффект такой же как: A a{}; или A a = {};
    std::cout << "a = {" << a.a << ' ' << a.b << ' ' << a.c << "}\n";
}

Возможный вывод:

n = 1
a = {0 0 0}

[править] Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

НомерПрименёнПоведение в стандартеКорректное поведение
CWG 277C++98указатели могут быть инициализированы неконстантным
выражением со значением 0, которое не является константой
нулевого указателя
должны инициализироваться целочисленным
константным выражением со значением 0
CWG 694C++98инициализация нулём для классовых типов игнорирует
заполнение
заполнение инициализируется нулевыми
битами
CWG 903C++98инициализация нулём для скалярных типов устанавливает
начальное значение в значение, преобразованное из
целочисленного константного выражения со значением 0
объект инициализируется значением,
преобразованным из целочисленного
литерала 0
CWG 2026C++98было указано, что инициализация нулём всегда происходит
первой, даже до константной инициализации
нет инициализации нулём, если применяется
константная инициализация
CWG 2196C++98инициализация нулём для классовых типов игнорирует
подобъекты базового класса
они также инициализируются нулями
CWG 2253C++98было неясно, применяется ли инициализация нулём к
безымянным битовым полям
применяется (все биты заполнения
инициализируются нулевыми битами)

[править] Смотрите также