2015-09-25 31 views
-5

我知道幾乎所有的事情都在'全局'主題上說過。在這裏回到道歉的道歉。生產代碼中有一些東西,我不完全理解。非常感謝這方面的幫助。所以提前謝謝。Globals再一次

考慮下面的實現:

file1.h

class classA 
{ 
    classA(); 
    // something in 
}; 

const classA& GetClassA(); 

file1.cpp

classA::ClassA() 
{ 

    cout << "I have been called"; 

    // do initialization 
} 


const classA obA; 

const classA& GetClassA() { return obA; } 

的GetClassA功能全部叫到身邊。翻譯單元中可以看到同樣的全局對象(我認爲)(至少這是我的期望)。然而(神祕地對我來說)看起來好像classA c-tor被多次調用。任何人都可以詳細說明,請問?

+0

'const A;'無效,你的意思是'const classA A;'? –

+0

對不起,讓我糾正 – AdR

+1

到目前爲止,您發佈的代碼中沒有任何內容會導致構造函數被多次調用。 – AnT

回答

3

相同的全局對象(我認爲)在翻譯單元中是可見的(至少這是我的期望)。

不,它只在聲明的翻譯單元中「可見」,而且似乎只在其中的一箇中聲明。

而在這種情況下,全局聲明爲const這意味着它具有內部鏈接,因此即使他們聲明瞭其他翻譯單元也不能引用它。

對所有TU都可見的函數是參考返回全局參數的函數,所以其他TU不能直接引用該對象,但可以通過調用該函數來獲取對象的引用。

你說得對,構造函數不會被多次調用。據推測,其他代碼正在創建相同類型的實例,或者複製該函數返回的實例。

3

假設const A是一個錯字,而不是const classA所提供的代碼應該只構造一次A.然而,由於這裏沒有任何東西阻止classA的其他用法,所以它可能被構造在另一個不可見的代碼部分中。