C++赋值运算符重载中this指针与*this返回的困惑求助
*this而不是this? 嘿,我完全懂你的困惑——这个点刚学C++的时候确实容易绕晕,咱们把它拆解开说清楚:
首先,先盯紧你的赋值运算符的返回类型:SimpleString& operator=(const SimpleString& other),这里的返回类型是SimpleString&,也就是SimpleString对象的引用,不是你误以为的指针类型!这是整个问题的核心。
那this是什么?在C++的成员函数里,this是一个指向当前对象的指针,它的类型是SimpleString*。而*this就是对这个指针做解引用操作,得到的是当前对象本身(一个SimpleString实例)。因为函数要返回的是对象的引用,所以返回*this就刚好匹配返回类型——相当于把当前对象的引用返回出去。
如果按你想的返回this(指针),编译器直接就会报错,因为SimpleString*类型没法转换成SimpleString&类型,类型不匹配。
另外,这么做还有一个重要的原因:支持链式赋值。比如咱们平时写的a = b = c;,这种写法能生效,就是因为b = c返回的是b的引用,然后这个引用再赋值给a。如果返回的是指针,那b = c返回的是&b,这时候a = &b就变成了把指针赋值给对象,完全不符合逻辑,编译器也不会允许。
再回到你的代码片段:
SimpleString& operator=(const SimpleString& other) {
if(this == &other) return *this;
const auto new_buffer = new char[other.max_size];
delete[] buffer;
buffer = new_buffer;
length = other.length;
max_size = other.max_size;
std::strncpy(buffer, other.buffer, max_size);
return *this;
}
这里的return *this完全符合C++赋值运算符的惯例:返回当前对象的非const引用,这样既支持链式赋值,还能允许像(a = b).someMemberFunction()这样的操作——直接对赋值后的对象调用成员方法。
内容的提问来源于stack exchange,提问作者Tom H

