-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避免对 self 进行不必要的(或可能是破坏性的)赋值。

于 2013-04-09T05:46:15.967 回答
0

虽然确实是一个变量引用 - 由&类型名称后面的符号表示 - 底层实现通常是一个指针,但 C++ 标准似乎没有指定它。

无论如何,在其用法中,在语法级别,引用的使用就像相同类型的非引用值,即。更严格地说:

如果变量的类型是T &,那么它应该像它的类型一样使用T

如果你必须写str.someMethod()而不写str->someMethod()(没有任何箭头运算符的重载),那么你必须使用& 来获取值的地址。换句话说,引用的行为或多或少类似于变量的别名,而不是指针。

有关引用和指针的更多信息,请参阅以下问题:

于 2013-04-09T05:47:36.743 回答