关于运营商的C ++访谈

时间:2013-04-09 05:35:35

标签: c++ pointers reference variable-assignment

这是基本上为名为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 个答案:

答案 0 :(得分:4)

  

不是str已经包含实例的地址

没有。引用是对象本身。它不是指向对象的指针。

(即,在函数声明中,&str代表“str的引用”和str的地址” - 如果函数声明如下,那么你所说的是正确的:

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

但事实并非如此。)

答案 1 :(得分:1)

Address-of OperatorReference 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()(没有任何箭头运算符重载),则必须使用&来获取值的地址。换句话说,引用或多或少类似于变量的别名,而不像指针。

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