为什么这个运算符重载有效?

Why does this operator overloading work?

我正在尝试通过在线教程学习 C++ OOP 概念,在该教程中我遇到了说明运算符重载的代码片段。

代码如下:

class MyClass{
int var;
public:
    Myclass(int value=0){
    var = value;
    }

    Myclass operator+(Myclass &obj){
    Myclass newobj;
    newobj.var = this->var + obj.var;
    return newobj;
    }
};

假设我像这样在主函数中调用运算符:

int main(){
...
obj3 = obj2 + obj1;
...
}

在 类 的早期教程中,我了解了为什么复制构造函数要求所有参数都通过引用传递,因为它们本身就是如何复制两个 class 对象的定义。因此,据我所知,当必须复制 class 的对象时,复制构造函数是必须的。

在上面的代码片段中,在我看来,编译器将尝试 "copy" newobj 的值到 main() 函数 (obj3) 中的 L_value。但是,如果没有定义复制构造函数,这怎么可能呢。我是不是误解了什么?

感谢您的帮助!

http://en.cppreference.com/w/cpp/language/copy_constructor#Implicitly-declared_copy_constructor

如果您使用的是标准 C++ 2003 或更早版本的复制构造函数,则始终为任何 class T 隐式定义(由编译器生成),除非:

  • T 具有无法复制的非静态数据成员(具有已删除、不可访问或不明确的复制构造函数);
  • T 具有无法复制的直接或虚拟基 class(具有已删除、不可访问或不明确的复制构造函数);
  • T 有直接或虚拟基 class,带有已删除或不可访问的析构函数;

如果您使用的是标准 C++ 2011 或更新的复制构造函数,则始终为任何 class T 隐式定义(由编译器生成),除非:

  • T 具有无法复制的非静态数据成员(具有已删除、不可访问或不明确的复制构造函数);
  • T 具有无法复制的直接或虚拟基 class(具有已删除、不可访问或不明确的复制构造函数);
  • T 有直接或虚拟基 class,带有已删除或不可访问的析构函数;
  • T 具有用户定义的移动构造函数或移动赋值运算符;
  • T 是一个联合并且有一个带有非平凡复制构造函数的变体成员;
  • T 有一个右值引用类型的数据成员。

还要记住

a = b;

主要不是调用复制构造函数,而是复制赋值。如果你的 class if suitable.

详情见:http://en.cppreference.com/w/cpp/language/copy_assignment#Implicitly-declared_copy_assignment_operator