Book& operator=(Book& L)中,返回*this的理解

来源:互联网 发布:期货实时行情数据接口 编辑:程序博客网 时间:2024/05/18 00:02
Book.h#include <iostream>using namespace std;class Book{  public:    Book( int m_page){      page =m_page;    }    ~Book(){};    void open(){      cout<<"You opened a book of "<<page<<" pages."<<endl;    }    void setPage(int m_page){      page =m_page;    }    int getPage(){      return page;    }    Book& operator+(Book& L){      int c =page +L.getPage();      setPage( c);      return *this;    }  private:    int page;};

我一直对此类重载方法中的Book& 类型心存疑惑,我们来看一下,我有四种办法可以完成+法的重载,重点在返回值上
1.

Book& operator+(Book& L){      int c =page +L.getPage();//使用了对象存取成员运算符号"."      setPage( c);      return *this;//返回*this,注意这是一个对象,它表示操作+函数的对象    }

.
2

Book operator+(Book L){      int c =page +L.getPage();//使用了对象存取成员运算符号"."      setPage( c);      return this;//返回*this.直接用Book接收,这种方法我最能理解    }

.
3

Book* operator+(Book* L){      int c =page +L->getPage();//使用指针存取成员运算符号"->"      setPage( c);      return this;//返回的this是一个对象的指针,这个对象正在操作+函数

.
4

Book operator+(Book& L){      int c =page +L.getPage();      setPage( c);      return *this;    }

.
.
.
这三种办法都是有效的,单论执行效率1,3差不多,直接用参数(L)所代表的对象进行操作
但是,第二种办法接到参数回先复制参数,当对象比较大那么效率就会降低.
第四种办法就不用复制参数对象了,但是return时候仍然要复制,因为返回值是Book类型,所以会返回对象的副本.效率比1.3慢,比2快.
.
最后,谈谈最重要的为什么Book对象是BooK&类型的
1.Book对象肯定是Book类型.
2.Book类型的对象肯定可以有别名(Book& a,其中a表示某个Book对象的别名)

原创粉丝点击