函数的重载:在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。您不能仅通过返回类型的不同来重载函数。
1 #include <iostream> 2 using namespace std; 3 4 class Calculation 5 { 6 public: 7 static int GetSum(int a, int b) 8 { 9 return a + b; 10 } 11 static int GetSum(int a, int b ,int c) 12 { 13 return a + b + c; 14 } 15 /*static double GetSum(int a, int b) //这里因为只改变了返回类型,并没有重载函数,所以会报错 16 { 17 return a + b; 18 }*/ 19 static double GetSum(double a, double b) 20 { 21 return a + b; 22 } 23 static double GetSum(double a, double b, double c) 24 { 25 return a + b + c; 26 } 27 }; 28 29 int main() 30 { 31 cout << Calculation::GetSum(5, 6) << endl 32 << Calculation::GetSum(1.1, 2.1 ,3.3) << endl; 33 return 0; 34 }
结果为: 11 6.5
运算符的重载:重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。大多数的重载运算符可被定义为普通的非成员函数或者被定义为类成员函数。假设我们重载“+”,如果我们定义的函数为类的非成员函数,那么我们需要为每次操作传递两个参数,如果是类成员函数就只需要传递一个。运算符的重载讲道理我感觉掌握的很差,等以后有机会了再回来重新深入一下吧,现在暂时知道就好。下面说一下重载运算符的方式:返回类型 operator运算符(参数){实现} 举个栗子: bool opreator-(){return false;} 这个重载函数是成员函数,为什么?因为“-”这个运算符我们至少需要一个参数,可是它一个都没有那就只能是它自己的类。
1 #include <iostream> 2 using namespace std; 3 4 class Studnet 5 { 6 public: 7 int sum = 0; 8 int sum2 = 0; 9 int divisor = 0; 10 int dividend = 0; 11 //这个重载函数实现对两个参数的各自的变量的相加 12 Studnet operator/(const Studnet &d) //下面要解释一下const和&搭配使用。这里返回类型是类 13 { 14 Studnet std; 15 std.sum = d.dividend + d.divisor; //参数的两个变量相加 16 std.sum2 = this->dividend + this->divisor; //类本身的两个变量相加 17 return std; 18 } 19 }; 20 21 22 int main() 23 { 24 Studnet st1; 25 Studnet st2; 26 Studnet st3; 27 28 st1.dividend = 5; 29 st1.divisor = 6; 30 st2.dividend = 10; 31 st2.divisor = 20; 32 33 st3 = st2 / st1; 34 cout << st3.sum << endl 35 << st3.sum2 << endl; 36 return 0; 37 }
我们先看结果为: 11 30 ,我们发现形参d的变量的和是st1的变量的和(sum),说明了当这个重载函数是类成员函数的时候,它的形参的传值就是它的后面的这个参数(st1)。而this指的是st2。为什么是这样的呢,我们假如
int a = 10; int b = 10; a.add(b) 相当于 a+b
这样就自然很清楚了。如果是非成员函数也是一样的道理,只不过变成了两个参数。下面再来说说const和&的搭配使用:&是为了引用传递,防止值传递的复制数据,const是为了保护数据不被改动。const&防止传值时拷贝构造函数的调用开销。因为当我们使用值传递的时候,形参是实参的副本(复制)。