构造实例的最佳实践



在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()==2y.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 "错误。

最新更新