重载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;
}