2013-11-21 173 views
0

在這個程序中,「A的構造函數名爲」打印了2次。我的疑問是,爲什麼「即A的構造」不與爲什麼構造函數沒有被調用

A b = B::getA(); 

印刷而得到印有

A a; 

在這兩種情況下,我們正在創造一個新的對象。

這是我的計劃:

#include <iostream> 
using namespace std; 

class A 
{ 
    public: 
    A() { cout << "A's constructor called " << endl; } 
}; 

class B 
{ 
    static A a; 
    public: 
    B() { cout << "B's constructor called " << endl; } 
    static A getA() { return a; } 
}; 

A B::a; // definition of a 

int main() 
{ 
    A a; 
    A b = B::getA(); 
    return 0; 
} 

回答

3

第一個構造函數被調用在程序啓動時,當內B靜態A創建。

當在堆棧中分配A時,在main內調用第二個構造函數。

沒有更多的調用默認的A構造函數。當你調用getA()時,將使用一個拷貝構造函數,這個編譯器將提供你沒有定義的拷貝構造函數。

1
A b = B::getA(); 

使用複製構造函數初始化b。你只跟蹤默認的構造函數,這裏沒有用到。如果你想跟蹤的拷貝構造函數也一樣,那麼你就需要提供一個:

A(A const &) { cout << "A's copy constructor called " << endl; } 
2

因爲getA()調用拷貝構造函數,你還沒有寫,所以默認一個將被調用。

0

一個contructore獲取調用了「靜態甲a」和「AB :: a」的一個即靜態初始化這是B類

的部件程序的以C,C++所有全局和靜態的執行過程中首先初始化變量。

相關問題