【发布时间】:2014-11-23 00:12:29
【问题描述】:
当我对具有复制构造函数但没有赋值运算符的对象进行赋值时会发生什么?
它会调用编译器的赋值运算符,执行成员复制吗?
【问题讨论】:
-
用一些调试语句测试它:)
标签: c++ variable-assignment copy-constructor assignment-operator assign
当我对具有复制构造函数但没有赋值运算符的对象进行赋值时会发生什么?
它会调用编译器的赋值运算符,执行成员复制吗?
【问题讨论】:
标签: c++ variable-assignment copy-constructor assignment-operator assign
所有类都有一个赋值运算符,除非你明确删除它(在 C++11 之前不可能)。如果您不提供自己的实现,编译器会为您提供一个。
这就是 rule of three 背后的主要原因:如果您有一个复制构造函数,那么几乎可以肯定您还需要一个赋值运算符和一个析构函数。
【讨论】:
复制构造函数在赋值中不起作用,默认的赋值运算符将被调用,它将对内置类型成员进行按位复制,并对 class 类型的对象成员调用赋值运算符。
【讨论】:
ClassName a; ClassName b = a;这样进行赋值,将会调用一个拷贝构造函数
= 标记并不能使其成为赋值。
【讨论】:
我不知道你所说的赋值是什么意思(在编译器的上下文中)。所以,让我举个例子。假设我们有一个类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 不编译器会为您执行按位复制,则无关紧要。但是如果你的类包含指针,那么你应该明确定义你的复制构造函数、赋值运算符和析构函数。
希望我已经足够清楚了。
【讨论】: