为什么没有"?;空引用“;在C++;? 我在阅读C++ FAQ——“尤其是这个声明:
可以时使用引用,必要时使用指针 上述情况的例外情况是,函数的参数或返回值需要一个“sentinel”引用—一个不引用对象的引用。这通常最好通过返回/获取指针,并赋予空指针特殊意义(引用必须始终别名对象,而不是取消引用的空指针)来实现 从我所看到的,对“哨兵”引用的需求确实经常是使用指针而不是引用的原因。我想知道的是:为什么C++没有一个特殊的“空值”来引用?这似乎会使指针变得几乎不必要,这将解决许多问题 那么为什么它不是语言规范的一部分呢 编辑:为什么没有"?;空引用“;在C++;? 我在阅读C++ FAQ——“尤其是这个声明:,c++,pointers,reference,null,specifications,C++,Pointers,Reference,Null,Specifications,可以时使用引用,必要时使用指针 上述情况的例外情况是,函数的参数或返回值需要一个“sentinel”引用—一个不引用对象的引用。这通常最好通过返回/获取指针,并赋予空指针特殊意义(引用必须始终别名对象,而不是取消引用的空指针)来实现 从我所看到的,对“哨兵”引用的需求确实经常是使用指针而不是引用的原因。我想知道的是:为什么C++没有一个特殊的“空值”来引用?这似乎会使指针变得几乎不必要,这将解决许多问题 那么为什么它不是语言规范的一部分呢 编辑: 我不确定我的问题是否清楚——我想我不是随便问关
我不确定我的问题是否清楚——我想我不是随便问关于空引用的问题。我经常在C++中读到“引用是对象”。而且,在大多数OOP语言中,对象可以是NULL—Pascal、C#、Java、JavaScript、PHP等。在所有这些语言中,您可以执行
someObject=NULL
或someObject:=nil
。事实上,Pascal也支持指针,但仍然允许对象为nil
,因为它有自己的用途。那么为什么C++有特殊的特性,没有空对象呢?这只是一个疏忽还是一个实际的决定?引用必须引用某些内容,因此空引用不可用。C没有引用,我们只能在这种语言中使用指针,因此,这与C语言兼容,因为引用具有指向一个永远不会更改的有效内存地址的语义;i、 e.取消引用是安全的/定义的,因此不需要空检查。设计无法重新分配引用 当var可以为NULL并且客户机代码必须处理这种情况时,可以使用指针。当可以保证有效/初始化的内存地址时,使用引用 使用指针的一个例子是作为类的成员来存储对某个实例的“引用”,该实例可能在类构造时未知或无法初始化。但是,成员引用必须在构建时进行初始化(通过初始化器列表),并且不能延迟其分配 如果您允许空引用,那么除了语法之外,它与指针没有什么不同(同样的空检查需要进行) 更新: 在大多数面向对象编程语言中,对象可以是null - Pascal、C++、java、JavaScript、PHP等……为什么C++有某种特殊性而没有空对象呢?它只是一个忽略还是一个实际的决定? 我想你对此有点困惑。java和C++等可能给人一种“空对象”的印象,但是这些对象引用或多或少就像一个C++指针,语法简单,GC测试和异常抛出。在这些语言中,如果对“Null对象”进行操作,将得到某种异常,如NullReferenceException(C#)。见鬼,在Java中它被称为NullPointerException 您必须先检查
null
,然后才能安全使用它们。类似于C++指针(除了大多数托管语言之外,指针默认默认为空),而C++中通常只关心设置初始指针值(否则未定义/任何内存已经存在)。
< C++视图是关于选择的,因此是冗长的:
- 使用一个简单的指针来做你喜欢做的事情,必要时检查NULL李>
- 使用具有编译器强制有效性/语义约束的引用李>
- 滚动你自己的智能指针做簿记和行为,无论你想他们
- 如果需要,使用void指针(小心!)引用非类型内存块
引用总是绑定到一个类型,而指针则不是这样。请看一看指针和引用之间的区别——虽然标准对如何实现引用保持开放,但目前它们始终作为指针实现 这意味着它们之间的主要区别是a)语义b)指针可以重置c)指针可以为空 简而言之,这是故意的。当您作为程序员看到引用时,您应该知道a)该引用已填充b)它不会更改(c)您可以使用与对象相同的语义) 如果标准允许空引用,那么在使用引用之前,您必须始终检查空引用,这是不需要的 编辑: 关于您的编辑,我想这里的混乱可能源于这样一个事实,即大多数简单的OO语言隐藏了正在发生的事情。以Java为例,虽然看起来您有空对象,并且可以分配它们,但实际上您不能——实际情况是Java只有指针,并且可以为这些指针分配空值。由于不可能直接在Java中拥有对象,因此它们取消了指针语义和tre