誰かがこのコードを説明できますか?私は行3を理解していません:*これを含むC++コードが混乱していますか?
MyString MyString::operator+(const MyString &str)
{
MyString ss(*this); //----> explain this part
ss += str;
return ss;
}
ありがとう!
誰かがこのコードを説明できますか?私は行3を理解していません:*これを含むC++コードが混乱していますか?
MyString MyString::operator+(const MyString &str)
{
MyString ss(*this); //----> explain this part
ss += str;
return ss;
}
ありがとう!
このコード:
MyString ss(*this);
は「ss
という名前の型MyString
の新しい変数を宣言し、*this
のコピーとして、それを初期化します。」言いますメンバー関数の内部では、this
は受信者オブジェクト(メンバー関数が動作しているオブジェクト)へのポインタであるため、*this
は受信者オブジェクトへの参照です。したがって、これは "と呼ばれる新しいMyString
を作成し、受信者オブジェクトのコピーです"と読むことができます。
operator +
をoperator +=
として実装しています。考え方は、受信者オブジェクトのコピーを作成し、operator +=
を使用してパラメータをコピーに追加してからコピーを返すことです。これは、対応する複合代入演算子の実装を与えられたフリースタンディング演算子の実装を単純化する、広く使われているトリックです。
希望すると便利です。
MyString
の現在のオブジェクト(型MyString
)の値を引数として取るコンストラクタです。
現在のMyStringオブジェクトの内容で新しいMyStringを作成するコピーコンストラクタです。
ss
は、コピーコンストラクタで作成された新しい文字列です。
これは、あるオペレータを別のオペレータで実装するための共通コード再利用技術の例です。
我々はすでに化合物プラスオペレータ定義したとします。この単項演算子は、私たちがa += b
を書くことができます
class X
{
X & operator+=(const X&);
};
を、それがa
を変更し、自分自身への参照を返します。これはすべて上質で良い。新しい値を値で返して、a
とb
の両方をそのままにして、複写、バイナリ+オペアータa + b
を提供したい場合は、複合演算子について既に書いたコードを利用したいと考えています。これは、あなたのコードはまったく同じものだけを少しより冗長である
X X::operator+(const X & b) const { return X(*this) += b; }
^^^^^^^^
temporary copy
:私たちは一時的なコピーの単項演算子a
のを呼び出すことによってそれを行います。あなたも書くことができますreturn MyString(*this) += str;
constアクセスに関して非constアクセスを実装する、コピー構成とスワップに関してコピーアサインする、ムーブアサインする移動構成とスワップの面でそれは常にコードの重複を避けるために沸騰します。
問題の「演算子+」はフリースタンディングではなく、メンバー演算子です。そうでなければ「this」はありません:-) –
申し訳ありませんが、私は「自立型」ではありません。それはおそらく最善の用語ではありませんでした。 :-) – templatetypedef
@templatetypedef: "Non-mutating" :) – GManNickG