Обновление: Я смотрю, есть ли способ ноль-инициализировать весь класс сразу, потому что технически можно забыть добавить «= 0
» или «{}
» после каждого члена. В одном из комментариев упоминается, что явно дефолтный аргумент no-arg будет включить нулевую инициализацию во время инициализации значения формы MyClass c{};
. Глядя на http://en.cppreference.com/w/cpp/language/value_initialization У меня возникли проблемы с выяснением, какое из утверждений указывает это.Как убедиться, что ваш объект инициализирован нолем?
Инициализация - сложная тема, поскольку C++ 11 изменил значение и синтаксис различных конструкций инициализации. Я не смог собрать достаточно хорошую информацию об этом из других вопросов. Но см., Например, Writing a Default Constructor Forces Zero-Initialization?.
Конкретная проблема, с которой я столкнулся, заключается в следующем: я хочу, чтобы члены моих классов были обнулены как для классов (1), объявляющих по умолчанию c-tor, так и для (2) тех, которые этого не делают.
Для (2) инициализация с помощью {}
выполняет эту работу, потому что это синтаксис инициализации значения, который преобразуется в нулевую инициализацию или агрегирует инициализацию, если ваш класс является совокупным случаем, в котором члены, для которых нет инициализатора (все!) ноль-инициализированы.
Но для (1) Я все еще не уверен, какой был бы лучший подход. Из всей информации, которую я собираю, я узнал, что , если вы предоставили по умолчанию c-tor (например, для установки некоторых членов на некоторые значения), вы должны явно нулевать остальные элементы, иначе синтаксис MyClass c = MyClass();
или C++ 11 MyClass c{};
не будет сделайте работу. Другими словами, инициализация значения в этом случае означает просто вызов вашего c-tor, и это все (без нуля).
Вы сталкиваетесь с той же ситуацией, если вы объявляете c-tor, который принимает значения, и устанавливает эти значения в подмножество членов, но вы хотите, чтобы другие члены были обнулены: нет сокращений для делая это - я думаю о 3 вариантах:
class MyClass
{
int a;
int b;
int c;
MyClass(int a)
{
this->a = a;
// now b and c have indeterminate values, what to do? (before setting 'a')
// option #1
*this = MyClass{}; // we lost the ability to do this since it requires default c-tor which is inhibited by declaring this c-tor; even if we declare one (private), it needs to explicitly zero members one-by-one
// option #2
std::memset(this, 0, sizeof(*this)); // ugly C call, only works for PODs (which require, among other things, a default c-tor defaulted on first declaration)
// option #3
// don't declare this c-tor, but instead use the "named constructor idiom"/factory below
}
static MyClass create(int a)
{
MyClass obj{}; // will zero-initialize since there are no c-tors
obj.a = a;
return obj;
}
};
Является ли это моим правилом? Какой из 3 вариантов будет вы выбрать?
'class MyClass {int a = 0; int b = 0; int c = 0;/* ваши конструкторы * /}; '. Это может быть агрегатом с C++ 14. –
* ", даже если мы объявим один (закрытый), ему необходимо явно обнулить элементы по одному" * Нет, если вы по умолчанию это '= default'. – dyp
@dyp Из того, что я знаю, дефолтный не-arg-c-tor не будет обнулять членов? – haelix