重载
C++运算符的重载
1.基本概念
运算符的重载是具有特殊名字的函数,他们的名字由关键字operator和运算符号决定
重载运算符的参数数量与该运算符的运算对象数量一样多,对于二元运算符,左侧的对象传
给第一个参数,右侧的对象传给第二个参数。
如果运算符函数时成员函数,第一个对象自动绑定到this指针上,所以,成员函数的参
数数量比一般重载函数少一个。
2.不能重载的运算符
域运算符(::),类成员访问运算符(.),类成员指针访问运算符(.*),
长度运算符(sizeof),条件运算符(?:)
3.C++不建议重载的运算符
&& || 逗号 &
原因::重载的本质是一次函数的调用,而这些运算符指定了运算对象取值的顺序,而
这些规则无法运用到重载的运算符上,而且会使&& || 失去短路属性。
4.重载输出运算符
直接看栗子
friend ostream& operator <<(ostream &os, const Link<T> &list) { node<T> *_node = list.head->next; while(_node != nullptr) { os << _node->data << ","; _node = _node->next; } //os << std::endl; return os; }
第一个参数是非常量的引用,向流中写入数据会改变流的状态,所以不能是常量,我们无法复制一个流对象,所以要用引用
在注释中,我进行了换行,这时不好的操作,这时在调用重载函数的函数里面直接cout << link; 就会产生换行效果,显然不符合
我们的习惯。
为什么是友元函数呢,成员函数的第一个参数默认绑定this指针上,可是输入输出函数的左侧一般是一个流对象,这时,发生
冲突,所以不能把输入输出重载运算符函数设定为成员函数,为了能读写类的私有成员,我们将其设置为友元函数。
5.重载下标运算符
下标运算符[]可以使用下标来来访问容器中元素的任意位置。
直接看栗子
T &operator[](size_t n) { return vec[n]; }
返回值为引用,是希望用户可以使用下标运算符来操作容器中的元素。
注意:下标运算符必须是成员函数。
6.递增和递减运算符
没有什么好说的,唯一注意的是,前置++或者--,调用operator++(),operator--()
后置则调用operator++(int),operator++(int).