【问题标题】:Pointer or a reference指针或引用
【发布时间】:2013-02-14 11:10:23
【问题描述】:

我正在构建一个用于处理复数的 c++ 程序。 我对此代码的行为有疑问:

Complex& Complex::operator=(const Complex& com)
{
    Complex::re_=com.re_;
    Complex::im_=com.im_;
    return *this;
}

现在,这个函数的返回类型是一个复杂类型的引用。所以我不应该通过this 而不是*this

【问题讨论】:

  • 不,this 是一个指向Complex 实例的指针,需要为return 引用。

标签: c++ oop reference this


【解决方案1】:

this 指针是您的对象实例的地址。

使用星号取消引用它。

【讨论】:

    【解决方案2】:

    与 Java 和 C# 不同,this 在 C++ 中不是引用,而是指针。该指针的类型为 Complex*Complex const*,具体取决于方法上的 const 限定符(因此在您的情况下为 Complex*)。

    编辑: 如 cmets 所述,Java 和 C# 的引用与 C++ 中的引用和指针相比并不容易,所以让我澄清一下:

    在语法上,所有三种语言的引用都被视为相同,即它们不需要被取消引用或被隐式取消引用,或者简单地说,您可以像 @987654325 一样访问它后面的对象@。

    语义上,普通的 Java 和 C# 引用的行为类似于 C++ 指针,即它们可以为 null,并且可以重新分配以指向另一个对象。在 C++ 中,引用都不可能。所以乍一看,Java 和 C# 中的 this 具有 C++ 指针语义,就像它在 C++ 中一样。但由于它不能是 null 并且不能重新分配以指向另一个对象,因此语义差异消失了,并且在所有三种语言中都具有相同的 C++ 引用语义。

    所以,换句话说,相同的答案: 虽然this 具有引用语义,但在 C++ 中它在语法上是一个指针,因此您必须显式取消引用它才能获得(语法)引用。

    【讨论】:

    • this 是一个指针,因为它可以为 NULL。 (不应该,但可以。)
    • 不,this 在符合标准的方式中永远不能为 NULL。如果你在空指针上调用一个方法,你会得到 UB。因此,这不是将 this 设为指针的正当理由。在取消引用空指针时不会崩溃的实现也可以使用引用-this 来完成-您将有 this 是一些悬空的空引用-那又如何,无论如何它都是 UB。
    • 我 99% 确定 this 是出于歇斯底里^历史原因的指针。引用在第一代 C++ 中不可用,为了保持兼容性,必须保持这种方式。
    • 好吧,我不知道原始 C++ 没有引用。使用此引用无法完成的另一件事是delete this;
    • 这是不正确的比较。 Java 和 C# 中的 this 是指针。 Java 和 C# 中的引用是指向对象的指针。这不是 C++“参考”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 2013-04-30
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多