[英]Why can I call the private constructor from ?global scope?
此代碼編譯並運行沒有錯誤:
class foo{
static foo *ref;
foo(){}
public:
static foo *getRef(){
return ref;
}
void bar(){}
};
foo* foo::ref = new foo; // the construcrtor is private!
int main(int argc, const char *argv[])
{
foo* f = foo::getRef();
f->bar();
return 0;
}
有人可以解釋為什么可以調用構造函數?
該范圍不是全局的 - 靜態成員屬於類范圍,因此它們的初始化表達式也在類范圍內。
答案是它在全球范圍內不可用。 靜態成員的初始化程序被定義為在類范圍內,因此它可以訪問私有成員。
§9.4.2/ 2 [...]靜態數據成員定義中的初始化表達式在其類的范圍內(3.3.6)。
在較舊的c ++中,這種靜態成員的初始化形式不是必需的。 它們在c ++的后期版本中被強制執行。
並且,這種形式的靜態成員初始化通常用於在創建任何類對象之前初始化靜態成員。
(E.g) int MyClass::objectsCounter=0;
但是,通過,
foo* foo::ref = new foo;
這個語句只是通過創建一個新對象初始化一個靜態成員(它是指針類型)。
在這種情況下,您通過調用其自己的類的私有方法來初始化私有成員。
因此,這里沒有全球范圍的作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.