2011-08-10 13 views

答えて

11

このコード:

MyString ss(*this); 

は「ssという名前の型MyStringの新しい変数を宣言し、*thisのコピーとして、それを初期化します。」言いますメンバー関数の内部では、thisは受信者オブジェクト(メンバー関数が動作しているオブジェクト)へのポインタであるため、*thisは受信者オブジェクトへの参照です。したがって、これは "と呼ばれる新しいMyStringを作成し、受信者オブジェクトのコピーです"と読むことができます。

operator +operator +=として実装しています。考え方は、受信者オブジェクトのコピーを作成し、operator +=を使用してパラメータをコピーに追加してからコピーを返すことです。これは、対応する複合代入演算子の実装を与えられたフリースタンディング演算子の実装を単純化する、広く使われているトリックです。

希望すると便利です。

+0

問題の「演算子+」はフリースタンディングではなく、メンバー演算子です。そうでなければ「this」はありません:-) –

+0

申し訳ありませんが、私は「自立型」ではありません。それはおそらく最善の用語ではありませんでした。 :-) – templatetypedef

+0

@templatetypedef: "Non-mutating" :) – GManNickG

1

MyStringの現在のオブジェクト(型MyString)の値を引数として取るコンストラクタです。

1

現在のMyStringオブジェクトの内容で新しいMyStringを作成するコピーコンストラクタです。

1

ssは、コピーコンストラクタで作成された新しい文字列です。

3

これは、あるオペレータを別のオペレータで実装するための共通コード再利用技術の例です。

我々はすでに化合物プラスオペレータ定義したとします。この単項演算子は、私たちがa += bを書くことができます

class X 
{ 
    X & operator+=(const X&); 
}; 

を、それがaを変更し、自分自身への参照を返します。これはすべて上質で良い。新しい値を値で返して、abの両方をそのままにして、複写、バイナリ+オペアータa + bを提供したい場合は、複合演算子について既に書いたコードを利用したいと考えています。これは、あなたのコードはまったく同じものだけを少しより冗長である

X X::operator+(const X & b) const { return X(*this) += b; } 
              ^^^^^^^^ 
              temporary copy 

:私たちは一時的なコピーの単項演算子aを呼び出すことによってそれを行います。あなたも書くことができますreturn MyString(*this) += str;

constアクセスに関して非constアクセスを実装する、コピー構成とスワップに関してコピーアサインする、ムーブアサインする移動構成とスワップの面でそれは常にコードの重複を避けるために沸騰します。

関連する問題