使用默认构造函数初始化变量

时间:2015-08-29 20:57:42

标签: c++ initialization

问题:

以下初始化之间是否存在差异?

(A)第二个究竟在做什么?

(B)一个比另一个更有效吗?

int variable = 0;
int variable = int();

此问题也适用于其他数据类型,例如std :: string:

std::string variable = "";
std::string variable = std::string();

背景

当我试图清空一个字符串流时,我基本上得到了here(接受答案的第二个代码示例)的想法。 当我开始学习类时,我还必须开始使用它,并意识到成员变量初始化必须在构造函数中完成,而不仅仅是在头文件中定义它。例如,初始化矢量:

// Header.h
class myClass
{
 private:
      std::vector<std::string> myVector;
};

// Source.cpp
myClass::myClass()
{
    for (int i=0;i<5;i++)
    {
         myVector.push_back(std::string());
    }
}

任何明确的信息都将非常感谢!

2 个答案:

答案 0 :(得分:0)

修改

再次阅读后,我意识到你明确地询问了默认构造函数,而我提供了很多带有1参数构造函数的例子。

对于Visual Studio C ++编译器,以下代码仅执行默认构造函数,但如果复制构造函数是显式定义的,它仍会抱怨,因为永远不会调用复制构造函数这样。

#include <iostream>
class MyInt {
public:
    MyInt() : _i(0) {
        std::cout << "default" << std::endl;
    }
    MyInt(const MyInt& other) : _i(other._i) {
        std::cout << "copy" << std::endl;
    }
    int _i;
};
int main() {
    MyInt i = MyInt();

    return i._i;
}

原始(错字修正)

对于int变量,表单之间没有区别。

具有1参数构造函数的自定义类也接受赋值初始化,除非构造函数标记为explicit,然后构造函数调用Type varname(argument)是必需的,并且赋值会产生编译器错误。

参见以下不同变体的示例

class MyInt1 {
public:
    MyInt1(int i) : _i(i) { }
    int _i;
};
class MyInt2 {
public:
    explicit MyInt2(int i) : _i(i) { }
    int _i;
};
class MyInt3 {
public:
    explicit MyInt3(int i) : _i(i) { }
    explicit MyInt3(const MyInt3& other) : _i(other._i) { }
    int _i;
};
int main() {
    MyInt1 i1_1(0); // int constructor called
    MyInt1 i1_2 = 0; // int constructor called

    MyInt2 i2_1(0); // int constructor called
    MyInt2 i2_2 = 0; // int constructor explicit - ERROR!
    MyInt2 i2_3 = MyInt2(0); // int constructor called

    MyInt3 i3_1(0); // int constructor called
    MyInt3 i3_2 = 0; // int constructor explicit - ERROR!
    MyInt3 i3_3 = MyInt3(0); // int constructor called, copy constructor explicit - ERROR!
}

答案 1 :(得分:-3)

之间的主要区别如下: int i = int();int i = 0; 是使用默认构造函数,如int()string()等,除非重载/重写,将设置变量等于NULL,而几乎所有其他形式的实例化和声明变量需要某种形式的值赋值,因此不是NULL而是特定值。

就我的效率知识而言,两者都不是“更好”。