Linux Geek技术与逻辑人生格局的修炼

C/C++: C++中引用和指针的区别

2018-06-11  本文已影响0人  治部少辅

这篇文章引用自Stack Overflow上的一篇回答:What are the differences between a pointer variable and a reference variable in C++?。同时加进去了一些我的思考

区别

C++标准并未规定编译器应当以何种方式来实现引用,不过几乎所有的C++编译器都是通过指针来实现引用。如果没有特殊优化,那么引用和指针在消耗的内存上是一样的

引用的设计思想(我的思考)

从上面我们列出的一系列引用和指针的不通之处,我们不难看出引用的设计的两个目的:一是形式的便利性,二是程序运行的安全性。

便利性

使用引用时,可以省去大量的*&符号,使得程序的形式更加简洁。在C++中,这种便利性,也使得操作符重载可以更加自然。例如我们有如下定义的枚举类型

enum day {
    Sunday, Monday //,...
}

如果我们想要该枚举类型支持++操作符,那么我们需要重载这一操作符。如果声明为

day operator++ (day d);

显然无法实现我们的意图。按照传统的C++的想法,此时可以引入指针机制,将操作符重载函数声明为

day operator++ (day* day);

这样声明虽然能够实现我们的功能了,但是我们在使用这个操作符时不得不更改为++&x。这看起来比较诡异。此时使用引用机制就能完美的解决这个问题

day operator++(day& day);

调用的时候使用++x就行了。

这里我们用引用机制完美的解决了这个问题。但是将这一参数形式引入到普通函数的定义上是不合适的。在普通的函数定义中,如果参数是指针式的,那么我们在传递参数的时候需要显式的使用到&。这可以提醒我们我们传递的是指针,意味着这将可能导致我们传递的变量可能在函数内部被修改。在采用引用形式后,这一隐含信息就难以发现了。

安全性

由于引用不能是空的,而且不可以被再次赋值而指向另一个对象,这个特性可以带来变成时候的稳健性,使得过去一些在运行阶段才会暴露出的bug(例如像一个逻辑上不接受NULL的函数传入了NULL参数)能够在编译阶段暴露处理啊。

上一篇 下一篇

猜你喜欢

热点阅读