为什么使用引用而不是指针?

时间:2013-02-23 21:21:20

标签: c++ pointers reference pass-by-reference

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

想象一下,你正在创建一个Person类型的对象,它需要保存一个引用/指向它们House的指针(相当随机) - 所以person对象将把house引用/指针保存为数据成员。想象一下,这是通过引用完成的:

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

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

我没有说明使用其中一个 - 我问为什么引用上的引用用于保存数据成员?

2 个答案:

答案 0 :(得分:0)

  

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

无法在宣布成员时忘记输入&符号。无论您是编写House& house还是House house都是您的决定,编译器应该尊重。当您更改对象的引用声明时,您可以故意。这不是你的编译器应该警告你的东西。

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

  

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

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

但我相信你会发现很多解决这个问题的问题,例如: Pointer vs. Reference

答案 1 :(得分:0)

  

我没有说明使用其中一个 - 我问为什么引用上的引用用于保存数据成员?

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

IOW,如果每个Person必须有House并且PersonHouse的生命周期内可能无法切换到其他Person,那么请使用引用。显然这两个前提都很荒谬,所以指针实际上可能更好。

指针并不总是更好。当事物保持不变时,将不变性(int* const)置于可变性(int*)。当事情确定时,肯定(确切地说是一个)不确定性(一个或没有)。

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