为什么要费心去写 - >而不是 。?

时间:2010-10-05 15:31:06

标签: c++ pointers syntax

  

可能重复:
  Why does C have a distinction between -> and . ?

程序员在访问对象成员时必须区分.->的真正原因是什么?

void foo( Point &p ) {
    p.x ;
    p->y; // syntax error
} 

void foo( Point *p ) {
    p.x ; // syntax error
    p->y;
} 

我的意思是,无论如何,他们都引用了对象,p

  • 为什么我每次都要检查p是什么?编译器不能理解吗?

  • 为什么他们不允许它接受两者的.语法?对于堆栈对象来说也没问题。

如果是由于C-tradition,那么

  • 为什么他们不同时允许.->访问者?

超过15年,我一直谦卑地认为编译错误是我的错!

9 个答案:

答案 0 :(得分:8)

因为p->d实际上意味着(*p).d。它进行解除引用,然后进行成员访问。引用的行为类似于对象,因此它们不需要解除引用(它们也是C ++特性,而指针是从C继承的);它一直保持这种向后兼容性。

C ++充满了这样的不一致,但通常没有更好的选择来添加新功能保持旧代码正常工作。重写旧代码不是一种选择。

答案 1 :(得分:6)

因为你可能有一个智能指针。在这种情况下,您可以使用.和真实对象的成员使用->访问智能指针的成员。

答案 2 :(得分:4)

它们不一样。

.是指您有实际物品的时间 ->是指向对象的指针。

.运算符无法重载,而->运算符可能会重载。

答案 3 :(得分:3)

理论上,至少在C语言中,语言本来可以用来做到这一点。 D(例如)完全按照你的要求行事。

在C ++中,事情可能是一个很大的问题 - x->yx.y完全有可能同时有效,但完全是不同的事物(即,重载operator->)的智能指针:

#include <iostream>

class P { 
    class inner { 
    public:
        inner() : x(1) {}
        int x;
    } i;
public:
    int x;


    P() :x(0) {}

    inner *operator->() { return &i; }
};

int main() { 
    P p;
    std::cout << p.x << "\t" << p->x << "\n";
    return 0;
}

答案 4 :(得分:3)

智能指针:它们可能同时包含两个成员并指向其他一些值。例如:

boost::smart_ptr<someclass> x(new someclass())
x->some_method();
x.reset();

答案 5 :(得分:2)

因为指针和引用不同,并且处理方式不同?

我在阅读代码时欣赏视觉差异。

答案 6 :(得分:2)

考虑以下代码:

x.myInt = 3;
cout << (int)&x <<< endl;

我们在这里打印什么?指针的地址或对象的地址? 我欢迎.->之间的区别,因为它为您提供了有关代码的更多背景信息。

根据您建议的更改,如果不查找x是什么类型,我们就不会知道差异。

答案 7 :(得分:2)

这是一个方便的问题:p-&gt; foo与(* p)相同.foo

当你用简单的+和=运算符表达相同的逻辑时,就像问为什么有++或+ =运算符一样。

答案 8 :(得分:0)

我可以想到一个原因:开发人员编写的内容与他们实际想要发生的内容之间的映射越复杂,当出现类型或语法错误时,弄清楚它们的真正意义就越困难。< / p>