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,例如赋值运算符重载,这样不仅能避免上述问题,还能增加执行效率。