我正在关注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使用了 - > (我忘了它叫什么)后来使用了点运算符。出于某种原因,我认为使用只能使用一个或另一个,具体取决于它是引用类型还是值类型。 显然我认为错了,但找不到关于何时使用每个操作员的任何信息(或更多关于每个操作员的目的。)
非常感谢任何澄清。
答案 0 :(得分:6)
我认为使用只能使用其中一种,具体取决于它是引用类型还是值类型
通常,是的。
两者都在代码中的同一个对象上使用的事实表明它是一个“智能指针”,即一个具有重载operator->
的对象类型,它允许它像指针一样工作。
m_renderTarget->BeginDraw();
这使用operator->
来访问它指向的对象的成员。 BeginDraw
是指向对象的成员函数,而不是m_renderTarget
的成员函数。
m_renderTarget.Reset();
这会访问m_renderTarget
本身的成员,而不是它指向的对象。通常,reset()
成员用空指针替换指向的对象。
因此,在第一种情况下,->
语法对其指向的对象执行某些操作,而在第二种情况下,.
语法对对象本身执行某些操作。
答案 1 :(得分:-1)
箭头操作符的作用是指向一个指针(指向一个对象),然后使用'。 '剩余表达的操作员。
与
相同 (*m_renderTarget).BeginDraw();
箭头运算符用于避免与此
混淆 *(m_renderTarget.BeginDraw());
当然可能是灾难性的,并可能导致程序崩溃。
这解释了一个很好的例子here