gpt4 book ai didi

c++ - 为什么C++中没有 "NULL reference"?

转载 作者:可可西里 更新时间:2023-11-01 16:27:27 25 4
gpt4 key购买 nike

我正在阅读 C++ 常见问题解答 - “8.6 - When should I use references, and when should I use pointers?”,尤其是以下声明:

Use references when you can, and pointers when you have to.

...

The exception to the above is where a function's parameter or return value needs a "sentinel" reference — a reference that does not refer to an object. This is usually best done by returning/taking a pointer, and giving the NULL pointer this special significance (references must always alias objects, not a dereferenced NULL pointer).

据我所知,对“哨兵”引用的需求确实常常是使用指针而不是引用的原因。我想知道的是:为什么 C++ 没有引用的特殊“NULL 值”?看起来它几乎不需要指针,这将解决许多问题。

那么为什么它不是语言规范的一部分呢?

编辑:

我不确定我的问题是否清楚 - 我想我不是在乱问 NULL 引用。我经常在 C++ 中读到“引用就是对象”。而且,在大多数 OOP 语言中,对象可以为 NULL - Pascal、C#、Java、JavaScript、PHP 等。在所有这些语言中,您可以执行 someObject = nullsomeObject := nil。事实上,Pascal 也支持指针,但仍然允许对象为 nil,因为它有它的用途。那么,为什么 C++ 有某种特殊之处并且没有 NULL 对象呢?这只是一个疏忽还是一个实际的决定?

最佳答案

因为引用具有指向一个永不改变的有效内存地址的语义;即取消引用它是安全/定义的,因此不需要 NULL 检查。不能按设计重新分配引用。

当 var 可以为 NULL 并且客户端代码必须处理这种情况时,您可以使用指针。当您可以保证有效/初始化的内存地址时,您可以使用引用。

使用指针的一个例子是作为一个类的成员来存储对某个实例的“引用”,该实例在类构造时可能未知或无法初始化。但是,成员引用必须在构建时初始化(通过初始化列表)并且它们的赋值不能延迟。

如果您允许空引用,那么除了语法之外,它与指针没有什么不同(需要进行相同的 NULL 检查。)

更新:

"And, in most OOP languages, objects can be NULL - Pascal, C#, Java, JavaScript, PHP, etc. [...] So why is C++ somehow special and doesn't have a NULL object? Was it just an overlook or an actual decision?"

我想你对此有点困惑。 Java 和 C# 等可能给人“NULL 对象” 的印象,但这些对象引用或多或少像 C++ 指针,具有更简单的语法、GC 检测和异常抛出。在这些语言中,如果您对“空对象”进行操作,您将得到某种异常,例如 NullReferenceException (C#)。该死,在 Java 中它被称为 NullPointerException

在安全使用它们之前,您必须检查 null。有点像 C++ 指针(除了在大多数托管语言中,指针默认初始化为 NULL,而在 C++ 中,通常由您负责设置初始指针值(否则未定义/任何内存已经存在))。

C++ 的观点是关于有选择,因此是冗长的:

  • 使用普通指针做你喜欢做的事,必要时检查 NULL。
  • 使用具有编译器强制有效性语义/约束的引用。
  • 滚动您自己的智能指针,这些指针会按照您希望的方式进行簿记和行为。
  • 如果需要,使用 void 指针(谨慎!)引用未类型化的内存块。

关于c++ - 为什么C++中没有 "NULL reference"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11408825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com