C++基础9:函数、函数重载、运算符重载
2017-01-20 本文已影响0人
YBshone
一.函数
1.函数重载,函数覆盖,函数隐藏三者的区别,概念
函数重载:在一个类中,函数与函数的函数名相同,参数类型或者参数的个数不同
函数覆盖:在基类和派生类中,基类的函数必须是虚函数,两个类中的函数与函数的函数名相同,参数类型和个数也完全相同
函数隐藏:在基类和派生类中,基类的函数必须不是虚函数,两个类中的函数与函数的函数名相同,参数类型和个数不考虑(相同不相同都无所谓)
2.const成员函数
如果想在一个函数中不允许修改(全局)的成员变量值,那么可以将该函数定义为const成员函数,如:
[cpp]
int i,k;
void CTestMemCpp::printss() const
{
i=5;
k=5;
}
上面更改了全局的变量i和k,那么编译器会报错。
二.函数重载
1.概念
函数重载指的是函数的参数个数或者某个参数的类型不同就称为函数的重载,如
int fun(int a)
int fun(float a)
int fun(int a,double b)
以上三个函数就是对函数fun的重载
2.函数的默认参数
函数的的参数在声明的时候也可以进行初始化,初始化之后就可以在使用的时候不需要填写形参
[cpp]
void func(int a,int b,int c=5)
{
cout<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;
}
[html] view plain copy print?
main
{
fun(1,2);//a:1 b:2 c:5
func(1,2,3);//a:1 b:2 c:3
}
三.运算符重载
1.概念
c++除了函数重载还允许重载运算符,运算符或者说重载后的运算符与类结合,产生新的功能
2.为什么使用运算符重载
与类结合,为了实现类的多态性
3.声明定义
返回类型 operator运算符(参数1,参数2。。。){}
使用operator关键字进行声明重载运算符
4.前置++和后置++的重载
[cpp]
class CTestMemCpp
{
public:
CTestMemCpp(void);
~CTestMemCpp(void);
int n;
//前置++重载
int operator++()
{
n=0;
++n;
return n;
}
//后置++重载
int operator++(int a)
{
n=0;
int aa=n;
++*this;
return aa;
}
};
[cpp]
CTestMemCpp *cp=new CTestMemCpp();
int a=++*cp;
int b=(*cp)++;
结果:a=1 b=0
前置++和后置++重载的时候怎么才能让编译器区分出来呢?为了区分他们,我们需要在后置++的运算符后添加一个int类型的参数(int a),这个参数没有任何意义,它也不会传递到函数体中,它只是operator++()函数设置的一个信号,该信号提醒编译器,目前添加了参数的函数是一个后置自加的运算符函数
5.两个对象相加的+运算符重载
[cpp]
class CTestMemCpp
{
public:
CTestMemCpp(void);
~CTestMemCpp(void);
int n;
CTestMemCpp(int a)
{
n=a;
}//对象+重载
CTestMemCpp operator+(CTestMemCpp &cp)
{
return CTestMemCpp(n+cp.n);
}
};
[cpp]
CTestMemCpp cp1(1),cp2(2),cp3;
cp3=cp1+cp2;
int cp3n=cp3.n;
结果cp3n=3;
6.使用operator关键字将类的对象转换成int类型
使用方法:operator int()
[cpp]
class CTestMemCpp
{
public:
CTestMemCpp(void);
~CTestMemCpp(void);
int n;
CTestMemCpp(int a)
{
n=a;
}
//使用operator关键字将类的对象转换成int类型
operator int()
{
return n;
}
}
有3种方式可以得到转换后的结果
[cpp]
CTestMemCpp cp1(1);
int a1=int(cp1);
int a2=(cp1);
int a3=cp1;
7.c++运算符大部分都可以重载,但是有些不能重载,如:
.
(成员选择运算符) ::
(作用域限定运算符) *
(指针运算符) ?:
#
上面的五个运算符不能重载,前三个有特殊意义,重载会带来麻烦,#
是预处理标致,不是运算符,?:
没有确定性,重载没意义