直接初始化与基元的复制初始化

时间:2011-08-17 11:06:24

标签: c++ initialization variable-assignment primitive

初始化基本类型(如int或指针)时,可以使用复制初始化直接初始化

int a = 10;
int b(10);

虽然后一种方法是为带有构造函数的对象提供的,但我没有看到人们将它用于基元。我知道使用'='运算符会更“自然”(特别是数字),但有人在现实代码中编写代码:

for (int i(0); i < 5; ++i) {
    cout << i << endl;
}

感谢。

编辑:问题是关于编码风格和最佳实践,而不是技术实现。

4 个答案:

答案 0 :(得分:2)

两者都是使用复制构造函数进行初始化,即使第一个看起来像赋值。这只是语法糖。

您可以使用在复制构造中打印出某些内容的类以及在分配时不同的内容轻松地检查它。

而作为一个原始的int甚至没有发挥作用。

答案 1 :(得分:2)

有些人这样做是为了保持一致。

在模板中,代码可以是

for (T i(0); i < 5; ++i) {
    cout << i << endl;
}

并且以任何方式编写它将使编码风格保持一致。

答案 2 :(得分:1)

我曾经有同事这样做:

for (int i(0); i < 5; ++i) {
    cout << i << endl;
}

它真的让所有人生气。使用i = 0而不是i(0)阅读代码要容易得多。也许不是在这个例子中,但作为一般规则,它是。

即使对于复杂的对象,我总是更喜欢i = 0样式,它对读者来说感觉更自然,任何体面的编译器都会优化生成的代码,因此几乎没有性能损失。

答案 3 :(得分:1)

我更喜欢i = 0样式,它更容易阅读,你也可以像这样使用它:

if (int i = some_function())
{
}

使用指针工作也很好,所有其他类型都可以转换为bool:

if (const int* p = some_function())
{
}

if (shared_ptr<const int> q = some_function())
{
}