当我通过同事写的代码时,在某个地方,他们使用:
this->doSomething(); //-->case A
doSomething(); //-->case B
实际上我不确定* this指针的用法...... :(
参数匹配的另一个问题:
obj.doOperation(); //-->case C
(&obj)->doOperation(); //-->case D
实际上两种情况都在执行所需的操作,它只是一种使代码看起来更复杂的方法吗?
您对上述两个问题的建议是什么?何时适合使用它们以及为什么?
答案 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
标识符。在模板代码内部,事情可能会变得更糟(尽管我现在无法得到一个精确的例子)。这是一个好习惯。