这是基本上为名为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
包含对象的地址:这是正确的吗?
答案 0 :(得分:4)
不是str已经包含实例的地址
没有。引用是对象本身。它不是指向对象的指针。
(即,在函数声明中,&str
代表“str
的引用”和不“str
的地址” - 如果函数声明如下,那么你所说的是正确的:
CMyString& CMyString::operator =(const CMyString *str);
但事实并非如此。)
答案 1 :(得分:1)
Address-of Operator和Reference Operator不同。
&除了作为address-of运算符之外,在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相同的内存地址。
答案 2 :(得分:0)
str
由引用传递,因此它包含实际对象,而不是其地址。 this
是一个指向正在调用方法的类的指针,因此如果想要比较,传递的对象是否是同一个对象本身,他必须得到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
,则应避免对自己进行不必要的(或可能是破坏性的)任务。
答案 3 :(得分:0)
虽然确实是一个变量引用 - 在类型名称之后用符号&
表示 - 底层实现通常是指针,但C ++标准似乎没有指定它。
无论如何,在其用法中,在语法级别,使用类似于相同类型的非引用值的引用,即。更严格地说:
如果变量的类型是T &
,那么它应该像T
类型一样使用。
如果您必须编写str.someMethod()
而不是str->someMethod()
(没有任何箭头运算符重载),则必须使用&
来获取值的地址。换句话说,引用或多或少类似于变量的别名,而不像指针。
有关引用和指针的更多信息,请参阅以下问题: