1. 程式人生 > >淺談C++中的幾種建構函式

淺談C++中的幾種建構函式

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,複製給呼叫該複製建構函式的物件。
  • 具體來說,在一下情況發生時,會呼叫複製建構函式:
    1. 用複製的方法,建立一個新物件。
    2. 函式的形參為類的物件時。(這點和普通型別的形參類似,要複製一份實參給函式)
    3. 函式的返回值是類的物件,在函式中定義的物件,在函式結束後訊息,需要呼叫複製建構函式,建立一個臨時的物件,將該臨時物件返回給呼叫該函式的物件。
    4. 預設的複製建構函式,在某些情況下會出現問題,想深入學習可以自行百度。

轉換建構函式

  • 轉換建構函式用於將其他型別的變數,隱式轉換為本類物件。
  • 下面的轉換建構函式,將int型別的r轉換為Student型別的物件,物件的age為r,num為1004.
 Student(int r)
 {
     int num=1004int 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,執行如果過程:

    1. 首選呼叫+號運算子,發現19不是Student類的物件,而是int型別
    2. 然後呼叫轉換建構函式,將19變為Student(19)
    3. 現在便可以進行加法運算,其值是s1.age+ (TempStudentObject).age=18+19 = 37
  • 這裡只是很淺的講了這幾類建構函式的基本概念,如果希望深入學習,網上有很多參考資料.

相關係列