1.哪些類需要自己定義構造函數?
含有內置類型或者符合類型成員的類,通常應該定義自己的默認構造函數初始化這些成員。
對於具有類類型的成員,編譯器創建的默認構造函數會調用類類型成員所屬類自身的默認構造函數實現該成員變量的初始化。
對於具有內置類型的成員,編譯器創建的默認構造函數會1.如果對象(類對象)定義在全局作用域(函數外)或者是靜態局部對象,則內置類型(類成員變量)初始化爲0
2.如果對象定義在局部作用域中,則內置類型未進行初始化。
2.重載函數,同一個函數名,根據形參表(區別重載函數的唯一標準,返回值不用於區別重載函數)的不同,編譯器調用不同的函數實現。
bool lookup(const account&);
Record lookup(const account&);//只有返回值不同,該函數定義是error的
//下面的函數不是重載函數而是同一個函數
Record lookup(phone);
Record lookup(const phone);//值傳遞,複製形參時不考慮是否爲const,函數操作的只是副本,函數無法修改實參。
有const引用形參,有非const引用形參的函數
有指向const類型的指針形參,有指向相同類型非const對象的指針則屬於函數的重載。
Record lookup(const phone&, const name&);
Record lookup(const phone&, const name& = " ");//默認實參並沒有改變形參的個數,所以屬於函數的重複定義
2.1局部聲明的函數會屏蔽而不是重載外層作用域中聲明的同名函數(所以要求重載函數都生命在同一作用域中,如果聲明在頭文件中)
void print(const string &);
void print(double);//overloads,print函數的重載
void foodBar()
{
void print(int);//函數的聲明,屏蔽了外部的print
print("value");//error,因爲void print(const string &);被屏蔽了,這裏調用的是void print(int);明顯實參和形參不匹配,出現error
print(3.14);//ok,但是調用的void print(int),值傳遞時候隱式轉換,實際爲print(3);,void print(double);被屏蔽了
}
3.帶默認形參的函數(一般是在聲明的時候指定默認形參)
bool adsCheckIsSmallRect(adsRect& rect, adsInt & getSP = 0); //error, 因爲adsInt & getSP = 0, 左邊是adsInt &, 而右邊是adsInt, 相當於是引用的
//初始化問題,引用的右值應該是一個變量
帶默認值的意思是表示,調用的時候可以不給形參賦實參,而去用默認的實參值。但是在函數聲明的時候必須還是要寫全所有的形參列表。
默認值的指定可以在函數定義或者聲明的時候指定一次。
void fun(int *p = NULL) //帶默認實參
{
int q=50;
*p=q; //p所指的內存爲空,不能訪問一個空的內存,“段錯誤”
}
如果要按上面的方法來的話(利用指針形參返回局部變量+帶默認實參)可以加個if條件
void fun(int *p = NULL)
{
int q=50;
if(p)
*p=q;
}
這樣在調用的時候,如果直接調用fun();(有可能會報錯,因爲不知道調用的是void fun(void),還是void fun(int *p =NULL))則表明不返回局部變量值
如果調用的是int temp = 0; fun(&temp); 則可以通過temp返回局部變量值q。