C++重载运算符和重载函数
首先了解什么是重载,重载就是在同一个作用域内对某个函数或者运算符指定多个定义。这么做的目的是方便后续编程中对一些特殊类型数据进行运算等。当我们调用一个重载函数或者重载运算符时,编译器会根据我们调用时使用的参数类型、个数、顺序等选择合适的定义。这一过程称为重载决策。
C++函数重载
函数重载是在同一个定义域内声明几个同名的函数,这些函数名字一样但是形参不一样,即类型、顺序、个数。注意这里不可以仅仅通过返回类型的差异来重载函数。
在下面的实例中,三个print函数的重载是可以被接受的:
class printData
{
public:
void print(int i) {
cout << "整数为: " << i << endl;
}
void print(double f) {
cout << "浮点数为: " << f << endl;
}
void print(char c[]) {
cout << "字符串为: " << c << endl;
}
}
C++运算符重载
C++的重载运算符实际上也是一个函数,只不过它的函数名是由operator开头,后面跟着要重载的运算符号构成。当然,重载运算符也有自己的返回类型和参数列表。为什么要重载运算符?重载运算符之后我们就可以对一些原本不能直接用基本运算符运算的数据进行简单快捷的处理。比如我想对一个类的对象进行加法运算(当然是对这个对象的相应成员进行加法运算),如果不重载加法运算符,那么我每次碰到这样的要求都需要把这个两个对象的所有对应成员单独提出来用加法相加,这样就会很麻烦。重载加法运算符之后直接一句加法运算就搞定了。重载这个加法运算符时有两种方法,一种是在类外的普通非成员函数,一种是类成员函数。如果是类外的非成员函数,那么函数定义需要两个参数:
Box operator+(const Box&,const Box&);
实现的是把两个Box对象相加,返回一个Box对象。
另一种方式是类中成员函数,只需要一个参数:
Box operator+(const Box&);
下面的实例给出了加法运算符重载的概念:
Box operator+(const Box& b)
{
Box box;
box.length = this->length + b.length;
box.breadth = this->breadth + b.breadth;
box.height = this->height + b.height;
return box;
}
可以看到是通过this指针访问的对象属性。在主函数种调用这个重载运算符时,比如box3=box1+box2,这个box2就是重载加法中的形参b。
下面总结了一些可以重载的和不可重载的运算符1
可重载:
双目算术运算符 | + (加),-(减),*(乘),/(除),% (取模) |
---|---|
关系运算符 | ==(等于),!= (不等于),< (小于),> (大于>,<=(小于等于),>=(大于等于) |
逻辑运算符 | ||(逻辑或),&&(逻辑与),!(逻辑非) |
单目运算符 | + (正),-(负),*(指针),&(取地址) |
自增自减运算符 | ++(自增),–(自减) |
位运算符 | | (按位或),& (按位与),~(按位取反),^(按位异或),,<< (左移),>>(右移) |
赋值运算符 | =, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>= |
空间申请与释放 | new, delete, new[ ] , delete[] |
其他运算符 | ()(函数调用),->(成员访问),,(逗号),[](下标) |
下面是不可重载的运算符列表:
① . :成员访问运算符
② .* , ->*:成员指针访问运算符
③ :: :域运算符
④ sizeof:长度运算符
⑤ ?: :条件运算符
⑥ # :预处理符号
本文章为自己的学习笔记,如有错误,欢迎大佬指正!