2015-09-25 110 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的其他用法,所以它可能被构造在另一个不可见的代码部分中。