0

当没有对引用进行编译时类型检查时,为什么要使用引用而不是指针?

想象一下,您正在创建一个类型的对象,该对象Person需要保存指向它们的引用/指针House(非常随机) - 因此人员对象会将房屋引用/指针保存为数据成员。想象一下这是通过引用完成的:

class Person{
   public:
      Person(House& myHouse) : house(myHouse) { }
   private:
      House& house;
};

我看到的问题是,如果您忘记在数据成员声明中包含 & ,那么您认为是引用的东西就会变成副本。当然,传递并保存一个指针会更安全,这样这个错误就会在编译时被标记出来?

我不是要使用一个或另一个 - 我在问为什么在指针上使用引用来保存数据成员?

4

2 回答 2

0

如果您忘记在数据成员声明中包含 & ,那么您认为是引用的东西变成了副本......传递并保存指针会更安全,这样这个错误就会在编译时被标记出来?

声明成员时不能忘记输入符号。&无论您编写House& house还是您House house的决定,编译器都应该尊重。当您更改对对象的引用声明时,您是故意这样做的。这不是您的编译器应该警告您的事情。

编译器无法知道您是打算通过值传递还是通过引用传递。当您将按指针传递更改为按值传递时,编译器报告错误只是因为您将副本(具有自动存储持续时间的对象)视为指针(在语法上不正确),而不是因为它能够识别您可能意味着通过指针传递。

为什么在指针上使用引用来保存数据成员?

主要原因是确保引用将始终使用现有对象进行初始化,这也意味着不NULL检查错误处理并在编译类型而不是运行时捕获可能的错误。其他争论可能是更简洁的代码(可读性),在我看来,引用的使用也会导致人们依赖具有自动存储持续时间的对象并学习遵循RAII习语,而不是进入丑陋的内存管理和内存泄漏的地牢。

但我相信你会发现许多现有的问题来解决这个问题,例如指针与参考

于 2013-02-23T21:29:54.740 回答
0

我不是要使用一个或另一个 - 我在问为什么在指针上使用引用来保存数据成员?

指针和引用都用作数据成员。引用T&与不可变指针一样灵活T* const。此外,引用可能不为空。因此,如果这些属性以最佳方式描述了您的需求,那么请使用参考。

IOW,如果每个人都Person必须有一个House并且可能在's 的生命周期内Person不能切换到其他人,那么请使用参考。显然,这两个前提都感觉很荒谬,所以指针实际上可能更好。HousePerson

指针并不总是更好。当事物保持不变时,支持不变性(int* const)而不是可变性( )。int*当事情确定时,倾向于确定性(完全是一个)而不是不确定性(一个或没有)。

在 OOP 中,组件对象中的组合关系通常作为对组合对象的引用来完成。一个组件没有复合就不能存在,也不能成为其他复合的组件,因此最好参考。

于 2013-02-23T21:42:43.493 回答