问题:
以下初始化之间是否存在差异?
(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());
}
}
任何明确的信息都将非常感谢!
答案 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
而是特定值。
就我的效率知识而言,两者都不是“更好”。