什么是运算符重载
所谓重载,就是重新赋予新的含义。函数重载就是对一个已有的函数赋予新的含义,使之实现新功能,因此,一个函数名就可以用来代表不同功能的函数,也就是”一名多用”,运算符也可以重载。
1为什么会用运算符重载机制
用复数类举例
Complex c3 = c1 + c2;
原因 Complex是用户自定义类型,编译器根本不知道如何进行加减
编译器给提供了一种机制,让用户自己去完成,自定义类型的加减操作。。。。。
这个机制就是运算符重载机制
2 运算符重载的本质是一个函数
运算符重载的限制
以下运算符不能重载
. :: .* ? : sizeof
除以上运算符不能重载外大部分运算符可以重载。重载运算符函数可以对运算符作出新的解释,但原有基本语义不变:
- 不改变运算符的优先级
- 不改变运算符的结合性
- 不改变运算符所需的操作数
- 不能创建新的运算符
运算符重载基础
例如:
//全局函数 完成 +操作符 重载
Complex operator+(Complex &c1, Complex &c2)
//类成员函数 完成 -操作符 重载
Complex operator-(Complex &c2)
二元运算符
重载为成员函数时,解释为由左操作数调用,左操作数通过 this 指针传递,右操作数通过参数传递。
重载为友元函数时,左右操作数都由参数传递。
一元运算符
重载为成员函数时,操作数通过 this 指针传递。
重载为友元函数时,操作数由参数传递。
前置和后置运算符总结
C++中通过一个占位参数来区分前置运算和后置运算,有占位参数的为后置运算符。
友元函数和成员函数的选择方法
当无法修改左操作数的类时,使用全局函数进行重载
=, [ ] , ( ) 和 -> 操作符只能通过成员函数进行重载
用友元函数重载 << >> 实例
class MyString
{
private:
char *m_data;
int m_len;
public:
MyString();
MyString(char *str);
//重载 << >>
friend ostream &operator <<(ostream &out, const MyString &s);
friend istream &operator >>(istream &in, MyString &s);
};
ostream &operator <<(ostream &out, const MyString &s)
{
out << s.m_data;
return out;
}
istream &operator >>(istream &in, MyString &s)
{
char str[1024] = {0};
in >> str;
if (s.m_data != NULL)
{
delete s.m_data;
}
s.m_len = strlen(str);
s.m_data = new char[s.m_len + 1];
strcpy(s.m_data, str);
return in;
}
为什么不要重载 && 和 | | 运算符
1)&&和||是C++中非常特殊的操作符
2)&&和||内置实现了短路规则
3)操作符重载是靠函数重载来完成的
4)操作数作为函数参数传递
5)C++的函数参数都会被求值,无法实现短路规则
总结
- 操作符重载是C++的强大特性之一
- 操作符重载的本质是通过函数扩展操作符的语义
- operator关键字是操作符重载的关键
- friend关键字可以对函数或类开发访问权限
- 操作符重载遵循函数重载的规则
- 操作符重载可以直接使用类的成员函数实现
- =, [], ()和->操作符只能通过成员函数进行重载
- ++操作符通过一个int参数进行前置与后置的重载
- C++中不要重载&&和||操作符