这是好奇心的问题,我还没有找到好的答案。 假设在" 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(),
如果一个是对象,另一个只是一个引用?
答案 0 :(得分:1)
你的术语都错了。除了解决您的具体观察外,我还能做更多的事情。我认为你被地址操作符&
弄糊涂了,它与参考类型中的符号&
实际上没有任何关系(或者是按位 - AND
)
T&
:类型"对T
"; &a
:一个表达式,用于评估对象a
的地址(一个指针!); a & b
:一个表达式,用于评估AND
数字a
和b
的结果。 &
的这三种用法(令人困惑)无关。因此,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
等成员函数。