2014-03-25 36 views
3

我看到一個關於構造函數的在線C++測試。我可以找出大部分的答案,但在下面的一些問題上感到困惑。希望有人能幫助我。類的構造函數如何在C++中工作

下面是這個例子。

#include <iostream> 

class A { 
    public: 
      A(int n = 0) : m_n(n) { 
        std::cout << 'd'; 
      } 

      A(const A& a) : m_n(a.m_n) { 
        std::cout << 'c'; 
      } 

    private: 
      int m_n; 
}; 

void f(const A &a1, const A &a2 = A()) 
{ 
} 

int main() { 
    A a(2), b; 
    const A c(a), &d = c, e = b; 
    b = d; 
    A *p = new A(c), *q = &a; 
    static_cast<void>(q); 
    delete p; 
    f(3); 
    std::cout << std::endl; 

    return 0; 
} 

我真的不明白,爲什麼是「& d = C」不輸出任何東西。還添加了另一個重載構造函數,如A(const A * a):m_n(a-> m_n){std :: cout < <'b'; }不會爲* q = & a輸出任何內容。那麼我能做些什麼才能使它工作?

非常感謝您的任何建議。我對此很好奇。

回答

8

有沒有輸出,這些因爲dqA類型的沒有,即他們是A對象。d參考Aq指針A。初始化一個引用並初始化或分配一個指針不會操縱所引用的/指向的對象,因此不會輸出。

爲了解決您的問題 - 沒有什麼可以「開展工作」,它就像它應該的那樣工作。

+0

謝謝。現在清除。 :-) – ToonZ

1

&d = c不會輸出任何內容,因爲您沒有調用構造函數。

如果我們展開的代碼片段有點...

A &d = c 

什麼你的代碼是說有「申報d是一個參考類型爲A的對象,指向c」 。因爲你正在創建一個引用,所以你不會調用構造函數,cd是同一個對象。

這同樣適用於q,但不是創建一個引用,而是創建一個指針併爲其指定A類型的現有實例的地址。構造函數沒有被調用,因爲你沒有創建一個單獨的對象,你正在鏈接到一個現有的對象。

2

這更清晰

const A c(a), &d = c, e = b; 

const A c(a); 

const A &d = c; 

這裏d聲明爲參照A型的對象時,它不會創建一個新的對象,我會改寫這個說法。它指的是已經創建的對象。在這種情況下,d參照c。事實上,d只是對象c的別名。

此代碼段

A *p = new A(c), *q = &a; 

也可以改寫爲簡單起見

A *q = &a; 

在此聲明指針q被簡單地通過的地址分配。這兩個對象都不會創建。現在簡單地指出已經創建的早期對象a。