什么是a之间的区别.和 - >在C++中调用Method

ack*_*ers 1 c++ methods

你能告诉我a之间的区别吗?和 - >调用C++中的方法.

使用两种调用方法,此代码工作正常.

#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;
}
Run Code Online (Sandbox Code Playgroud)

我不明白2个电话之间的区别?他们都工作?

J T*_*J T 10

箭头运算符用于从指向对象实例的指针调用方法.

点运算符用于从引用到对象的实例或在本地定义的对象上调用方法.

如果您在两个示例中颠倒了运算符,则代码将无法编译.

  • 他的代码也不应该在这种状态下工作,因为他没有指定c2指针指向的任何地址.另外我认为值得注意的是,两个运营商都是成员访问者,' - >'运算符位于'.'之上.运算符,取消引用指针. (2认同)

Dav*_*ton 10

c2->doSomething();
Run Code Online (Sandbox Code Playgroud)

相当于:

(*c2).doSomething();
Run Code Online (Sandbox Code Playgroud)

即在调用方法之前指针被取消引用.

查看Alf Steinbach的指针教程以获得更多帮助.

  • +0提到Alf Steinbach的指针教程.关于指针 - 拜物教的171页 - 没有更好的方法来阻止使用C/C++的新开发人员. (6认同)

Pra*_*rav 6

myclass *c2;
std::cout << c2->doSomething();

这是未定义的行为.c2未初始化.

你需要写

myclass *c2 = &c;
c2->doSomething();
Run Code Online (Sandbox Code Playgroud)

c2->doSomething()在语义上等同于(*c2).doSomething()与...相同的c.doSomething()

编辑

查看Alf Steinbach的指针教程