C/C++——建構函式、複製建構函式和解構函式的執行時刻

readyao發表於2016-01-15

指出下面程式的輸出結果:

<span style="font-size:14px;">/*************************************************************************
	> File Name: test.cpp
	> Author: 
	> Mail: 
	> Created Time: 2016年01月16日 星期六 20時32分46秒
 ************************************************************************/

#include <iostream>
using namespace std;

class A
{
    public:
        A(){cout << "A" << endl;}
        ~A(){cout << "~A" << endl;}
};

class B
{
    public:
        B(){cout << "B" << endl;}
        B(A & a):_a(a){cout << "B(a)" << endl;}

        ~B(){cout << "~B" << endl;}

    private:
        A _a;
};


int main()
{
    A a;
    B b(a);

    return 0;
}
</span>

這個題目是考察對建構函式和解構函式以及複製建構函式的瞭解

1: A a; 該語句會呼叫類A的建構函式,所以會輸出A;

2: B b(a); 該語句中的a是上面的物件,所以不會再次輸出A,又因為該語句是生成物件b並呼叫類B的複製建構函式,會輸出B(a);

你可能會奇怪,物件b中有一個成員是物件_a ,但是沒有輸出A,這是因為在生成物件b的時候也是生成物件_a的時候,它會呼叫類A的複製建構函式,此時是不會呼叫類A的建構函式的,所以不會輸出A。

3: 建構函式和解構函式是對稱的。當離開程式的時候會執行物件的解構函式。首先是執行物件b的解構函式(輸出~B),再是物件b中物件_a的解構函式(輸出~A),最後會執行物件a的解構函式(輸出~A)。

程式的輸出結果如下:

<span style="font-size:14px;">A
B(a)
~B
~A
~A</span>

例子2:將main函式裡宣告一個類B的物件c ,main函式如下:

<span style="font-size:14px;">int main()
{
    B c;

    return 0;
}</span>

B c; 首先會呼叫類A的建構函式來構造物件_a輸出A,然後呼叫類B的建構函式輸出B;

離開程式的時候會先執行類B的解構函式輸出~B,然後再呼叫類A的解構函式輸出~A;

程式的輸出結果如下:

A
B
~B
~A

相關文章