重载C+中的`=`运算符+; 我试图理解C++中的重载操作符。我在下面编写了一些代码,试图重载=操作符。然而,它不能正常工作,我想知道为什么现在
我遵循了这里为重载C+中的`=`运算符+; 我试图理解C++中的重载操作符。我在下面编写了一些代码,试图重载=操作符。然而,它不能正常工作,我想知道为什么现在,c++,operator-overloading,C++,Operator Overloading,我遵循了这里为+操作符提供的示例 #包括 使用名称空间std; 课堂测试{ 私人: int-id; 字符串名; 公众: Test():id(0),名称(“”){ } 测试(int-id,字符串名):id(id),name(name){ } 作废打印(){ cout因为与+不同,=需要修改有问题的对象,而不是一个临时变量,然后返回 Test& operator=(const Test &other) { cout << "Assignment running
+
操作符提供的示例
#包括
使用名称空间std;
课堂测试{
私人:
int-id;
字符串名;
公众:
Test():id(0),名称(“”){
}
测试(int-id,字符串名):id(id),name(name){
}
作废打印(){
cout因为与+
不同,=
需要修改有问题的对象,而不是一个临时变量,然后返回
Test& operator=(const Test &other) {
cout << "Assignment running" << endl;
id =other.id;
name =other.name;
return *this;
}
测试和运算符=(常量测试和其他){
按照标准,cout运算符=
应修改此
,并返回对*此
的引用(以便允许复合赋值):
测试和运算符=(常量测试和其他){
cout name=other.name;
归还*这个;
}
请注意,我还将other
作为const
传递。您的版本不会修改此
,这将产生令人惊讶的效果。首先考虑您期望的语义。由于重载运算符的要点是您可以使用与内置运算符相同的语法,请替换
test2.operator=(test1);
与
- 首先,在这个表达式中,您希望test1发生什么变化?它应该改变吗
提示:答案是否,因此右侧参数应通过
const
reference传递
- 其次,在这个表达式中,您希望test2发生什么变化?它是否应该改变
是的,当然应该更改,您正在为其赋值。因此,左侧参数应该由您的代码修改。请注意,在成员运算符中,左侧是
this
因此,我们知道我们至少应该更改您的代码,以通过const reference获取右侧参数,并且它应该修改此
,而不是在分配给临时参数时保持不变
此外,所有这些运算符的标准形式都是众所周知的,并有文档记录。例如
测试和运算符=(常量测试和其他){
cout name=other.name;
归还*这个;
}
test2.operator=(test1)运算符重载的一点是,你可以把它称为“代码> Test2=Test1,而不是函数调用……你没有考虑过重载赋值运算符的例子吗?因为你在发现模式中可能重复,请注意<代码>运算符=< /COD>不是构造函数WITT的同义词。h是相同的参数类型。从技术上讲,它不必修改所讨论的对象,这就是编译器接受问题中的代码的原因。但这显然是目的。为什么必须通过引用而不是通过值来传递其他参数?这两种方法都有效。通过值来传递RHS在语义上也很好,但对于大型对象来说可能很昂贵,and没有真正的好处。在这种情况下,它包括复制字符串,这可能涉及动态分配和随后的解除分配。这是一个相对昂贵的操作,如果内存不足,可能会失败。通过值传递然后移动确实有其优点。特别是当移动操作为noexcept.True时,但嗯,我也应该解释一下缺失的移动任务,这似乎超出了OP在这个阶段的需要。
Test& operator=(const Test& other) {
cout << "Assignment running" << endl;
this->id = other.id;
this->name = other.name;
return *this;
}
test2.operator=(test1);
test2 = test1;
Test& operator=(const Test &other) {
cout << "Assignment running" << endl;
this->id =other.id;
this->name =other.name;
return *this;
}