复制构造函数没有被调用,麻烦理解赋值操作符如何工作
我真的不能想到一个特定的标题,因为我真的不知道该怎么说。我对此非常困惑,因为我之前的问题没有得到真正的答案,但只会让我更加困惑。我的另一个question问复制构造函数没有被调用,麻烦理解赋值操作符如何工作
定义VS设置的std :: string中的std :: string设置成0比0
用户mnciitbhu说,他在GCC 5.2得到一个错误。我正在使用Microsoft Visual Studio,所以我在Code :: Blocks上试过,并且没有错误。除此之外,我想为自己尝试一下。我有一个类 - Test
class Test {
public:
Test(const Test& T) {
std::cout << "COPY CTOR\n";
}
Test(){
std::cout << "DEFAULT CTOR\n";
}
Test(int NUMBER) {
std::cout << "INT CTOR CALLED\n";
}
};
在我的主要功能,当我做
Test t1 = 5;
t1 = 10;
输出
INT CTOR CALLED
INT CTOR CALLED
现在在那里我得到困惑是当哟你做Test t1 = 5
,另一个问题的用户说它会创建一个临时的Test
,然后调用复制构造函数。这永远不会调用复制构造函数。另外,关于我的另一个问题;当我做了
// text = std::string
text = NULL;
其中一个答案说,它没有工作,因为它没有定义operator=
。我Test
类也从未定义它,但这样做
t1 = 10;
仍然有效,并再次调用构造函数。其他question上的一位用户表示,在这种情况下,它将调用赋值运算符。这并没有,正如你从输出中可以看出的那样。所以,可能有人请解释一下,很详细,为什么
std::string text = NULL;
text = NULL;
给我一个错误,并
Test t1 = 5;
t1 = 10;
作品,并不会调用拷贝构造函数,并调用构造函数的两倍。
实际在做什么=
?为什么它调用构造函数,当我做t1 = 10
通常NULL被定义为((void*)0)
和std::string
没有如何构建从void *指针字符串,性病:: basic_string的根本就没有这样的构造理念。
尝试
std::string text = (const char*)0;
代替。
NULL在C++中定义为整数,而不是指针。你的NULL定义来自C。 – Eugene
'std :: string'可以由'const char *'构造,因此它可以由'NULL'构造。 – juanchopanza
@Eugene'NULL'在技术上是用C和C++定义的。 – Jason
你的例子的输出应该包含'INT CTOR CALLED'而不是'DEFAULT CTOR',错字? – fghj
@ user1034749是的,谢谢你,这是一个错字 –
那么,你的问题是什么?如果你想在你的代码上编译时间错误,可以在你的'Test'构造函数中添加'explicit',就像这样'explicit Test(int NUMBER)' – fghj