“之间的区别”&引用&引用;::&引用;及-&燃气轮机&引用; 在C++中,这3个代码块之间有什么不同: MyClass->m_Integer // 1 MyClass::m_Integer // 2 MyClass.m_Integer // 3

“之间的区别”&引用&引用;::&引用;及-&燃气轮机&引用; 在C++中,这3个代码块之间有什么不同: MyClass->m_Integer // 1 MyClass::m_Integer // 2 MyClass.m_Integer // 3,c++,C++,->和运算符是访问类实例成员的方法,而:允许您访问类的静态成员 ->和之间的区别在于箭头用于通过指向实例的指针进行访问,而点用于访问值(非指针) 例如,假设您有一个类MyClass,定义为: class MyClass { public: static int someValue(); int someOtherValue(); }; 您将在以下情况下使用这些运算符: MyClass *ptr = new MyClass; MyClass value; int arrowVa

->
运算符是访问类实例成员的方法,而
允许您访问类的静态成员

->
之间的区别在于箭头用于通过指向实例的指针进行访问,而点用于访问值(非指针)

例如,假设您有一个类
MyClass
,定义为:

class MyClass
{
public:
    static int someValue();
    int someOtherValue();
};
您将在以下情况下使用这些运算符:

MyClass *ptr = new MyClass;
MyClass value;

int arrowValue = ptr->someOtherValue();
int dotValue = value.someOtherValue();
int doubleColonValue = MyClass::someValue();
在Java中,这看起来像:

MyClass ref = new MyClass;

int dotValue = ref.someOtherValue();
int doubleColonValue = MyClass.someValue();

->意味着MyClass是指向该类的指针,所述指针需要被取消引用以获得成员m_Integer

::是作用域或命名空间运算符。这意味着m_Integer要么是静态的,要么需要您明确标识m_Integer在哪个范围或命名空间中

。表示从MyClass直接(而不是通过指针)访问m_Integer。这与您从Java内部访问memebers的方式差不多,应该是您最熟悉的方式。

  • a::b
    --
    a
    是一个名称空间或类(不是实例),因此
    b
    需要是一些静态实体
  • a.b
    --
    a
    是类的实例,
    b
    是类的成员
  • a->b
    ——与
    (*a).b
    a
    是指向类实例的指针)

连同您得到的其他答案,值得注意的是,
操作符->
可能会过载。对于内置版本的工作原理,您已经得到了一些合理的解释,但是重载的
操作符->
有点不寻常,因此也许值得添加一些关于其工作原理的信息

本标准非常简洁地描述了
操作员->
的不寻常之处(§13.5.6):

如果存在T::operator->(),并且重载解析机制(13.3)将运算符选择为最佳匹配函数,则表达式x->m对于类型为T的类对象x解释为(x.operator->())->m

这有几个含义:

  • 尽管
    ->
    看起来像一个二进制运算符,但从重载的角度来看,它本质上是一个一元运算符——重载将是一个不带参数的成员函数
  • 重载必须返回两种类型中的一种:一种是(引用)另一个类的实例,该类也重载
    运算符->
    ,另一种是指向某个对象(类或结构类型)的指针

  • 由于可以返回本身重载
    运算符->
    的对象,因此形式为
    x->m
    的表达式可以隐藏任意数量的复杂性(调用任意数量的函数)。你写的
    x->m
    实际上可以扩展到
    x->y->z->a->b->…m

    确保你有。如果没有一本好书,学习和正确使用这种语言是非常困难的。您还可以使用
    操作符(称为范围解析操作符)来引用命名空间或类的成员。