C ++为什么要访问对象的方法。通过参考,但通过 - >通过指针

时间:2015-10-07 16:05:18

标签: c++

这是好奇心的问题,我还没有找到好的答案。 假设在" main.cc"我有以下代码

namespace {

class MyClass {

public:
int GetNumber() const {return number_;}

MyClass(const int number) :
number_(number) {
}

private:
const int number_;

};

const MyClass* GetPointerToClass(const MyClass &c) {
    return (&c);
}

}  // namespace

int main(int argc, char* argv[]) {

    const MyClass my_constant_class(5);

    const MyClass* const pointer1_to_constant_class = GetPointerToClass(
        my_constant_class);
    printf("%d\n", pointer1_to_constant_class->GetNumber());

    const MyClass* const pointer2_to_constant_class = &my_constant_class;
    printf("%d\n", pointer2_to_constant_class->GetNumber());

    const MyClass& reference_to_constant_class = my_constant_class;
    printf("%d\n", reference_to_constant_class.GetNumber());

    const MyClass copy_of_my_class = my_constant_class;
    printf("%d\n", copy_of_my_class.GetNumber());

    return 0;
}

现在,当我运行该程序时,它会打印: 五 五 五 5

我很好奇的是程序编译并成功运行的原因?

特别是(根据我的理解,如果我错了,请更正):

指针1_to_constant_class的值被赋值给const引用的引用。

指针2_to_constant_class的值被分配给对象的引用。

(所以虽然两个指针属于同一类型,但它们被分配到不同的类型)

将reference_to_constant_class的值赋给对象。

将copy_to_my_class的值分配给对象。

(因此引用和对象被分配到相同的类型)

那么我们为什么要调用pointer2_to_constant_class-> GetNumber, 如果它被分配给对象的引用。

另外,为什么调用reference_to_constant_class.GetNumber()没有区别, 与copy_of_my_class.GetNumber(),

如果一个是对象,另一个只是一个引用?

1 个答案:

答案 0 :(得分:1)

你的术语都错了。除了解决您的具体观察外,我还能做更多的事情。我认为你被地址操作符&弄糊涂了,它与参考类型中的符号&实际上没有任何关系(或者是按位 - AND

  • T&:类型"对T";
  • 的引用
  • &a:一个表达式,用于评估对象a地址(一个指针!);
  • a & b:一个表达式,用于评估AND数字ab的结果。

&的这三种用法(令人困惑)无关。因此,return (&c)&my_constant_class都与引用无关。

引用和指针语义实际上非常简单,但是一旦你因误解而离开滑雪道,就不会再回来了。这是从一本好的,经过同行评审的书中学习C ++非常重要的一个原因,而不是从互联网上的随机教程,你在酒吧里的伴侣那里学习,或者根本不是!

  

指针1_to_constant_class的值被赋值给const引用的引用。

没有。类型为MyClass*的指针已分配给pointer1_to_constant_class。这里没有引用。

  

指针2_to_constant_class的值被分配给对象的引用。

没有。类型为MyClass*的指针已分配给pointer2_to_constant_class。这里没有引用。

  

(所以虽然两个指针属于同一类型,但它们被分配到不同的类型)

它们属于同一类型,但已分配给不同的值。

  

将reference_to_constant_class的值赋给对象。

将对象分配给reference_to_constant_class引用的对象,是。

  

将copy_to_my_class的值分配给对象。

声明一个新对象copy_to_my_class并从对象复制初始化,是的。

  

(因此引用和对象被分配到相同的类型)

您永远不会分配参考。

  

那么为什么我们必须调用pointer2_to_constant_class-> GetNumber,如果它被分配给一个对象的引用。

不是。 pointer2_to_constant_class是一个指针。

  

另外,为什么调用reference_to_constant_class.GetNumber()与copy_of_my_class.GetNumber(),

没有区别      

如果一个是对象,另一个只是一个引用?

我们可以访问a.b()等成员函数,无论a是对象本身,还是对它的引用。

a->b()是指向对象的指针时,我们会访问a等成员函数。