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?

}
4

2 に答える 2

7
  1. この再宣言は_a、未知の値に等しくなりますか?

いいえ。これは「再宣言」ではありません。これは、という名前のローカル変数の宣言です_a。初期化されていません。

クラスメンバー変数とは何の関係もありません_a。ローカルの宣言後、を使用し_aてメンバー変数にアクセスすることはできなくなります(ローカル変数を参照するためです!)が、を使用して参照することはできます。_a_a_athis->_a

  1. foo()返品後にスコープ外になりますか?

はい。ローカル変数は、宣言されたスコープが終了するとスコープ外になります(これが「スコープ外」の原因です)。

于 2010-11-05T22:29:04.887 に答える
1

これがいわゆるシャドウイングです。foo()のローカルポインタ_aは、同じ名前のクラスのメンバーポインタをシャドウします。それfoo()がクラスのメンバーであるとすると、への参照はすべて_aローカルポインタに解決されます。さらに、スコープ変数と同様に、このポインターはスコープ外になると自動的に破棄されます。言うまでもなく、メンバーポインターは、それを所有するインスタンスが存続している限り存続します。

メンバーデータにアクセスするには、言う必要がありますthis->_a

于 2010-11-05T22:31:31.610 に答える