当我去通过代码写的同事现,在某些地方,他们使用:

this->doSomething(); //-->case A
doSomething(); //-->case B

事实上我不知道有关伟大的使用情况*本指...:(

另一个问题与参数匹配:

obj.doOperation();  //-->case C
(&obj)->doOperation(); //-->case D

事实上这两种情况下执行所需的操作,它是一个简单的方式使代码看起来更加复杂?

什么是您的建议在上述两个问题吗?当时是合适的时间来使用它们,为什么?

有帮助吗?

解决方案

这是不是一个回答你的问题,但请注意这两个片段可以做不同的事情:

namespace B { void doSomething() {} }

struct A {    
    void f()
    {
        using B::doSomething;
        this->doSomething(); // call A::doSomething
        doSomething(); // calls B::doSomething
    }

    int a;
    void g(int a)
    {
        this->a = a; // assigns argument to member
    }

    A* operator & () { return this; }
    void doOperation() {}
    void doSomething() {}
};

void g(A &obj)
{
    obj.doOperation();  // calls A::doOperation directly
    (&obj)->doOperation(); // calls A::operator & first
}

其他提示

案件B和C都是适当的方式。案件A和D都是等同的,什么也不做不同的。

几个例外:

  • 如果这类具有超载 operator& 这不会令人惊讶的事情,那么情况D可以做不同的东西,C.实际上具有类做这不是建议,因为这将是令人困惑。
  • 如果有一个地方变量 doSomething (或者别的东西的名字在局部范围),然后将参考一个不同的 doSomething 比B它再次建议不要让自己成为这样一种情况,更好地得到不同的名称,以不同的事情。

C和d是不同的。如果doOperation是虚拟的,情况下,d将执行虚拟呼叫,如果obj不是参考壳体C将执行一个非虚拟呼叫。这假定该然而和operator& operator->没有过载。

我倾向于使用A对B由于可能存在本地doSomething标识符。里面的模板代码,事情可能会变得更糟(虽然我现在不能拿出一个精确的例子)。它是一个良好的习惯采取。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top