函数重载
C语言不支持函数重载的原因
C++在编译过程中对函数重命名的规则保证了重载函数在重命名后函数名的唯一性,而C语言的编译过程中并不会对函数重命名
函数重载要求
参数类型和数量不能完全相同,不同返回值类型对函数重载没有影响,参数本身是不是const对函数重载没有影响
名字隐藏
class Base{
public:
virtual void print(int a){cout<<"Base print int"<<a<<endl;}
virtual void print(char a){cout<<"Base print char"<<a<<endl;}
virtual void print(double a){cout<<"Base print double"<<a<<endl;}
};
class Derived:public Base{
public:
void print(int a){cout<<"Derived print int"<<a<<endl;}
};
Derived d;
d.print(10);
d.print(3.14);
d.print('d');
输出结果:
Derived print int 10
Derived print int 3
Derived print int 100
在父类中有一组重载函数,子类在继承父类时如果覆盖了这组重载函数中的任意一个,则其余没有被覆盖的同名函数在子类中是不可见的
运算符重载
运算符重载的两种方式:
类成员函数、友元函数
- 对单目运算符进行重载时使用类成员函数的方式
- 对双目运算符进行重载时使用友元函数的方式
- ()和[ ]重载时必须使用类成员函数
- <<和>>重载时必须使用友元函数
重载前自增运算符和后自增运算符
class Step{
private:
int num;
public:
Step(int num){this->num = num;}
int getStep(){return num;}
Step& operator++(); //前自增运算符
Step operator++(int); //后自增运算符
};
Step& Step::operator++(){
num ++;
return * this;
}
Step Step::operator ++(int){
Step temp = *this;
++ *this;
return temp;
}
- 如果只重载了前自增操作符,那后自增操作与重载后的前自增运算符绑定,使两者的行为相同
- 为了区分前后自增,后自增运算符的重载函数的参数列表中需要增加一个int类型的参数
复数加减
class Complex{
private:
int real;
int imag;
public:
Complex(int r,int i):real(r),imag(i){}
friend Complex operator + (Complex com1,Complex com2);
friend Complex operator - (Complex com1,Complex com2);
void print();
};
Complex operator + (Complex com1,Complex com2){
return Complex(com1.real + com2.real,com1.imag + com2.imag);
}
Complex operator - (Complex com1,Complex com2){
return Complex(com1.real - com2.real,com1.imag + com2.imag);
}
void Complex::print(){
if(imag == 0){
cout<<real<<endl;
}else if(imag > 0){
cout<<real<<"+"<<imag<<"i"<<endl;
}else{
cout<<real<<"-"<<imag<<"i"<<endl;
}
}