为什么这个运算符重载工作?

时间:2016-06-11 11:55:51

标签: c++ constructor operator-overloading copy-constructor

我正在尝试通过在线教程学习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;
    }
};

假设我在main函数中调用运算符,如下所示:

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

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

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

还要记住

a = b;

主要不是调用copy-constructor而是 copy-assignment 。如果您的类合适,那么反过来也会隐式定义(自动生成)。

有关详细信息,请参阅:http://en.cppreference.com/w/cpp/language/copy_assignment#Implicitly-declared_copy_assignment_operator