当我对具有复制构造函数但没有赋值运算符的对象进行赋值时会发生啥?

Posted

技术标签:

【中文标题】当我对具有复制构造函数但没有赋值运算符的对象进行赋值时会发生啥?【英文标题】:What happens when I make a assignment to object which has copy constructor but no assignment operator?当我对具有复制构造函数但没有赋值运算符的对象进行赋值时会发生什么? 【发布时间】:2014-11-23 00:12:29 【问题描述】:

当我对具有复制构造函数但没有赋值运算符的对象进行赋值时会发生什么? 它会调用编译器的赋值运算符,执行成员复制吗?

【问题讨论】:

用一些调试语句测试它:) 复制:***.com/questions/4172722/what-is-the-rule-of-three 【参考方案1】:

所有类都有一个赋值运算符,除非你明确删除它(在 C++11 之前不可能)。如果您不提供自己的实现,编译器会为您提供一个。

这就是 rule of three 背后的主要原因:如果您有一个复制构造函数,那么几乎可以肯定您还需要一个赋值运算符和一个析构函数。

【讨论】:

【参考方案2】:

复制构造函数在赋值中不起作用,默认的赋值运算符将被调用,它将对内置类型成员进行按位复制,并对 class 类型的对象成员调用赋值运算符。

【讨论】:

但是如果你像ClassName a; ClassName b = a;这样进行赋值,将会调用一个拷贝构造函数 @Kastaneda 这不是作业,而是复制结构。仅仅因为语法使用= 标记并不能使其成为赋值。 是的,从技术上讲你是对的。我写它是因为(例如在俄罗斯论坛上)开始学习 C++ 的人经常对这些概念之间的差异感到困惑。 @Kastaneda 你错了(你在技术上是错的,因为我们正在讨论技术问题)称之为作业:“如果你做这样的作业”,它(技术上)是一个 复制初始化将使用复制构造函数。 是的,我知道。这是一个术语问题,我只是学英语,不能准确表达。【参考方案3】:

是的,如果您不提供,您将通过编译器访问默认的赋值运算符生成器。

但一般来说,如果一个类定义了以下之一,它可能应该明确定义所有three

析构函数 复制构造函数 复制赋值运算符

【讨论】:

【参考方案4】:

我不知道你所说的赋值是什么意思(在编译器的上下文中)。所以,让我举个例子。假设我们有一个类Test;

Test a,c;          //default constructor would be called for both.

Test b = a;        //copy constructor would be called for b as we are creating that object.

c = b;             //assignment operator would be called for c as we are changing content's of c.

因此,如果类 Test 包含普通对象,那么如果您定义 OR 不编译器会为您执行按位复制,则无关紧要。但是如果你的类包含指针,那么你应该明确定义你的复制构造函数、赋值运算符和析构函数。

希望我已经足够清楚了。

【讨论】:

以上是关于当我对具有复制构造函数但没有赋值运算符的对象进行赋值时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何为具有自引用指针的类实现复制构造函数/赋值运算符?

构造函数

复制构造函数与赋值运算符(=)有何不同

C++ 拷贝构造函数和赋值运算符

c++ 拷贝构造函数与赋值运算符重载函数的区别是

c++中拷贝构造函数和赋值运算符重载本质上一样么