gpt4 book ai didi

c++ - 复制构造函数和=运算符有什么区别

转载 作者:太空宇宙 更新时间:2023-11-04 16:20:29 27 4
gpt4 key购买 nike

我写了一个简单的代码,我的问题是:为什么item_base只调用constrcut函数?item_base应该调用“复制构造函数”吗?我观察到当我创建item_base2时,它调用“复制构造函数”,但item_base没有调用“复制构造函数”。有什么区别?

class Item_base {
public:
Item_base();
Item_base(int);
Item_base(const Item_base &base);
void operator=(const Item_base &item);
virtual ~Item_base();
};

Item_base::Item_base()
{
cout << "construct function" << endl;
}

Item_base::Item_base(int a)
{
cout << "arg construct function" << endl;
}
Item_base::Item_base(const Item_base &base)
{
cout << "copy function" << endl;
}

void Item_base::operator=(const Item_base &item)
{
cout << "= operator" << endl;
}

Item_base::~Item_base()
{
}


int main()
{
//cout << "Hello world!" << endl;
Item_base item_base = Item_base(1);//construct function
Item_base item_base2 = item_base;//copy construct function
Item_base item_base3;
item_base3 = item_base2;// =operator function
return 0;
}

最佳答案

它被称为“复制省略”或“复制构造函数省略”。 C++ 标准允许实现省略某些拷贝。从临时对象 Item_base(1) 到变量 item_base 的拷贝就是这样一个拷贝。

这同样适用于 C++11 中的移动。

因此,当您定义 item_base 时,在您的实现中它只是使用参数 1 构造的,而不是构造一个临时对象然后复制。所有有值(value)的编译器都实现了复制省略,尽管如果您使用编译器选项禁用它,您会看到这里调用了两个构造函数。

当您定义 item_base2 时,必须复制 item_base,因为没有其他方法可以初始化 item_base2

当您定义 item_base3 时,它是在没有参数的情况下构造的。

当您分配给 item_base3 时,它已经存在,因此当然没有构造。调用赋值运算符。

关于c++ - 复制构造函数和=运算符有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17316272/

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