2016-06-11 47 views
0

我想通过在线教程学习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; 
... 
} 

在上类前面的教程中,我读到为什么拷贝构造函数需要所有参数要通过引用传递,因为它们本身就是如何复制两个类对象的定义。所以,就我所知,复制构造函数是必须的,因为必须复制类的对象。

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

谢谢你的帮助!

+1

编译器将为您定义一个默认的拷贝构造函数。 – melpomene

+1

在某些情况下,编译器会为您生成一个副本ctor和复制赋值运算符。 – Borgleader

+1

相关:http://stackoverflow.com/questions/12577907/default-copy-constructor – user463035818

回答

0

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

如果使用任何类T除非标准C++ 2003或更旧的拷贝构造总是隐含定义(由编译器产生的):

  • T具有非静态数据成员,不能被复制(已被删除,无法访问或模棱两可的复制构造函数); T具有不能复制的直接或虚拟基类(已删除,不可访问或含糊不清的拷贝构造函数); T具有不能复制的直接或虚拟基类(已删除,不可访问或不明确的拷贝构造函数); T具有直接或虚拟基类,具有已删除或不可访问的析构函数;

如果使用标准的C++ 2011或更新的复制构造总是隐含定义(由编译器产生的)用于任何类T除非:

  • T具有无法复制的非静态数据成员(已经删除,无法访问或不明确的拷贝构造函数); T具有不能复制的直接或虚拟基类(已删除,不可访问或含糊不清的拷贝构造函数); T具有不能复制的直接或虚拟基类(已删除,不可访问或不明确的拷贝构造函数); T具有直接或虚拟基类,具有已删除或不可访问的析构函数;
  • T有一个用户定义的移动构造函数或移动赋值操作符;
  • T是一个联盟,并有一个具有非平凡复制构造函数的变体成员;
  • T有一个右值引用类型的数据成员。

而且记住,

a = b; 

主要不是调用拷贝构造函数,但拷贝赋值。如果你的课程适合,那么这又被隐式定义(自动生成)。

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