c++操作符重载的两种类型
2017-07-25 15:37
253 查看
运算符重载是C++多态的重要实现手段之一。通过运算符重载对运算符功能进行特殊定制,使其支持特定类型对象的运算,执行特定的功能,增强C++的扩展功能。
运算符重载的我们需要坚持四项基本原则:
(1)不可臆造运算符;
(2)运算符原有操作数的个数、优先级和结合性不能改变;
(3)操作数中至少一个是自定义类型;
(4)保持重载运算符的自然含义。
一般来说,C++运算符重载可采用成员函数和友元函数,二者都可以访问类的私有成员,那么该采用哪一种呢?首先看一下二者的区别。
(1)当重载为成员函数时,会隐含一个this指针;当重载为友元函数时,不存在隐含的this指针,需要在参数列表中显示地添加操作数。
(2)当重载为成员函数时,只允许右参数的隐式转换;当重载为友元函数时,能够接受左参数和右参数的隐式转换。
如下代码:
因为CString的构造函数参数为一个char*,所以如果采用友元形式的operator +(const CString&, const CString&),那么char+CString和CString+char都能正常工作;而如果采用成员函数形式CString::operator+(const CString& rhs),则只能接受CString+char,如果执行char+CString则会编译出错。我们往往习惯CString+char和char+CString都应该被接受。需要注意的是,隐式转换由于临时变量的增加往往效率不高。如果应用程序对效率要求较高,针对以上类,建议选择定义多个运算符的友元重载版本:
一般而言,对于双目运算符,最好将其重载为友元函数;而对于单目运算符,则最好重载为成员函数。
但是也存在例外情况。有些双目运算符是不能重载为友元函数的,比如赋值运算符=、函数调用运算符()、下标运算符[]、指针运算符->等,因为这些运算符在语义上与this都有太多的关联。比如=表示“将自身赋值为…”,[]表示“自己的第几个元素”,如果将其重载为友元函数,则会出现语义上的不一致。
还有一个需要特别说明的就是输出运算符<<。因为<<的第一个操作数一定是ostream类型,所以<<只能重载为友元函数,如下:
运算符重载的我们需要坚持四项基本原则:
(1)不可臆造运算符;
(2)运算符原有操作数的个数、优先级和结合性不能改变;
(3)操作数中至少一个是自定义类型;
(4)保持重载运算符的自然含义。
一般来说,C++运算符重载可采用成员函数和友元函数,二者都可以访问类的私有成员,那么该采用哪一种呢?首先看一下二者的区别。
(1)当重载为成员函数时,会隐含一个this指针;当重载为友元函数时,不存在隐含的this指针,需要在参数列表中显示地添加操作数。
(2)当重载为成员函数时,只允许右参数的隐式转换;当重载为友元函数时,能够接受左参数和右参数的隐式转换。
如下代码:
class CString{ public: CString(char* str); private: char* m_pStr; };
因为CString的构造函数参数为一个char*,所以如果采用友元形式的operator +(const CString&, const CString&),那么char+CString和CString+char都能正常工作;而如果采用成员函数形式CString::operator+(const CString& rhs),则只能接受CString+char,如果执行char+CString则会编译出错。我们往往习惯CString+char和char+CString都应该被接受。需要注意的是,隐式转换由于临时变量的增加往往效率不高。如果应用程序对效率要求较高,针对以上类,建议选择定义多个运算符的友元重载版本:
CString& operator +(const CString&, const CString&); CString& operator +(const char*, const CString&); CString& operator +(const CString&, const char*);
一般而言,对于双目运算符,最好将其重载为友元函数;而对于单目运算符,则最好重载为成员函数。
但是也存在例外情况。有些双目运算符是不能重载为友元函数的,比如赋值运算符=、函数调用运算符()、下标运算符[]、指针运算符->等,因为这些运算符在语义上与this都有太多的关联。比如=表示“将自身赋值为…”,[]表示“自己的第几个元素”,如果将其重载为友元函数,则会出现语义上的不一致。
还有一个需要特别说明的就是输出运算符<<。因为<<的第一个操作数一定是ostream类型,所以<<只能重载为友元函数,如下:
friend ostream& operator <<(ostream& os, const Complex& c); ostream& operator <<(ostream& os, const Complex& c){ os << c.m_Real << “+” << c.m_Imag << “i” << endl; return os; }
参考文献
[1]李健.编写高质量代码:改善C++程序的150个建议.第一版.北京:机械工业出版社,2012.1:131-134相关文章推荐
- C++重载类型转换操作符(type cast operator
- C++ trick之重载类型转换操作符 “orthodox”技术
- C++重载类型转换操作符
- C++重载类型转换操作符(type cast operator
- C++重载类型转换操作符
- C++重载输入和输出操作符以及IO标准库中的刷新输入缓冲区残留字符问题
- 【C++】重载运算符号时的函数返回值类型问题
- C++容易出错的操作符重载
- C++ 操作符重载、友元、类型转换操作符、五种类型转换、函数操作符
- C++中的操作符重载
- C++中 关于操作符的重载
- C++ 重载输入输出操作符
- C++重载箭头操作符
- C++输入输出操作符的重载
- 重载c++的<<操作符
- C++ 中指针操作符(*)重载备忘
- 【C++知识点】可重载与不可重载的操作符
- C++的四种cast操作符的区别--类型转换
- c++ 重载 >>(输入) 、<< (输出) 操作符
- C++语法基础--转换操作符,重载确定