复制构造函数没有被调用,麻烦理解赋值操作符如何工作

问题描述:

我真的不能想到一个特定的标题,因为我真的不知道该怎么说。我对此非常困惑,因为我之前的问题没有得到真正的答案,但只会让我更加困惑。我的另一个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

+0

你的例子的输出应该包含'INT CTOR CALLED'而不是'DEFAULT CTOR',错字? – fghj

+0

@ user1034749是的,谢谢你,这是一个错字 –

+0

那么,你的问题是什么?如果你想在你的代码上编译时间错误,可以在你的'Test'构造函数中添加'explicit',就像这样'explicit Test(int NUMBER)' – fghj

通常NULL被定义为((void*)0)std::string没有如何构建从void *指针字符串,性病:: basic_string的根本就没有这样的构造理念。

尝试

std::string text = (const char*)0; 

代替。

+0

NULL在C++中定义为整数,而不是指针。你的NULL定义来自C。 – Eugene

+0

'std :: string'可以由'const char *'构造,因此它可以由'NULL'构造。 – juanchopanza

+0

@Eugene'NULL'在技术上是用C和C++定义的。 – Jason