2016-04-14 2 views
-2

は、私の知る限りでは、「この」ポインタは、以下のようにコンパイラによって関数に挿入されたパラメータである。ところで"this"ポインタをフィールドにどのように割り当てることが可能ですか?

class Sample { 
private: 
    int a; 
public: 
    void setA(int a) { 
     this->a = a; 
    } 
}; 

Sample ob; 
ob.setA(5); -> ob.setA(&ob, 5); 

class Sample { 
private: 
    int a; 
public: 
    void setA(Sample* this, int a) { 
     this->a = a; 
    } 
}; 

、私はCONSTフィールドに「この」ポインタを割り当てることを何か混乱のコードを発見しました。 (下記参照)

class Test { 
    int data; 
public: 
    Test* const test = this; 
    Test(int data = 1) : data(data) { } 
    Test(Test &test) : data(test.data) { } 
}; 
(It has no compile Errors and runs well!) 

"this"ポインタが関数経由で伝達されているのであれば、どのようにすることができますか? 私は考えていません.. いくつかのアドバイスをお願いします。私はあなたのすべての応答に感謝しています。

+4

あなたはどのような問題を解決しようとしていますか? –

+1

等号は必ずしも代入を意味するものではありません。文脈によっては、さまざまな意味があります。この場合、「初期化」を意味します。 –

+0

const変数に値を "代入"する別の方法があります: 'const int a = 5;' –

答えて

2

この構文:

Test* const test = this; 

はC++ 11から来ています。これは、 "testtestを明示的に初期化していない非コピーコンストラクタ内にtestthisを初期化する"という意味です。

この結果、このコードはコンストラクタ内で実行され、thisは完全に有効です。しかし、この種の初期化を行う利点は不明であり、testの使用に依存すると危険です。

+0

"明示的に"という言葉は間違っているようです:すでに 'test'を暗黙的に初期化しているコンストラクタの中で、' test'を 'this'に初期化しません:コンパイラ生成コピーコンストラクタは' test'の値をうまくコピーします。 – hvd

+0

@hvd、もちろん、私はコピーコンストラクタを意味しませんでした。私にはっきりさせてください。 – SergeyA

0

クラス(この場合はTest.test)のプロパティは、コンパイラによって生成されたコードによって暗黙的に初期化されます。関数があり、それはポインタを受け取りますが、それはコンパイラによって生成されたものなので、それを見ることはできません。

関連する問題