对于友元重载方式和成员函数重载方式的选择
2016-03-22 23:57
197 查看
今天看C++primier第五版494页下面有一段叙述:
与iostream标准库库兼容的输入输出运算符必须是普通的非成员函数,而不能是类的成员函数。否则,它们的左侧运算对象将是我们类的一个对象。
原因倒是非常简单,因为如果重载函数是作为类中的一个非静态成员的话,就必须通过一个已经被实例化的类来调用,如果仅仅是作为一个友元函数的话,那么直接调用就可以了。
那么对于前者,很明显地可以知道的是由于是作为类中的一个非静态成员,自然也就有隐式定义的this指针,所以在定义和声明函数的时候,参数自然而然地就少了一个,但是引用该函数的时候就必须要划定该函数的作用域是在某个已经被实例化的域上。
对于作为友元的后者,参数而言的话就多了一个。以位计算符的重载为例:
首先是作为类成员函数:
然后是友元函数的写法
对于上述的问题,显然用友元的处理方式更加地科学,因为并没有必要为了使用重载后的运算符而提前实例化一个对象,在一些相关的运算符重载的问题上,最后我们应该选取何种方式来重载运算符呢?这个应该视具体情况和具体运算符而定。
与iostream标准库库兼容的输入输出运算符必须是普通的非成员函数,而不能是类的成员函数。否则,它们的左侧运算对象将是我们类的一个对象。
原因倒是非常简单,因为如果重载函数是作为类中的一个非静态成员的话,就必须通过一个已经被实例化的类来调用,如果仅仅是作为一个友元函数的话,那么直接调用就可以了。
那么对于前者,很明显地可以知道的是由于是作为类中的一个非静态成员,自然也就有隐式定义的this指针,所以在定义和声明函数的时候,参数自然而然地就少了一个,但是引用该函数的时候就必须要划定该函数的作用域是在某个已经被实例化的域上。
对于作为友元的后者,参数而言的话就多了一个。以位计算符的重载为例:
首先是作为类成员函数:
#include<iostream> using namespace std; class Date{ public: Date(){ } Date(int y,int m,int d){ year=y; month=m; day=d; } const Date& operator<<(const Date &d) const; private: int year,month,day; }; const Date& Date::operator <<(const Date& d) const { const char sep='\t'; cout<<"year:"<<d.year<<sep<<"month:"<<d.month<<sep<<"day:"<<d.day<<endl; return *this; } int main(){ Date b; Date a(2016,12,12); Date c(2011,11,11); b<<a<<c; return 0; }看上述例子,为什么要返回this指针?原因很简单,这样我们像std命名空间的cout<<一样可以连续的使用,具体地话可以参见我之前转载的一片文章,记叙iostream中的库和stdio中标准输入输出的不同。
然后是友元函数的写法
#include<iostream> using namespace std; class Date{ public: Date(){ } Date(int y,int m,int d){ year=y; month=m; day=d; } friend ostream& operator<<(ostream &os,const Date &dt); private: int year,month,day; }; ostream& operator <<(ostream& os,const Date& d) { const char sep='\t'; os<<"year:"<<d.year<<sep<<"month:"<<d.month<<sep<<"day:"<<d.day<<endl; return os; } int main(){ Date a(2016,12,12); cout<<a; return 0; }
对于上述的问题,显然用友元的处理方式更加地科学,因为并没有必要为了使用重载后的运算符而提前实例化一个对象,在一些相关的运算符重载的问题上,最后我们应该选取何种方式来重载运算符呢?这个应该视具体情况和具体运算符而定。
相关文章推荐
- 关于C++中的友元函数的一些总结
- C++友元函数与拷贝构造函数详解
- 详解C++编程中的单目运算符重载与双目运算符重载
- c++ *运算符重载
- C++重载运算符的规则详解
- 详解C++编程中类的成员变量和成员函数的相关知识
- c++友元函数与友元类的深入解析
- c++中string类成员函数c_str()的用法
- c++运算符重载基础知识详解
- C++运算符重载的方法详细解析
- 指向类成员函数的指针其实并非指针
- C++之友元:友元函数和友元类详解
- 简介C++编程中的运算符重载
- C++中的friend友元函数详细解析
- 详解C++中的函数调用和下标以及成员访问运算符的重载
- js对象内部访问this修饰的成员函数示例
- C++运算符重载规则详解
- 详解C++编程中一元运算符的重载
- operator int-C++
- 如何让C++类的成员函数作为回调函数