1. C++运算符重载介绍
C ++ 中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C ++ 中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C ++ 的可扩展性,也是C ++ 最吸引人的特性之一。
运算符重载时要遵循以下规则:
( 1 ) 除了类属关系运算符 " . " 、成员指针运算符 " .* " 、作用域运算符 " :: " 、sizeof运算符和三目运算符 " ?: " 以外,C ++ 中的所有运算符都可以重载。
( 2 ) 重载运算符限制在C ++ 语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符。
( 3 ) 运算符重载实质上是函数重载,因此编译程序对运算符重载的选择,遵循函数重载的选择原则。
( 4 ) 重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构。
( 5 ) 运算符重载不能改变该运算符用于内部类型对象的含义。它只能和用户自定义类型的对象一起使用,或者用于用户自定义类型的对象和内部类型的对象混合使用时。
( 6 ) 运算符重载是针对新类型数据的实际需要对原有运算符进行的适当的改造,重载的功能应当与原有功能相类似,避免没有目的地使用重载运算符。
1.1 单目运算符与双目运算符
( 1 ) 双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。
比如说你重载+号,如果写在类外面,那么是需要两个参数的,而写在类里面,只能写一个参数,因为当这个函数被调用的时候,会自动的传一个this指针进去,就是对象本身,所以只需要一个参数
( 2 ) 前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。
( 3 ) 后置单目运算符重载为类的成员函数时,函数要带有一个整型形参。
比如前置++,和后置++,带一个整形形参只是为了区分
1.2 友元运算符
有些运算符是一定得声明为友元的,比如<<,>>运算符
因为=,+这些运算符,是c++最基本的运算符,而>>,<<运算符是标准头文件里面的一个类里面写的,你不能把这个函数声明为你这个自定义类的函数,因为这是别人类里面的函数,因此你只能把它声明为友元函数,声明为友元函数之后,那么这个函数它就可以访问你这个自定义类里面的私有成员变量
2. 实例讲解
光看这些概念,想必没有接触过的同学头都大了,接下来我通过一个向量类的例子,来讲解一下各个运算符重载怎么用
2.1 头文件定义
这次我们来实例一个向量类,什么是向量类呢,就是数学里面的向量,一个括号,里面两个数字,看一下头文件你就明白啦
class Vec2D {
private:
double x_;
double y_;
public:
static string AuthorBlog = "https://www.cnblogs.com/wanghongyang";
Vec2D(double x, double y) :x_(x), y_(y) {
}
Vec2D() {
x_ = 0.0; y_ = 0.0; }
std::string toString();
friend Vec2D operator+(const Vec2D& v1, const Vec2D& v2);
friend Vec2D operator-(const Vec2D& v1, const Vec2D& v2);
friend double operator*(const Vec2D& v1, const Vec2D& v2);
friend Vec2D operator+(const Vec2D& v1, double num);
friend Vec2D operator*(const double num, const Vec2D& v2);
friend Vec2D operator*</