运算符重载
性质:
1 不能创建新的操作符。
2 双目操作符“::”、“.”、和“.*”不能重载。
3 c++的操作符都是有优先级和结合性的,重载操作符后,其优先级和结合性是不会改变的。
4 原先的操作符是单目的,重载也是单目形式的;原先操作符是双目的,重载也是双目的,这是不能改变的。
5 操作符的重载只能针对自定义类型。即,在操作符定义的参数表中,至少有一个参数必须是自定义类型。
6 忌意义相左。
常成员函数
成员函数的操作,如果只对对象进行读操作,则该成员函数可以设计为常(const )成员函数。设计为常成员函数的好处是,让使用者一目了然地知道该成员函数不会改变对象值。同时让类的实现者更方便地调试,因为在常成员函数中,任何改变对象值的操作,都将被编译器毫不留情地认定为错误。
举例:矢量类的加法
#include<iostream>
using namespace std;
class Point{
private:
int x, y;
public:
//成员函数
void set(int a, int b)
{
x=a, y=b;
}
//常成员函数
void print()const
{
cout<<"("<<x<<", "<<y<<")\n";
}
//设置为友元函数以便访问私有成员
friend Point operator+(const Point& a, const Point& b);
//设置为友元函数以便访问私有成员
friend Point add(const Point& a, const Point& b);
};
Point operator+(const Point& a, const Point& b)
{
Point s;
s.set(a.x+b.x, a.y+b.y);
return s;
}
Point add(const Point& a, const Point& b)
{
Point s;
s.set(a.x+b.x, a.y+b.y);
return s;
}
int main()
{
Point a, b;
a.set(3,1);
b.set(4,5);
//方法一
(a+b).print();
//方法二
operator+(a,b).print();
//方法三
add(a, b).print();
return 0;
}