关于C++中的引用

来源:互联网 发布:索尼rx100一代知乎 编辑:程序博客网 时间:2024/04/30 22:10

引用的定义

C++加入了“引用”这种神奇的东西,其解释是:“引用为对象起了另一个名字引用类型引用另外一种类型”。
定义:

int i = rand();int &ri =  I;  // 定义引用时必须初始化,否则将是非法行为

“定义引用时,程序把引用和它的初始值绑定(bind)在一起,而不是将初始值拷贝给引用,一旦初始化完成,引用将和它的初始值对象一直绑定在一起。”
按我的理解,这东西和指针有许多相似之处,指针在我看来从某种程度上来说就是一个变量的别名,当然其他的一些高级功能例如指针移动等得另说。

引用的使用

初学引用的时候;觉得这玩意很没用:为一个变量起另一个名字有什么用?(卖萌)。实际上,引用这个东西在程序中对于数据传递有十分重要的意义。举个栗子:

vector<int> ivec = {0,1,2,3,4,5,6,7,8,9};    for (auto x: ivec){};  //这样使用范围for语句将不能对ivec的内容做任何修改    for (auto &rx: ivec){}; //使用引用即可对ivec的元素进行修改

需要指出的是,范围for在对容器、数组等数据集合进行调用时更像是一个函数,因为传入的数据并不是其本身,而是一个对原数据的复制。for (int x: ivec)就是如此,下面函数块中使用的x实际上是对ivec元素的复制而不是其本身。而如果使用引用(for (auto &rx: ivec)),由于此时的declaration并不是一个变量而是一个引用,因此此时的循环变量可以理解为是指向该数据集合的一个指针,自然可以对原始数据做修改。
调用函数时传值(传引用)调用与其类似:

void some_function1 (int &ri){};    void some_function2 (int i){};    int main ()    {        int a = rand();        some_function1 (a);        some_funciont2 (a);        return 0;}

在这里,虽然对两个不同的函数传入的都是同一个变量a,但是在函数体内却不同,some_function1的传入值虽然是a,但是在函数体内ri被定义成了一个指向a的引用,所以ri是a的别名,也可以理解为ri就是a,各种意义上的。而some_function2接受的变量实际上是a的一份拷贝,因此在some_funcion2内对i做的所有修改不会对其调用者中的a产生影响。

decltype中的引用

一个比较容易混淆的地方是,引用并不是一个int或者double这样的类型,引用就是引用,自身就是一个基本数据类型。引用从来都作为其所指对象的同义词出现,只有在decltype处例外。在某些情况下,如果对一个表达式使用decltype,并且该表达式的值是一个可赋值的左值的话,decltype的类型将是引用。需要注意的是,如果给一个变量加上了括号,那就是一个表达式,如:

    int a;    decltype(a); // 得到int    decltype((a)); // 得到引用

decltype((variable))的结果永远是引用,而decltype(variable)的结果只有当variable本身就是一个引用时才是引用。

0 0
原创粉丝点击