如何以及何时正确使用*这个指针和参数匹配?

时间:2010-09-29 15:31:42

标签: c++ dereference

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

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

实际上我不确定* this指针的用法...... :(

参数匹配的另一个问题:

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

实际上两种情况都在执行所需的操作,它只是一种使代码看起来更复杂的方法吗?

您对上述两个问题的建议是什么?何时适合使用它们以及为什么?

3 个答案:

答案 0 :(得分:5)

这不是你的问题的答案,而是注意两个片段可能做不同的事情:

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
}

答案 1 :(得分:3)

案例B和C始终是适当的方式。案例A和D是等价的,没有什么不同。

有一些例外:

  • 如果类有一个重载的operator&做了令人惊讶的事情,那么案例D可以做一些与C不同的事情。实际上不建议使用这样做的类,因为它会让人感到困惑。
  • 如果存在局部变量doSomething(或本地范围内该名称的其他内容),则A将引用与B不同的doSomething。再次建议不要你自己就是这样的情况,最好给不同的东西赋予不同的名字。

答案 2 :(得分:1)

C和D是不同的。如果doOperation是虚拟的,则案例D将执行虚拟呼叫,如果obj不是引用,则案例C将执行非虚拟呼叫。但是,这假设operator&operator->没有超载。

我倾向于使用A over B,因为可能存在本地doSomething标识符。在模板代码内部,事情可能会变得更糟(尽管我现在无法得到一个精确的例子)。这是一个好习惯。