我正在学习C++指针,发现
那是因为这样还是有不同之处?
->
运算符很奇怪。例如,可以使用(*ptr).hello();
代替ptr->hello();
,因为似乎两种写法都可以工作,所以我认为前者只是更方便的一种方式。那是因为这样还是有不同之处?
->
运算符很奇怪。例如,可以使用(*ptr).hello();
代替ptr->hello();
,因为似乎两种写法都可以工作,所以我认为前者只是更方便的一种方式。“->” 操作符只是一种语法糖,因为打 (*ptr).hello()
实在太麻烦了。从汇编级别生成的指令来看,它们没有任何区别。事实上,在一些语言(比如 D 语言)中,编译器可以根据类型自动推断一切。如果你写 ptr.hello()
,它也能正常工作,因为编译器知道 ptr 是一个指针并且没有 hello() 属性,因此你必须意味着 (*ptr).hello()
。
关于内置指针的问题,其他人已经回答了。至于类,可以重载运算符->()、operator&()和运算符*(),但不能重载运算符.()。
这意味着一个对象可能会根据你调用的语法而表现出不同的行为。
operator->()
很大程度上只能在某些替代对象上调用方法(例如,制作自己的智能指针类)一元 operator*()
经常被迭代器重载(它们本质上是相同的东西),但在 PCFG 解析中也有有用的重载,例如 boost::spirit 中的 Kleene 星号。 - Ken Bloom就可读性而言,最主要的优势在于需要链接函数调用,即:
ptr->getAnotherPtr()->getAThirdPtr()->print()
'->'
运算符的原因是为了使其更加方便,并避免出现以下错误:*ptr.hello();
它们生成完全相同的机器代码,但对我来说,ptr->arg()比(*ptr).arg()更易读。