我想问一个关于复制引用运算符的问题。
我有下面一个名为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 ¶m) {
// do something
}
int main(int argc, char **argv) {
int x = 5;
foo(x);
return 0;
}
请注意,变量x是通过引用传递的,但不需要&
或*
来指示编译器。这是因为编译器可以自己解决问题。这也是您返回*this
的原因,它被理解为参考。