试图了解如何创建赋值类操作符。成员变量constant_name
用于标识对象。成员变量changeable_name
用于在分配期间产生影响。我需要这个来了解谁的影响是什么以及结果是什么。每个对象在创建过程中都会获得唯一constant_name
。
class turbo
{
static string m;
public:
string changable_name ="";
string constant_name ="";
void nm()
{
m=m+"A";
changable_name=m;
constant_name=changable_name;
};
void printID()
{
printf("constant_name=%s changable_name=%s ",constant_name.c_str(),changable_name.c_str());
};
turbo() {
nm();
printID();
printf("default constructor \n");
};
turbo & operator = (turbo & value){ printID(); printf("= operator\n"); if (!(&value==this)) { changable_name = value.constant_name; } ; return *this; }
turbo (turbo&) {nm(); printID(); printf("copy constructor\n");}
};
string turbo::m;
int main( int argc, char ** argv )
{
turbo f;
turbo ff;
f=ff;
printf("--- result ---\n");
f.printID();
}
当在顶部的代码中描述=
运算符时,我有输出:
constant_name=A changable_name=A default constructor
constant_name=AA changable_name=AA default constructor
constant_name=A changable_name=A = operator
--- result ---
constant_name=A changable_name=AA
字段changable_name
已从AA
变为A
,这很好。
现在,如果我删除turbo value
中的参考标记:
turbo & operator = (turbo value){ printID(); printf("= operator\n"); if (!(&value==this)) { changable_name = value.constant_name; } ; return *this; }
我在输出中有以下内容:
constant_name=A changable_name=A default constructor
constant_name=AA changable_name=AA default constructor
constant_name=AAA changable_name=AAA copy constructor
constant_name=A changable_name=A = operator
--- result ---
constant_name=A changable_name=AAA
创建了新对象AAA
并将其分配给对象A
。 AA
根本没有影响力。为什么编译器决定激活复制构造函数然后赋值运算符?我想在" ="的右边激活了复制构造函数。操作
另一个案例。
现在,如果我删除turbo operator
中的参考标记:
turbo operator = (turbo & value){ printID(); printf("= operator\n"); if (!(&value==this)) { changable_name = value.constant_name; } ; return *this; }
我在输出中有以下内容:
constant_name=A changable_name=A default constructor
constant_name=AA changable_name=AA default constructor
constant_name=A changable_name=A = operator
constant_name=AAA changable_name=AAA copy constructor
--- result ---
constant_name=A changable_name=AA
这让我很困惑。我想AAA
是在=
的左侧创建的。 AAA在任务中根本没有采取任何行动。结果A
已分配给AA
。但为什么需要创建AAA呢?
答案 0 :(得分:1)
如果您未在复制赋值运算符中通过引用传递参数,则编译器复制您传递的参数,并且该函数使用该副本。调用的函数是复制赋值运算符并不重要,它对所有函数都是相同的。
搜索并阅读有关按值传递和按引用传递的详细信息。
对于返回值,同样的事情发生在那里:编译器创建返回值的副本。如果您已正确实现了复制构造函数以实际复制某些内容,那么结果将会有所不同。
答案 1 :(得分:0)
&value == this
参数通过-value而非by-reference传递时,value
上的测试毫无意义,因为在成员函数之前在堆栈上创建了新的turbo
实例被调用,该实例的地址显然不等于调用对象的地址。
答案 2 :(得分:0)
如果你没有在你的类中定义下面的函数,那么编译器将提供它自己的版本
默认构造函数
复制构造函数
赋值运算符重载
析
现在在第二种情况下,您已从参数中删除了引用,因此它是一个传递值的情况,它是通过调用copy-constructor实现的。
在第三种情况下,它是按值而不是按引用返回,因此复制ctor在=运算符的作业完成后再次被调用,因此输出。