复制构造函数未被调用,无法理解赋值运算符的工作方式

时间:2015-11-14 18:04:02

标签: c++ c++11 constructor copy-constructor default-constructor

我真的不能想到一个特定的标题,因为我真的不知道怎么说出来。我真的很困惑,因为我之前的问题没有真正得到解答,但只会让我更加困惑。我的另一个question问了

  

在定义期间将std :: string设置为0,将std :: string设置为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

时调用构造函数

1 个答案:

答案 0 :(得分:-3)

通常NULL定义为((void*)0)std::string不知道如何从void *指针构造字符串,std :: basic_string只是没有这样的构造函数。

尝试

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

代替。