我读的C ++常见问题- “ 8.6 -什么时候应该使用引用,何时该使用指针? ”,特别是这条语句:
当你需要使用的时候可以,指针引用和。
...
唯一的例外上述情况是函数的参数或返回值需要一个“哨兵”参考 - 这并不是指一个对象的引用。 这通常是最好的通过返回/采用指针,并给予NULL指针这个具有特殊意义(引用必须总是对象的别名,而不是解除引用NULL指针)来完成。
从我所看到的东西,需要有一个“哨兵”参考的确是经常使用指针而不是引用的原因。 我想知道的是:为什么不是C ++有一个特殊的“NULL值”为参考? 现在看来,这将使指针几乎是不必要的,这将解决很多问题。
那么,为什么不是语言规范的一部分?
编辑:
我不知道我的问题是明确的 - 我想我不litterally询问NULL引用。 大多数情况下,我读了在C ++“的提法是对象”。 而且,在大多数OOP语言中,对象可以是NULL -帕斯卡尔,C#,Java和JavaScript的,PHP等,所有这些,你可以做someObject = null
或someObject := nil
。 事实上,帕斯卡尔也支持指针,但仍允许对象是nil
,因为它有它的用途。 那么,为什么C ++在某种程度上特殊的,没有一个空对象? 这是否是忽略或实际的决定?
因为参考携带语义它指向永不改变的有效存储器地址; 即提领它是安全/定义,因此没有null检查是必需的。 参考无法通过设计来重新分配。
您可以使用指针时,VAR可以为NULL和客户端代码必须处理这种情况。 您可以使用一个引用的时候可以保证一个有效的/初始化的内存地址。
使用指针的一个例子是作为一类的成员来存储“参考”,以一些实例可能不是已知的或者能够在类施工时被初始化。 然而,成员引用必须在施工时间(通过初始化器列表)进行初始化和他们的任务不能被推迟。
如果允许一个空引用时候,那么除了语法的指针没有什么不同(同一null检查需要发生。)
更新:
“而且,在大多数OOP语言中,对象可以是NULL - 帕斯卡尔,C#,Java和JavaScript的,PHP等[...]那么,为什么C ++在某种程度上特殊的,没有一个空的对象是不是只是一个眺望吗?或实际的决定?”
我认为你是一个有点困惑这一点。 Java和C#等可能给“空对象”的印象,但这些对象的引用都或多或少像C ++指针与简单的语法,GC仪器和异常抛出。 如果您对“空对象”操作这些语言,你会得到一些例外的喜欢的NullReferenceException(C#)。 地狱,在Java它称为一个NullPointerException。
你必须检查null
之前,你可以放心地使用它们。 有点像C ++指针(除了在大多数托管语言,指针被默认初始化为NULL,而在C ++中它通常由你来照顾设定初始指针值(另外未定义/不管内存已经在那里了))。
C ++的观点是关于有选择,所以是冗长:
- 使用普通的指针办怎么请你,检查NULL必要。
- 使用具有编译器强制执行的有效性语义/约束引用。
- 推出自己的智能指针是做簿记和行为,你希望他们无论怎样。
- 使用空指针(谨慎!)如果有的话需要引用的内存类型化块。
请看看指针和引用之间的差异 - 而标准的离开它打开引用是如何实现的,他们总是在为指针来实现的时刻。
这意味着它们之间的主要区别是:a)语义b)中的指针可以被重置了c)中的指针可以为空。
所以,简单的答案是,这是故意的。 当你作为程序员看到一个参考,你应该知道,一个),其参考填充二)它不会改变(和c)你可以用相同的语义把它作为一个对象)。
将标准允许空引用,你总是有使用参考,这是不希望之前检查空。
编辑:
关于你的编辑,我在这里想的混乱,大多数简单的面向对象语言隐藏是怎么回事,可能与事实干。 要采取Java作为例子,虽然它看起来像你有NULL对象,并可以指定它们,你真的不能 - 什么是怎么回事的是,Java只有指针,并且可以指定空值的指针。 由于不可能真正具有直接在Java对象,他们破除指针语义和治疗指针为对象。 C ++是简单更强大 - 而且容易出错(Java的爱好者会说栈用户类实例不是必需的,并没有让他们在Java中决定驱动降低复杂性,从而使Java更容易使用)。 它也遵循,因为Java没有对象,它没有引用。 真的没有什么帮助,不过,是Java调用什么是C ++的人会叫一个传递价值的指针一个传递引用的。
A C ++引用不是在大多数其它语言使用术语的意义上的引用; 它更像是一个别名 。 以同样的方式取消引用指针使用C ++引用不涉及“提领”它; 它实际上是指定给它的对象。
是不是真的有这样的事,作为一个空的对象实例 ,所以你不能这样的事情创建一个C ++引用。 在其它语言中一个空引用是一个C ++空指针的等同物; 它实际上并不包含任何内容。
现在,关于你的其他想法:1。具有非可空引用是一件好事 ,我的脑海里; 这意味着你用没有任何的要求,参照得到传球的所有优势,以检查空所有的地方。 2.可空引用不更换指针...如果您需要在较低水平做内存或IO的工作,你会想要内存和内存映射设备的原始访问。 你可以看看C#(或C ++ / CLR),它已经成功引用和非托管指针正是这个原因。
根据定义应当参考与另一个变量或对象相关联。 所以空或空引用类的违反其存在的目的。
从技术上讲,这将意味着你开始与空引用,然后将其分配到某个变量或可能是后者重新分配给另一个变量。 这根本就不是是为那些要创建什么样的参考。
有迹象表明,参考根本无法复制三分球的几个其他用途。 如参考大块复杂的数据(字节的序列)用的使用指针存储器少量并传递作为频繁周围根据需要通过花费只有8个字节左右的指针。 你不能做到这一点与不浪费等于内存的参考。
参考总是被捆绑到一个类型,这是不符合指针的情况。
参考必须是指什么,所以,空引用不可用。
C没有引用,我们可以用这种语言只能使用指针,所以,这是一个用C语言兼容性