如何判断是使用“->”还是“.” [重复]

问题描述 投票:0回答:2

我正在关注 D2D 示例,其中出现了以下代码:

    if(!(D2D1_WINDOW_STATE_OCCLUDED & m_renderTarget->CheckWindowState()))
    {
        m_renderTarget->BeginDraw();

        Draw();

        if(m_renderTarget->EndDraw() == D2DERR_RECREATE_TARGET)
        {
            m_renderTarget.Reset();
            Invalidate();
        }
    }

我注意到 m_renderTarget 使用了 -> (我忘了它叫什么),后来又使用了点运算符。出于某种原因,我认为 use 只能使用其中之一,具体取决于它是引用类型还是值类型。 显然我的想法是错误的,但找不到任何有关何时使用每个运算符的信息(或者更重要的是,每个运算符的目的。)

如有任何澄清,我们将不胜感激。

c++ windows direct2d
2个回答
6
投票

我认为 use 只能使用其中之一,具体取决于它是引用类型还是值类型

通常是的。

两者在代码中的同一个对象上使用的事实表明它是一个“智能指针”,即具有重载

operator->
的对象类型,允许它像指针一样工作。

    m_renderTarget->BeginDraw();

这使用

operator->
来访问它指向的对象的成员。
BeginDraw
是所指向对象的成员函数,而不是
m_renderTarget
的成员函数。

    m_renderTarget.Reset();

这会访问

m_renderTarget
本身的成员,而不是它指向的对象。通常,
reset()
成员会用空指针替换所指向的对象。

因此,在第一种情况下,

->
语法对其指向的对象执行某些操作,而在第二种情况下,
.
语法对对象本身执行某些操作。


-1
投票

箭头运算符的作用是引用一个指针(指向一个对象),然后使用 ‘ 。剩余表达式上的 ‘ 运算符。

相同
    (*m_renderTarget).BeginDraw();

箭头运算符用于避免与此混淆

    *(m_renderTarget.BeginDraw());

这当然可能是灾难性的,并可能导致程序崩溃。

这用一个很好的例子来解释这里

© www.soinside.com 2019 - 2024. All rights reserved.