关于指针:关于运营商的C ++访谈

C++ interview about operator

下面是代码,它基本上实现了名为CMyString的类的=赋值,代码是正确的。

1
2
3
4
5
6
7
8
9
10
11
12
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包含对象的地址:这是正确的吗?


isn't str already contains the address of the instance

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

(即,在功能声明中,&str代表"提及str"而不是"str的地址"—如果功能声明如下,您所说的将是正确的:

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

但事实并非如此。


操作员和参考操作员的地址不同。

除了作为运算符的地址之外,在C++中使用AN&AMP作为引用声明符。意思不一样。

1
2
3
4
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的内存地址相同。


实际上,一个由符号EDCOX1(6)所表示的变量引用在类型名底层实现通常是指针之后,C++标准似乎并不指定它。

在其用法中,在语法级别,引用的使用方式类似于同一类型的非引用值,即更严格地说:

如果变量类型为T &,则应将其用作T类型。

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

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

  • 当应用于变量名时,*和&;的含义是什么?
  • C++中指针变量与引用变量的区别是什么?
  • 为什么"this"是指针而不是引用?

传递给赋值运算符的str是通过引用传递的,因此它包含实际对象,而不是其地址。this是一个指向正在调用的类a方法的指针,因此如果要比较,传递的对象是否是同一个对象本身,就必须得到str的地址才能进行比较。

注意,&的行为不同,这取决于它在哪里使用。如果在语句中,则意味着获取应用它的对象的地址。另一方面,如果在声明中使用,则表示声明的对象是引用。

请考虑以下示例:

1
2
3
4
5
6
7
8
9
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或不是this的话,那么整个验证点就是为了避免不必要(或者可能是破坏性的)分配给自己。