5

簡単な質問です。C++ での *this の動作を理解したい。検索エンジンが * をワイルドカード文字として解釈するため、これが明白すぎる場合や繰り返しである場合は、ご容赦ください。

私は他の人のコードを使用しています。これには、次のような多くの機能があります。

(Nの型は構造体)

N N::someMethod() const {

    N n = *this;
    // do a function that modifies internal values of the struct
    n.modify();
    return n;

}

何が起こるかというと、元の構造体の変更されたコピーが返され、元の構造体は変更されていません。

どういうわけか*これはコピーを作成していると思いますが、理由/方法がわかりません。これは構造体に関係する魔法ですか?関数宣言のconstですか?舞台裏で別の魔法が行われているのでしょうか?

私の理解では、「これ」はポインターです。あなたが * ポインターの場合、単にそのポインターを逆参照しただけだと思っていましたか?? (だから私は n がオリジナルと同じメモリのチャンクを指していると思っていましたが、明らかにそうではないので、私の直感は壊れています)

よろしければ、私のやり方の間違いを詳しくご指摘ください。大丈夫です。私は、ボンネットの下で何が起こっているかについての詳細な技術的議論を理解するのに十分賢いです、約束します!

4

6 に答える 6

13

いいえ、これは時間の夜明け前からの魔法です(薄くベールをかぶったナルニアの参照)。C言語を思い起こさせます。

thisは単に現在のオブジェクトへのポインタであるため、は*thisオブジェクト自体であり、次の行です。

N n = *this;

上記のオブジェクトのコピーを作成するだけです。次に、そのコピーを変更して返します。

同じオブジェクトへのポインターのコピーが必要な場合は、次のようになります。

N *n = this;

以下と変わりません。

int xyzzy = 7;           // xyzzy holds 7.
int *pXyzzy = &xyzzy;    // the address of xyzzy.

int plugh = *pXyzzy;     // a *different* address, also holding 7.
int *pTwisty = pXyzzy;   // copy *address*, pXyzzy/pTwisty both point to xyzzy.
于 2012-10-25T06:27:05.817 に答える
6

*thisそれ自体ではコピーを作成しません。 によって呼び出されるコピー コンストラクターの型を正しくするだけN n = ...です。

于 2012-10-25T06:27:45.663 に答える
3

の型thisは「N へのポインター」であるため*this、 に適用される逆参照演算子*thisNです。式で実行されるコピーはありません*this。が指すオブジェクトへの参照を提供するだけthisです。

残りはコピーの初期化です。

N n1;
N n2 = n1; // initialize n2 copying the value of n1
于 2012-10-25T06:27:10.740 に答える
3
N n = *this;

コピーの初期化と呼ばれます。通常はコピーを作成します。

*thistype のオブジェクトNに変換しようとすることで暗黙的な変換シーケンスを構築し、そのオブジェクトを to-initialized オブジェクトにコピーして、コピー コンストラクターを呼び出します。

于 2012-10-25T06:27:23.573 に答える
1

「これ」がポインターであることは正しいです。「これ」は、意味がある場合、内部にあるオブジェクトのインスタンスへのポインターです。

問題は「N n = *this」行だと思います。

ポインターを逆参照し、コピー コンストラクターを呼び出しました。これは、コピーを作成している行です。

あなたが探しているのは、これに沿ったものだと思います:

N * N::someMethod() {

    this->modify();
    return this;
}

-> 演算子は、「(*this)」と書くのと同じです。

メソッドをポインターを返すように変更したことに注意してください。そうしないと、この関数の戻り値を別のものに割り当てるときに、コピー コンストラクターを再度呼び出すことになる可能性があります。

また、modify が const メソッドでもある場合を除き (名前を考えると、これはありそうもないことです)、someMethod を const メソッドとして記述できないはずです。(const メソッドでオブジェクトの論理内容を変更することはできません。)

于 2012-10-25T06:32:49.450 に答える
1

符号が存在する場合でも、作業はコピー コンストラクターによって行われます=

次のコードは、その実行のエコーを示しています。

#include <iostream>

class N {
public:

   N(){}

   N( const N & n ) {
      std::cout << "N( const N & n )" << std::endl;
   }

   N& operator = ( const N & n ) {
      std::cout << "N& operator = ( const N & n )" << std::endl;
      return *this;
   }

   N modify() const {
      std::cout << "modify|entry" << std::endl;
      N n2 = *this;
      std::cout << "modify|exit" << std::endl;
      return n2;
   }
};

int main() {
   N n1;
   n1.modify();
}

この出力で:

modify|entry
N( const N & n )
modify|exit
N( const N & n )
于 2012-10-25T06:27:12.823 に答える