gpt4 book ai didi

c++ - 复制构造函数和赋值运算符

转载 作者:太空狗 更新时间:2023-10-29 19:41:14 24 4
gpt4 key购买 nike

我编写了以下程序来测试何时调用复制构造函数以及何时调用赋值运算符:


#include

class Test
{
public:
Test() :
iItem (0)
{
std::cout << "This is the default ctor" << std::endl;
}

Test (const Test& t) :
iItem (t.iItem)

{
std::cout << "This is the copy ctor" << std::endl;
}

~Test()
{
std::cout << "This is the dtor" << std::endl;
}

const Test& operator=(const Test& t)
{
iItem = t.iItem;
std::cout << "This is the assignment operator" << std::endl;
return *this;
}

private:
int iItem;
};

int main()
{
{
Test t1;
Test t2 = t1;
}
{
Test t1;
Test t2 (t1);
}
{
Test t1;
Test t2;
t2 = t1;
}
}


这会产生以下输出(只是添加了空行以使其更易于理解):

doronw@DW01:~$ ./testThis is the default ctorThis is the copy ctorThis is the dtorThis is the dtorThis is the default ctorThis is the copy ctorThis is the dtorThis is the dtorThis is the default ctorThis is the default ctorThis is the assignment operatorThis is the dtorThis is the dtor

第二组和第三组的行为符合预期,但在第一组中,即使使用了赋值运算符,也会调用复制构造函数。

这种行为是 C++ 标准的一部分还是只是一个聪明的编译器优化(我使用的是 gcc 4.4.1)

最佳答案

第一个测试用例中没有使用赋值运算符。它只是使用称为“复制初始化”的初始化形式。复制初始化在初始化对象时不考虑显式构造函数。

struct A {
A();

// explicit copy constructor
explicit A(A const&);

// explicit constructor
explicit A(int);

// non-explicit "converting" constructor
A(char const*c);
};

A a;
A b = a; // fail
A b1(a); // succeeds, "direct initialization"

A c = 1; // fail, no converting constructor found
A d(1); // succeeds

A e = "hello"; // succeeds, converting constructor used

复制初始化用于那些对应于隐式转换的情况,在这种情况下,不会显式启动转换,如函数参数传递和从函数返回。

关于c++ - 复制构造函数和赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2027873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com