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对象的别名)