關於sizeof 與 複製構造函數

來自 劍指offer  名企面試官精講典型編程題


sizeof:

1. 定義一個空的類型,裏面沒有任何成員變量和成員函數。對該類型求sizeof,得到的結構式多少?

答:答案是1


2. 爲什麼不是0?

答:空類型的實例中不包含任何信息,本來求sizeof應該是0,但是當我們聲明該類型的實例的時候,它必須在內存中佔有一定的空間,否則無法使用這些實例。至於佔用多少內存,由編譯器決定。vs中每個空類型的實例佔用1字節的空間。


3. 如果在該類型中添加一個構造函數和析構函數,再對該類型求sizeof,得到的結果又是多少?

答:和前面一樣,還是1.調用構造函數和析構函數只需知道函數的地址即可,而這些函數的地址只與類型相關,而與類型的實例無關,編譯器也不會因爲這兩個函數而在實例中添加任何額外的信息。


4. 那如果把析構函數標記爲虛函數呢?

答:C++的編譯器一旦發現一個類型中有虛擬函數,就會爲該類型生成虛函數表,並在該類型的每一個實例中添加一個指向虛函數表的指針。在32爲的機器上,一個指針佔4字節的空間,因此得到4;如果是64位的機器,一個指針佔8字節的空間,因此求sizeof得到8.


複製構造函數:

class A
{
    private:
	int value;
    public:
	A(int n){value = n;}
	A(A other){value = other.value;}
	void print(){std::cout << value << std::endl;}
};

int _tmain(int argc,_TCHAR* argv[])
{
    A a = 10;
    A b = a;
    b.Print();
    return 0;
}

在上述代碼中,複製構造函數A(A other)傳入的參數是A的一個實例。由於是傳值參數,我們把形參複製到實參會調用複製構造函數。因此如果允許複製構造函數傳值,就會在複製構造函數內調用複製構造函數,就會形成無休止的遞歸調用從而導致棧溢出。因此C++標準不允許複製構造函數傳值參數,在vs和GCC中都將編譯出錯。要解決這個問題,我們可以把構造函數修改爲A(const A& other),也就是把傳值參數改爲常量應用。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章