我正在构建一个用于处理复数的 c++ 程序。我对此代码的行为有疑问:
Complex& Complex::operator=(const Complex& com)
{
Complex::re_=com.re_;
Complex::im_=com.im_;
return *this;
}
现在,这个函数的返回类型是一个复杂类型的引用。所以我不应该通过this
而不是*this
。
this
指针是对象实例的地址。
使用星号取消引用它。
与 Java 和 C# 不同,this
在 C++ 中不是引用,而是指针。该指针是 typeComplex*
或Complex const*
,取决于方法上的 const 限定符(因此Complex*
在您的情况下)。
编辑:如评论中所述,Java 和 C# 的引用并不容易与 C++ 中的引用和指针相提并论,所以让我澄清一下:
从语法上讲,所有三种语言的引用都被视为相同,即它们不需要被取消引用或被隐式取消引用,或者简单地说,您可以像访问它后面的对象一样ref.method()
。
从语义上讲,普通 Java 和 C# 引用的行为类似于 C++ 指针,即它们可以为 null,并且可以重新分配以指向另一个对象。在 C++ 中,引用都不可能。因此,乍一看,this
Java 和 C# 中的 C++ 指针语义与 C++ 中的一样。但是由于它不能null
也不能重新分配以指向另一个对象,因此语义差异消失了,并且在所有三种语言中都具有相同的 C++ 引用语义。
因此,换句话说,相同的答案:
虽然this
具有引用语义,但它在 C++ 中的语法上是一个指针,因此您必须显式取消引用它以获得(语法)引用。