此代码使用两种调用方法都可以正常工作。
#include <iostream>
using namespace std;
class myclass
{
public:
string doSomething();
};
string myclass::doSomething()
{
return "done something\n";
}
int main (int argc, const char * argv[])
{
myclass c;
std::cout << c.doSomething();
myclass *c2;
std::cout << c2->doSomething();
return 0;
}
我不明白这两个电话之间有什么不同?他们都工作?
答案 0 :(得分:10)
箭头操作符用于从指向对象实例的指针调用方法。
点运算符用于从引用到对象实例或在本地定义的对象上调用方法。
如果您在两个示例中颠倒了运算符,则代码将无法编译。
答案 1 :(得分:10)
c2->doSomething();
相当于:
(*c2).doSomething();
即。在调用方法之前,指针被取消引用。
查看Alf Steinbach的pointer tutorial获取更多帮助。
答案 2 :(得分:6)
myclass *c2;
std::cout << c2->doSomething();
这是未定义的行为。 c2
未初始化。
你需要写
myclass *c2 = &c;
c2->doSomething();
c2->doSomething()
在语义上等同于(*c2).doSomething()
,后者与c.doSomething()
相同
修改强>
查看Alf Steinbach的pointer tutorial
答案 3 :(得分:0)
不,如发布,它将无效,因为您没有初始化指针 c2。
至于语法:请参阅任何关于C ++的入门书,它将解释这一点。
简短的版本是,箭头操作符->
是(*c2).doSomething();
的快捷方式