-1

という名前のクラスの = 割り当てを基本的に実装するCMyStringコードは次のとおりです。コードは正しいです。

CMyString& CMyString::operator =(const CMyString &str) { 
if(this == &str) 
    return *this; 

delete []m_pData; 
m_pData = NULL; 

m_pData = new char[strlen(str.m_pData) + 1]; 
strcpy(m_pData, str.m_pData); 

return *this; 
} 

インスタンスは参照によって渡され、最初の「if」は、渡されたインスタンスがそれ自体であるかどうかをチェックしています。私の質問は、なぜインスタンスのアドレスが含まれて&strいないのに、比較に使用するのですか? strこの行がどのように機能するかを説明できる人はいますか?

また、オブジェクトのアドレスが含まれていることを確認したいだけですthis:これは正しいですか?

4

4 に答える 4

4

str には既にインスタンスのアドレスが含まれていません

いいえ。参照はオブジェクトそのものです。オブジェクトへのポインターではありません。

(つまり、関数の宣言では、「アドレス」ではなく&str「への参照」を表しstrます-関数が次のように宣言されている場合、あなたが話していることは正しいでしょう:str

CMyString& CMyString::operator =(const CMyString *str);

しかし、そうではありません。)

于 2013-04-09T05:38:44.997 に答える
1

演算子のアドレス参照演算子は異なります。

& は、アドレス取得演算子であることに加えて、参照宣言子として C++ で使用されます。意味は同じではありません。

int target;
int &rTarg = target;  // rTarg is a reference to an integer.
                      // The reference is initialized to refer to target.
void f(int*& p);      // p is a reference to a pointer

参照のアドレスを取得すると、そのターゲットのアドレスが返されます。前の宣言を使用すると、&rTarg は &target と同じメモリ アドレスです。

于 2013-04-09T05:41:57.637 に答える
0

str代入演算子に渡されたものは参照によって渡されるため、アドレスではなく実際のオブジェクトが含まれます。Athisは、メソッドが呼び出されているクラスへのポインターであるため、渡されたオブジェクトが同じオブジェクト自体であるかどうかを比較したい場合は、str比較するためにアドレスを取得する必要があります。

&使用する場所によって動作が異なることに注意してください。ステートメントの場合、それが適用されるオブジェクトへのアドレスを取得することを意味します。一方、宣言で使用されている場合は、宣言されたオブジェクトが参照であることを意味します。

次の例を検討してください。

int i = 42;
int & refToI = i; // A reference to i
refToI = 99;
std::cout << i; // Will print 99

int j = 42;
int * pJ = &j; // A pointer to j
*pJ = 99;
std::cout << j; // Will print 99

thisインスタンスへのポインタなので、はい、アドレスが含まれています。

渡されたオブジェクトがそうであるかどうかを確認することの全体的なポイントは、this自己への不必要な(またはおそらく破壊的な)代入を避けることです。

于 2013-04-09T05:46:15.967 に答える
0

&実際、型名の後のシンボルで示される変数参照は、通常、基本的な実装はポインターですが、C++ 標準ではそれを指定していないようです。

とにかく、その使用法では、構文レベルで、参照は同じ型の参照されていない値のように使用されます。より厳密に言えば:

変数の型が の場合、型が であるT &かのように使用されTます。

str.someMethod()and not str->someMethod()(アロー演算子のオーバーロードなし) を記述する必要がある場合は、 を使用& して値のアドレスを取得する必要があります。言い換えれば、参照は多かれ少なかれ変数のエイリアスのように機能し、ポインターのようには機能しません。

参照とポインターの詳細については、次の質問を参照してください。

于 2013-04-09T05:47:36.743 に答える