如何解决复制引用运算符,使用关键字“ 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 ¶m) {
// do something
}
int main(int argc,char **argv) {
int x = 5;
foo(x);
return 0;
}
请注意,变量x是通过引用传递的,但不需要&
或*
来指示编译器。这是因为编译器可以自行解决。这也是为什么您返回*this
并被理解为参考的原因。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。