复制引用运算符返回引用,而不是使用关键字'这'



我想问一个关于复制引用运算符的问题。

我有下面一个名为Mystring的类,并且我有一个复制引用操作符,它很有效。

#ifndef _MY_STRING_
#define _MY_STRING_
class Mystring
{
private:
char *str; // pointer to a char[] that holds a c-style string
public:
Mystring(); // no args
Mystring(const char *s); // overloaded
Mystring(const Mystring &source); // copy
~Mystring(); // destructor
Mystring &operator=(const Mystring &rhs);// overloaded copy assignment operator
void display() const; // getters
int get_length() const;
const char *get_str() const; // pointer is returned
};
#endif // _MY_STRING_

这就是复制参考操作员的功能:

// Overloaded assignment copy operator
Mystring &Mystring::operator = (const Mystring &rhs) {
std::cout << "Copy assignment" << std::endl;
if (this == &rhs) // check the pointer is on the same address of rhs i.e. & = reference operator
return *this; // returns the reference
delete [] this->str;
str = new char [std::strlen(rhs.str) + 1];
std::strcpy(this->str, rhs.str);
return *this;
}

我是C++的初学者,所以这很令人困惑,但我会尝试描述发生了什么。

我知道有一个this运算符,它充当指针。当取消引用时,它允许我们处理对象本身。

来自第一行

Mystring &Mystring::operator = (const Mystring &rhs)

我可以看到,我将有一个返回引用的运算符函数,因为声明中存在&运算符。

然而,在if语句和整个函数的末尾,我们声明

return *this

尽管根据我上面的解释,如果我们取消引用this,我们将返回对象而不是引用。

Microsoft c++文档也说明了

表达式*this通常用于从成员函数返回当前对象:

要澄清的是,this是指向当前对象的指针,因此*this然后返回它应该意味着我返回的是该对象,而不是另一个引用。

我在理解这段代码时犯了什么错误?

在C++中,有些表达式的求值仅决定对象的标识。它们被称为glvalue表达式。这是表达式*this的情况。CCD_ 9保持表示存储器中的地址的值,并且表达式CCD_。将其称为评估可能很奇怪,这只是一个指定:*this指定位于this保持的地址处的对象。

一个返回引用的函数,当调用时会导致glvalue:它只指定一个对象。在operator =的情况下,该对象是由返回语句*this中的表达式指定的对象。

要澄清的是,this是指向当前对象的指针,因此*this然后返回它应该意味着我返回的是对象,而不是另一个引用。

您是正确的,this是指针,*this是指针指向的对象。

然而,看看你是如何处理推荐信的。例如,考虑通过引用将值传递给函数。它是通过以下方式完成的:

void foo(char &param) {
// do something
}
int main(int argc, char **argv) {
int x = 5;

foo(x);

return 0;
}

请注意,变量x是通过引用传递的,但不需要&*来指示编译器。这是因为编译器可以自己解决问题。这也是您返回*this的原因,它被理解为参考。

最新更新