在c ++中,这3个代码块之间有任何区别:
MyClass->m_Integer // 1
MyClass::m_Integer // 2
MyClass.m_Integer // 3
答案 0 :(得分:11)
->
和.
运算符是访问类实例成员的方法,::
允许您访问类的静态成员。
->
和.
之间的区别在于箭头用于通过实例指针进行访问,其中点用于访问值(非指针)。
例如,假设您将类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();
答案 1 :(得分:6)
- >意味着MyClass是一个指向该类的指针,所述指针需要被解引用才能获得成员m_Integer
::是范围或命名空间运算符。这意味着m_Integer要么是静态的,要么需要特别确定m_Integer所在的范围或命名空间。
。意味着m_Integer正在从MyClass直接访问(而不是通过指针)。它几乎是你如何从Java中访问成员,应该是你最熟悉的那个。
答案 2 :(得分:6)
a::b
- a
是命名空间或类(不是实例),因此b
需要是某个静态实体a.b
- a
是一个类的实例,b
是其成员a->b
- 与(*a).b
相同(a
是指向类实例的指针)答案 3 :(得分:0)
除了你得到的其他答案之外,值得注意的是operator->
可能会超载。你已经对内置版本的工作方式有了一些合理的解释,但是过载的operator->
有点不寻常,所以也许值得添加一些关于它是如何工作的。
该标准简明扼要地描述了operator->
的异常(§13.5.6):
表达式x-> m被解释为(x.operator->()) - > m表示类型为T的类对象x,如果T :: operator->()存在且运算符如此被重载决策机制(13.3)选为最佳匹配函数。
这有几个含义:
->
看起来像二元运算符,但从重载的角度来看,它本质上是一元运算符 - 你的重载将是一个不带参数的成员函数。operator->
,或者指向某个对象(类或结构类型)。由于您可以返回自身重载operator->
的对象,因此x->m
形式的表达式可以隐藏任意数量的复杂性(调用任意数量的函数)。你写的x->m
可以真正扩展到x->y->z->a->b->...m
。