1

我正在关注一个 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 只能使用一个或另一个,具体取决于它是引用类型还是值类型。显然我想错了,但找不到有关何时使用每个运算符的任何信息(或者更确切地说,每个运算符的目的。)

任何澄清将不胜感激。

4

2 回答 2

6

我认为 use 只能使用一个或另一个,这取决于它是引用类型还是值类型

通常,是的。

两者都用于代码中的同一对象这一事实表明它是“智能指针”,即具有重载的对象类型operator->,允许它像指针一样工作。

    m_renderTarget->BeginDraw();

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

    m_renderTarget.Reset();

这访问了它自己的一个成员m_renderTarget,而不是它指向的对象。通常,reset()成员用空指针替换指向的对象。

所以在第一种情况下,->语法对它指向的对象做一些事情,而在第二种情况下,.语法对对象本身做一些事情。

于 2013-03-17T01:26:03.647 回答
-1

箭头运算符所做的是尊重一个指针(指向一个对象),然后使用 ' 。' 剩余表达式上的运算符。

它与

    (*m_renderTarget).BeginDraw();

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

    *(m_renderTarget.BeginDraw());

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

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

于 2013-03-17T01:18:28.073 回答