C++中运算符重载注意事项

c++中运算符重载注意事项


1、运算符重载的操作数通常是 类对象
2、运算符重载的种类有:

双目 运算符重载:+ - * /等

两个操作数中至少有一个是类对象;
返回值为 “类类型” ;
有 成员函数 和 友元函数 两种形式;
// 针对友元函数而言,其函数声明时应有两个参数
friend Person operator+(Person &p1, Person&p2); 
friend Person operator+(Person &p1, int a); 
// 上述Person为类名

// 针对成员函数而言,其函数声明只有一个参数
Person operator-(Person &p);
// Person为类名,规定‘-’ 这个符号的左操作数为 当前对象,右操作数为 函数调用的实参

单目 运算符重载: - ! & * ++ –

返回值为 “对象类型” or “对象引用类型”;
特别注意 “++  --” 两种运算符(成员函数和友元函数两种形式);
上述两种运算符的运算原理与 普通数据类型 的运算原理 一致,一定要理解
//这里不区分成员函数和友元函数,只区别前缀和后缀,拿 ++ 的成员函数举例
Person& operator++(); // 前缀自增
Person operator++(int); // 后缀自增

转换 运算符重载:实现类类型转换成其他简单数据类型

必须是成员函数,没有参数,没有返回值类型,在函数体内必须有返回type类型值的语句;

例如有一个复数对象c,要将c直接输出,但是未定义 左移右移运算符重载函数,该怎么办?
Complex c(10.0, 20.0); //分别对应实部和虚部
cout << c << endl;

需要:

Complex::operator float () {	
    return Real*Real+Image*Image;
}
上述转换是隐式调用的,在没有 右移左移运算符重载情况下 的解决办法。

赋值 运算符重载 : =

不能重载为友元函数和不同函数,必须是非静态成员函数;
返回值为 引用类型
如果类中有成员函数为 指针类型,则需要考虑  深、浅拷贝  的问题;

思考下面的函数申明中,形参为什么要加 const???
Person &operator = (const Person &);

左移 or 输出 运算符重载: <<

不能重载为类的成员函数,可以为友元函数 or 普通函数

函数声明如下:
friend ostream &operater <<(ostream &, Person &);
|
|
|
|
|
|

在运算符重载中必须注意:::

1、运算符重载函数的 类型(此处列举一些常用的 且 不考虑 普通函数 的情况):
	例如: + - ++ -- :友元函数 or 成员函数
		  转换运算符重载  = : 成员函数
		  <<   >> :友元函数 

2、赋值运算符 和 单目运算符 “同时使用”时,由于有时候前者返回 引用类型,后者返回 类类型,会出现编译错误的情况,这时需要在 赋值运算符 的 形参上加 const;
原因:单目运算符 返回的 是局部类对象,无合法内存空间,而可变类对象的引用需要合法内存空间,故无法转化,而常量类对象引用(+const)就能接收这类局部对象。

3、建议 如果形参列表为 引用类型,且不需要改变 引用的对象 的值,则形参 全部 加上 const,例如赋值运算符重载,这样不仅能避免上述问题,还能增加执行效率。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值