“。”,“::”和“ - >”之间的区别

时间:2011-08-01 05:01:35

标签: c++

在c ++中,这3个代码块之间有任何区别:

MyClass->m_Integer // 1
MyClass::m_Integer // 2
MyClass.m_Integer  // 3

4 个答案:

答案 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)选为最佳匹配函数。

这有几个含义:

  1. 即使->看起来像二元运算符,但从重载的角度来看,它本质上是一元运算符 - 你的重载将是一个不带参数的成员函数。
  2. 您的重载必须返回以下两种类型之一:a(引用)另一个类的实例,它也重载operator->,或者指向某个对象(类或结构类型)。
  3. 由于您可以返回自身重载operator->的对象,因此x->m形式的表达式可以隐藏任意数量的复杂性(调用任意数量的函数)。你写的x->m可以真正扩展到x->y->z->a->b->...m