Ita*_*man 15

[编辑]

如果变量定义为T*(其中T是某种类型),那么 - >和*都是相同的(除非ptr为null).

如果变量是类的实例(通过值或通过引用),那么 - >和*应该表现相同(按照最佳实践),但这要求类以相同的方式重载它们.

  • 如果底层类*执行*重载` - >`或`*`它应该重载两者,以便它仍然是相同的.否则设计很糟糕. (8认同)
  • @Tadeusz:你可以重载 - >但它适用于类而不是类的指针.例如Cat c; c-> f(),它不适用于Cat*p =&c; P-> F(); 我不确定为什么这么高,因为这是错误的. (3认同)
  • @Tadeusz Kopec:阅读Jeremy Bell的回答:`operator->`有一些特殊的行为,在某些情况下会使`x-> y`与`(*x).y`不一致,并且无法使用`运算符模拟行为*` (2认同)
  • 瑞秋:我知道人们一遍又一遍地听到这个但是:为什么?谁在乎?使用可读的,性能是*第二关注*.您首先要关注的是以易于管理的方式编写应用程序.只有当你发现缺乏表现时,你才会关心表现.也就是说,你必须*profile*:时间代码,看看哪个更快.但是在这种情况下,它们是相同的.应该没有区别.你是C++编程的新手,我猜,所以担心C++,而不是速度. (2认同)

Luc*_*cas 12

因为你在评论中要求它.您可能正在寻找的内容可以在标准(5.2.5类成员访问)中找到:

3如果E1具有"指向类X的指针"类型,则表达式E1-> E2将转换为等效形式(*(E1)).E2;

编译器将生成完全相同的指令,它将同样有效.您的机器不知道您是否写了" - >"或"*.".


Jer*_*ell 7

->运营商在大多数情况下特殊之处在于它"演习向下"递归直到表达式的结果是不再的东西,有一个重载的-为它定义>运营商.该(*subxpression).x表达只做对的子表达式一次提领,因此,如果结果(*subexpression)是另一个指针,那么这将不能编译(你需要写(*(*subexpression)).x请看下面的代码为更好地说明:

#include <iostream>
using namespace std;

class MyClass
{
public:
    MyClass() : x(0) {}
    int x;
};

class MyPtr
{
private:
    MyClass* mObj;
public:
    MyPtr(MyClass* obj) : mObj(obj) {}
    MyClass* operator->() 
    {
        return mObj;
    }
};

int main() 
{
    MyClass obj;
    MyClass* objCPtr = &obj;
    MyClass** objCHandle = &objCPtr;
    MyPtr ptr(&obj);
    cout << ptr->x << endl;
    cout << (*(*objCHandle)).x << endl;
}
Run Code Online (Sandbox Code Playgroud)

但请注意,这不会编译:

cout << objCHandle->x << endl;
Run Code Online (Sandbox Code Playgroud)

因为 - >的向下钻取行为仅在表达式的左侧是类,结构,联合或泛型类型时发生.在这种情况下,objCHandle是一个MyClass**,所以它没有资格.