一.函數
1.函數重載,函數覆蓋,函數隱藏三者的區別,概念
函數重載:在一個類中,函數與函數的函數名相同,參數類型或者參數的個數不同
函數覆蓋:在基類和派生類中,基類的函數必須是虛函數,兩個類中的函數與函數的函數名相同,參數類型和個數也完全相同
函數隱藏:在基類和派生類中,基類的函數必須不是虛函數,兩個類中的函數與函數的函數名相同,參數類型和個數不考慮(相同不相同都無所謂)
2.const成員函數
如果想在一個函數中不允許修改(全局)的成員變量值,那麼可以將該函數定義爲const成員函數,如:
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.函數的默認參數:函數的的參數在聲明的時候也可以進行初始化,初始化之後就可以在使用的時候不需要填寫形參
void func(int a,int b,int c=5)
{
cout<<"a:"<<a<<"b:"<<b<<"c:"<<c<<endl;
}
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.前置++和後置++的重載
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;
}
};
CTestMemCpp *cp=new CTestMemCpp();
int a=++*cp;
int b=(*cp)++;
結果:a=1 b=0
前置++和後置++重載的時候怎麼才能讓編譯器區分出來呢?爲了區分他們,我們需要在後置++的運算符後添加一個int類型的參數(int a),這個參數沒有任何意義,它也不會傳遞到函數體中,它只是operator++()函數設置的一個信號,該信號提醒編譯器,目前添加了參數的函數是一個後置自加的運算符函數
5.兩個對象相加的+運算符重載
class CTestMemCpp
{
public:
CTestMemCpp(void);
~CTestMemCpp(void);
int n;
CTestMemCpp(int a)
{
n=a;
}//對象+重載
CTestMemCpp operator+(CTestMemCpp &cp)
{
return CTestMemCpp(n+cp.n);
}
};
CTestMemCpp cp1(1),cp2(2),cp3;
cp3=cp1+cp2;
int cp3n=cp3.n;
結果cp3n=3;
6.使用operator關鍵字將類的對象轉換成int類型
使用方法:operator int()
class CTestMemCpp
{
public:
CTestMemCpp(void);
~CTestMemCpp(void);
int n;
CTestMemCpp(int a)
{
n=a;
}
//使用operator關鍵字將類的對象轉換成int類型
operator int()
{
return n;
}
}
有3種方式可以得到轉換後的結果
CTestMemCpp cp1(1);
int a1=int(cp1);
int a2=(cp1);
int a3=cp1;
7.c++運算符大部分都可以重載,但是有些不能重載,如:
.(成員選擇運算符) ::(作用域限定運算符) *(指針運算符) ?: #
上面的五個運算符不能重載,前三個有特殊意義,重載會帶來麻煩,“#”是預處理標緻,不是運算符,“?:”沒有確定性,重載沒意義