2013-05-21 8 views
2

В C++ 11, может сделать это, чтобы инициализировать объект без использования списка инициализации:Использование конструктора для значения по умолчанию члена

class Z{ 
    int a=0; 
    int b; 
    z():b(0){} //<-- a already initialized 
    }; 

Что мне интересно, это для типов классов, которые из них является предпочтительным:

class Z{ 
    std::vector<int>a=std::vector<int>(); 
    //or instead: 
    std::vector<int>a(); 
    int b; 
    z():b(0){} //<-- a already initialized 
    }; 

ответ

7

Там нет необходимости явно инициализировать по умолчанию a, так как он будет конструктором по умолчанию. Это будет делать хорошо:

class Z 
{ 
    std::vector<int> a; 
    int b = 0; 
    z() {} //<-- a, b already initialized 
}; 

Обратите внимание, что ваш второй вариант является объявлением функции, а не инициализации:

// function a(), returns std::vector<int> 
std::vector<int> a(); 

так, что вы должны были использовать это

// data member a is an std::vector<int>. Default construct it. 
std::vector<int> a{}; 

Конечно, если вам не нужна конструкция по умолчанию, то эта инициализация в точке декларации очень удобна:

std::vector<int> a{0,1,2,3}; 
+0

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

+1

Действительно ли Meyers предлагал явно инициализировать членов, которые имеют совершенно хорошие конструкторы по умолчанию? Это кажется довольно странным советом. Вы уверены, что не думаете о том, чтобы инициализировать вещи в списке инициализаторов (или декларации, в наши дни), а не назначать их в теле конструктора? –

+1

@Fellowshee Наличие класса, такого как 'std :: vector'be по умолчанию, не означает, что он не инициализирован. Если у типа есть конструктор по умолчанию, который устанавливает допустимое состояние, позволяя ему называть неявным образом, мне кажется самым ясным вариантом. – Agentlien

1

Моя рекомендация будет сделать это:

class Z{ 
    std::vector<int> a; 
    int b = 0; 

};

Это кратчайшая версия, а также самая легкая для чтения. Он не добавляет бесполезного беспорядка и делает совершенно очевидным, что вы по умолчанию-конструктор a и инициализируете b до 0.

Смежные вопросы