Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么没有"?;空引用“;在C++;? 我在阅读C++ FAQ——“尤其是这个声明:_C++_Pointers_Reference_Null_Specifications - Fatal编程技术网

为什么没有"?;空引用“;在C++;? 我在阅读C++ FAQ——“尤其是这个声明:

为什么没有"?;空引用“;在C++;? 我在阅读C++ FAQ——“尤其是这个声明:,c++,pointers,reference,null,specifications,C++,Pointers,Reference,Null,Specifications,可以时使用引用,必要时使用指针 上述情况的例外情况是,函数的参数或返回值需要一个“sentinel”引用—一个不引用对象的引用。这通常最好通过返回/获取指针,并赋予空指针特殊意义(引用必须始终别名对象,而不是取消引用的空指针)来实现 从我所看到的,对“哨兵”引用的需求确实经常是使用指针而不是引用的原因。我想知道的是:为什么C++没有一个特殊的“空值”来引用?这似乎会使指针变得几乎不必要,这将解决许多问题 那么为什么它不是语言规范的一部分呢 编辑: 我不确定我的问题是否清楚——我想我不是随便问关

可以时使用引用,必要时使用指针

上述情况的例外情况是,函数的参数或返回值需要一个“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指针(小心!)引用非类型内存块

根据定义,引用应与另一个变量或对象相关联。所以一个空的或空的引用违反了它存在的目的

从技术上讲,这意味着您从一个空引用开始,然后将其分配给某个变量,或者后一个变量可能会重新分配给另一个变量。这根本不是创建引用的目的

指针还有一些引用无法复制的其他用途。例如,使用指针引用具有少量内存的大块复杂数据(字节序列),并根据需要频繁地传递,只需为指针花费8个字节左右。如果引用不浪费相同的内存,则无法做到这一点


引用总是绑定到一个类型,而指针则不是这样。

请看一看指针和引用之间的区别——虽然标准对如何实现引用保持开放,但目前它们始终作为指针实现

这意味着它们之间的主要区别是a)语义b)指针可以重置c)指针可以为空

简而言之,这是故意的。当您作为程序员看到引用时,您应该知道a)该引用已填充b)它不会更改(c)您可以使用与对象相同的语义)

如果标准允许空引用,那么在使用引用之前,您必须始终检查空引用,这是不需要的

编辑:

关于您的编辑,我想这里的混乱可能源于这样一个事实,即大多数简单的OO语言隐藏了正在发生的事情。以Java为例,虽然看起来您有空对象,并且可以分配它们,但实际上您不能——实际情况是Java只有指针,并且可以为这些指针分配空值。由于不可能直接在Java中拥有对象,因此它们取消了指针语义和tre