淺談C++中的幾種建構函式
阿新 • • 發佈:2018-12-30
3月中旬參加宣講會,做了X軟公司的C++筆試題,裡面有一道“預設拷貝建構函式的題”,由於好久沒複習C++基礎知識,當時連基本的概念都想不來了了。於是乎,開始拿起以前看的譚浩強C++複習起來,現在書快要要啃完了,覺得收穫頗多。好比練武功,祕籍雖然重要,但更重要的還是深厚的內力和紮實的基本功。
C++中的建構函式
C++中的建構函式可以分為4類:
(1)預設建構函式。以Student類為例,預設建構函式的原型為
Student();//沒有引數
(2)初始化建構函式
Student(int num,int age);//有引數
(3)複製(拷貝)建構函式
Student(Student&);//形參是本類物件的引用
(4)轉換建構函式
Student(int r) ;//形參時其他型別變數,且只有一個形參
預設和初始化建構函式
預設建構函式和初始化建構函式在定義類的物件的時候,完成物件的初始化工作。
class Student
{
public:
//預設建構函式
Student()
{
num=1001;
age=18;
}
//初始化建構函式
Student(int n,int a):num(n),age(a){}
private:
int num;
int age;
};
int main()
{
//用預設建構函式初始化物件S1
Student s1;
//用初始化建構函式初始化物件S2
Student s2(1002,18);
return 0;
}
複製(拷貝)建構函式
- 複製建構函式用於複製本類的物件
Student s2(1002,1008);
Student s3(s2);//將物件s2複製給s3。注意複製和賦值的概念不同。
- 下面這種情況叫做賦值,不呼叫複製建構函式。
Student s4;
s4=s2;//這種情況叫做賦值,自己體會吧
- 大多數時候,在類中我們沒有聲明覆制建構函式,而是C++自動為我們生成了一個複製建構函式,如下:
Student(Student &b)
{
this.x =b.x;
this.y=b.y;
}
- 如程式碼所示,它的作用是將一個已存在的物件b,複製給呼叫該複製建構函式的物件。
- 具體來說,在一下情況發生時,會呼叫複製建構函式:
- 用複製的方法,建立一個新物件。
- 函式的形參為類的物件時。(這點和普通型別的形參類似,要複製一份實參給函式)
- 函式的返回值是類的物件,在函式中定義的物件,在函式結束後訊息,需要呼叫複製建構函式,建立一個臨時的物件,將該臨時物件返回給呼叫該函式的物件。
- 預設的複製建構函式,在某些情況下會出現問題,想深入學習可以自行百度。
轉換建構函式
- 轉換建構函式用於將其他型別的變數,隱式轉換為本類物件。
- 下面的轉換建構函式,將int型別的r轉換為Student型別的物件,物件的age為r,num為1004.
Student(int r)
{
int num=1004;
int age= r;
}
- 轉換建構函式可以用在哪裡?
- 假如過載了+號運算子,使得兩個Student類的物件可以相加,其結果為兩個物件的成員變數age之和。
Student s1(01,18);
Student s2(02,20);
s1+s2; //其值就是s1.age + s2.age = 18+20=36。
- 那麼 s1+19 呢(類物件與int直接相加)?
因為我們定義了 轉換建構函式,那麼 s1+19,執行如果過程:
- 首選呼叫+號運算子,發現19不是Student類的物件,而是int型別
- 然後呼叫轉換建構函式,將19變為Student(19)
- 現在便可以進行加法運算,其值是s1.age+ (TempStudentObject).age=18+19 = 37
這裡只是很淺的講了這幾類建構函式的基本概念,如果希望深入學習,網上有很多參考資料.