第四章 运算符重载
2020-04-04 16:02:09来源:博客园 阅读 ()
第四章 运算符重载
目录
- 运算符重载
- 等号=重载
- 变长数组
- 流插入&流提取运算符重载
- 类型转换运算符重载
- 自增自减运算符重载
- 运算符重载注意事项
运算符重载
- 定义:重新定义运算符的运算
- 实质是函数重载,把含有运算符的表达式转换成对运算符函数的调用
- 可以重载为普通函数、成员函数、友元函数
- 重载成普通函数,参数表个数=运算符目数
- 重载为友元函数,可访问私有成员,同时解决重载为成员函数操作数顺序不满足条件的问题
- 重载为成员函数,参数表个数=运算符目数-1
- 多次重载时,根据实参类型决定调用哪个运算符函数
等号=
重载
-
等号只能重载为成员函数
-
赋值语句和初始化语句的等号
=
含义不同,初始化语句需要用构造函数实现 -
同类赋值注意点(可能包含指针)
-
浅拷贝:采用默认的赋值号,导致指针指向同一个地址,原有动态分配内存未释放,且数据相互影响
-
深拷贝:释放原有内存空间,并重新动态分配一块内存
-
在拷贝前应检查是否拷贝自身(即
if(this=&s)
,会造成自身内部空间先被是否,复制出错),是则直接return *this
-
返回值应为
ClassName&
,void
和ClassName
有缺陷[1]a=b=c; //连续赋值,void不行 (a=b)=c; //结果为a=c; ClassName不行
-
使用复制拷贝函数时,需要考虑类似的问题
String& String::operator= (const String &s){ if(this==&s) return *this; if(str) delete [] str; if(s.str==NULL){ str=NULL; }else{ str=new char[strlen(s.str)+1]; strcpy(str,s.str); } return *this; }
-
变长数组
- 非引用的函数返回值不能作为左值使用[2]
- 赋值和初始化时采用深拷贝
流插入&流提取运算符重载
-
cout
和cin
分别是ostream
和istream
类的对象,类中分别对<<
和>>
运算符进行了重载 -
可全局重载
>>
和<<
运算符,使其满足要求ostream& operator << (ostream &os,const Complex &c){ os<<c.real<<"+"<<c.imag<<"i"; return os; } istream& operator >> (istream &is,Complex &c){ string s; is>>s; int pos=s.find('+',0); string substr=s.substr(0,pos); c.real=stod(substr); int pos2=s.find('i',0); c.imag=stod(s.substr(pos+1,pos2)); return is; }
类型转换运算符重载
-
不写返回值(返回值即转换类型)
-
定义为成员函数时,无参数[3]
class Complex{ double real,imag; public: Complex(double r=0,double i=0):real(r),imag(i){}; operator double (){ return real; } //将Complex类强制转换成double类 };
-
包含了显式类型转换和自动类型转换
Complex c(1.2,3.4); cout<<(double) c<<endl; double tmp=5+c; cout<<tmp<<endl;
自增自减运算符重载
-
前置(作为一元运算符处理),返回值为引用
//成员函数 T& operator++(); T& operator--(); //普通函数 T& operator++(T& c); T& operator--(T& c);
-
后置(作为二元运算符处理),返回值不是引用,效率没前置的高
//成员函数 T operator++(int); T operator--(int); //普通函数 T operator++(T& t,int); T operator--(T& t,int);
-
示例
CDemo& operator--(CDemo &c){ c.n--; return c; } CDemo operator--(CDemo &c,int){ CDemo tmp(c); c.n--; return tmp; }
运算符重载注意事项
- C++不允许定义新运算符
- 重载后运算符应符合日常习惯
- 运算符重载不改变运算符优先级
- 不能被重载的运算符:
.
,.*
,::
,?:
,sizeof
- 重载运算符
()
,[]
,->
,或赋值运算符=
时,运算符重载函数必须声明为类成员函数
运算符重载时,应尽量保留运算符原有的特性 ??
不能被赋值 ??
成员函数参数个数=操作数-1 ??
原文链接:https://www.cnblogs.com/DreamEagle/p/12632015.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 运算符重载 2020-06-10
- C++ new初始化与定位new运算符 2020-05-22
- 重载矩阵加法运算 代码参考 2020-04-29
- 重载加法运算符的复数运算 代码参考 2020-04-29
- C++基础 学习笔记五:重载之运算符重载 2020-04-23
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash