2010-11-05 118 views
1
// declare a class with private variable 「int * _a」 

// declare a function of this class, foo() 

Void foo() { 

int * _a; // 1. Does this re-declaration then make _a equal to an unknown value? 
      // 2. Does a go out of scope after foo() returns? 

} 
+1

你的意思是'void'? – 2010-11-05 22:30:34

+0

你的意思是'Klass :: foo()'? – wilhelmtell 2010-11-05 22:31:57

+1

請張貼至少需要編譯的代碼。正如所寫,不僅代碼被破壞,而且foo不是任何類的成員函數。 – catphive 2010-11-05 22:33:25

回答

7
  1. 是否然後該再聲明使_a等於未知值?

不,這不是「重申聲明」。它是一個名爲_a的局部變量的聲明。它是未初始化的。

它與類成員變量_a沒有任何關係。在本地_a的聲明之後,您不能使用_a(因爲_a指的是本地變量!)而不再訪問成員變量_a,但可以使用this->_a來引用它。

  1. 做了走出去的範圍後foo()回報?

是的。局部變量在其聲明範圍結束時超出範圍(這就是「超出範圍」的原因)。

1

這就是所謂的shadowingfoo()的本地指針_a給同名的成員指針造成陰影。由於foo()是該類的成員,因此對_a的任何引用都將解析爲本地指針。而且,由於任何範圍變量,這個指針在超出範圍時會自動銷燬它自己。不用說,成員指針將保持活着,只要其擁有的實例處於活動狀態。

要訪問成員數據,您必須說this->_a