本文转自徐飞翔的“引用与指针的区别”
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
引用 (&)与指针(*)都可以在C++中用于表示一个对象的间接引用,其唯一差别似乎只有obj.member和pobj->member类似的用法上的区别。但其实这两者在C++里面的具体用法和设计思想都不同的。我们知道在函数传参数时,默认是值传递,意味着需要在传参数时对传入参数进行拷贝构造,在返回时,如果也是值传递,那么同样需要进行拷贝构造。 作为一种更为高效的方法,是合适地进行引用传递,只是在函数传参和返回时传入和返回其对象的间接引用,使得这个过程更为高效,如:
int computeGradient(const Feature& input, Gradient* grad) {
//....
return SUCC; //状态码
}
在以上代码中,传入的引用input是一个常量,不应该被程序改变,而*grad则是用于传递梯度的指针值,应该对其进行处理,然后函数返回一个状态码表示运行状态。在这个过程中,我们发现,间接引用在实际应用中有两种类型,一种是仅仅是作为对象的引用,而不期望被程序改变;另一种是作为变量传递的。在C语言中,这两种功能都用指针传递进行,顶多加上const表示其是常量,给予编译器查错的一丝丝尊严。然而在C++中,为了更好地区分这两种功能,定义了一个『引用(&)』,引用专为第一个功能而生,因此对引用而言,必须对其进行初始化,而且初始化之后不能被改变,同时引用不能被初始化为空,因为这没有意义。相比之下,指针灵活很多,初始化为nullptr不是什么问题,而且也随时可能被改变。