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

Copy constructor not being called, trouble understanding how the assignment operator works

本文关键字:赋值运算符 方式 工作 构造函数 调用 复制      更新时间:2023-10-16

我真的想不出一个具体的标题,因为我真的不知道如何用词。我真的很困惑,因为我之前的问题没有得到真正的答案,只会让我更加困惑。问了我另一个问题

在定义过程中将std::string设置为0与将std::字符串设置为0

用户mnciitbhu表示,他在GCC 5.2上遇到了一个错误。我使用的是Microsoft Visual Studio,所以我在代码::块上进行了尝试,没有出现任何错误。除此之外,我还想亲自尝试一下。我有一个类-Test

class Test {
public:
    Test(const Test& T) {
        std::cout << "COPY CTORn";
    }
    Test(){
        std::cout << "DEFAULT CTORn";
    }
    Test(int NUMBER) {
        std::cout << "INT CTOR CALLEDn";
    }

};

在我的主要功能中,当我进行时

Test t1 = 5;
t1 = 10;

输出是

INT CTOR CALLED

INT CTOR CALLED

现在我感到困惑的是,当你执行Test t1 = 5时,另一个问题上的用户说它将创建一个临时Test,然后调用复制构造函数。这从不调用复制构造函数。此外,关于我的另一个问题;当我做的时候

 // text = std::string
 text = NULL;

其中一个答案说它不起作用,因为它没有定义operator=。我的Test类也从未定义过它,但正在进行

t1 = 10;

仍然有效,并再次调用构造函数。另一个问题的一个用户说,在这种情况下,它调用赋值运算符。从输出中可以看出,这并没有。那么,有人能详细解释一下的原因吗

std::string text = NULL;
text = NULL;

给我一个错误,

Test t1 = 5;
t1 = 10;

有效,并且不调用复制构造函数,并且调用构造函数两次。

=实际在做什么?为什么当我执行t1 = 10 时它会调用构造函数

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

尝试

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

相反。