复制引用运算符,使用关键字“ this”返回引用而不是对象

问题描述

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

我有一个名为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就是这种情况。 this保留一个代表内存中地址的值,表达式*this评估该地址处对象的身份。称它为评估值可能很奇怪,这只是一个名称:*this指定位于this所持有地址的对象。

一个返回引用的函数,当在 glvalue 中调用result时:它仅指定一个对象。对于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并被理解为参考的原因。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...