在c++中,我注意到初始化对我来说是一个复杂的主题。我遇到了五种不同的方法来构造一个实例,这让我很困惑。什么时候我必须使用一种方式而不是另一种方式?
class A
{
private:
int x;
float y;
public:
A(int xa, float ya) { x = xa; y = ya; };
};
int main()
{
A a = A(1, 2);
A b = {1, 2};
A c(1, 2);
A d = A{1, 2};
A e{1, 2};
}
就像@Eljay说的,Nicolai Josuttis在《c++中初始化的噩梦》中详细介绍了这一点。
通常花括号初始化是正确的。它可以防止最麻烦的解析和窄化转换。
对于您的示例,这将是
A c{1,2.0};
想到的主要问题是当你想要初始化列表构造函数或n参数构造函数时,它是不明确的:
std::vector<std::size_t> x{100, 30};
std::vector<std::size_t> y(100, 30);
x.size()
是什么?y.size()
吗?我相信x.size()==2
和y.size()==100
。
在这种情况下,我个人会写一个辅助函数来构造同一元素的n个副本的向量,这样我就不必考虑它们之间的细微区别了:
temmplate<class T>
auto vector_of_n_copies(std::size_t n, T) {
auto const v = std::vector<T>(n,T);
assert(v.size()==n);
return v;
}
此外,你应该在构造函数中初始化通过成员初始化:
class A{
int x;
float y;
public:
A(int xa, float ya): x{xa}, y{ya} {}
};
来自c++核心指南,C.49:在构造函数中首选初始化而不是赋值,
原因初始化显式地声明完成了初始化,而不是赋值,并且可以更优雅和有效。防止" use before set "错误。