引用详解

专业的C++代码会用到大量的引用,在C++中引用是变量的别名,所有对引用的修改都会改变被引用变量的值,可以将引用当作隐私指针,这个指针没有取变量地址和解除引用的麻烦(也可以将引用当作是原始变量的别名)。

一. 引用变量

1.引用变量在创建的时候必须初始化

int a = 0;
int &b = a;    //work
std::cout << "b:" << b << std::endl; 
    
//int &c = 0;   //error
const int &c = 0;  //work

值得注意的是:不能对创建引用直接“值传递”,除非这是一个const引用;

引用总是引用当初初始化的那个变量,一旦创建就无法修改变量,但是可以修改变量的值,比如:

int x = 1,y = 2;
    int &xRef = x,&yRef = y;
    std::cout << "X : " << xRef << std::endl;
    std::cout << "y : " << yRef << std::endl;
    
    //X : 1
    //y : 2
    
    xRef = &y;        //error    

为什么错误呢?

因为xRef是int&,而y得地址是一个指针。所以两者而无法赋值。

如果将一个引用赋值给另一个引用呢?

    xRef = yRef;            
    
    std::cout << "X : " << xRef << std::endl;
    std::cout << "y : " << yRef << std::endl;

结果是:

X : 2
y : 2

看出这里只是将y的值传递给xRef(也就是x),但是XRef还是x得引用。

 2.指针的引用和指向引用的指针

int *a;
    int *&aRef = a;    //指向int的指针的引用 
    aRef = new int;
    *aRef = 100;
    
    std::cout << "a :"  << *a << std::endl;
    
    int b;
    int &bRef = b;
    int *p = &bRef;    //指向b引用的地址 
    *p = 10;
    std::cout << "b :"  << b << std::endl;

结果是:

a :100
b :10

3.引用参数

引用通常作为函数或则方法的参数。默认的参数传递机制是按值传递。

引用传递相对按值传递的优点有:

1.效率:复制较大的对象或则结构需要较长的时间,引用传递只是把指向对象或则结构的指针传递给函数。

2.正确性:并非所有的对象都支持按值传递,即使支持按值传递也不能像deep copy那样。

4.引用作为返回值

引用作为返回值的主要原因是提高效率,返回引用而不是返回整个对象这样可以避免被不必要的复制。

#include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

void swapValue(int a,int b)
{
    int temp = a;
    a = b;
    b = temp;
}

void swapvalue(int &a,int &b)
{
    int temp = a;
    a = b;
    b = temp;
}
int main(int argc, char** argv)
{
    int a = 1,b = 2;
    int c = 3,d = 4;
    std::cout << "a : " << a << "    "
    << "b :" << b << std::endl;
        
    std::cout << "c : " << c << "    "
    << "d :" << d << std::endl;
    
    std::cout << "swapValue :" << std::endl;
    swapValue(a,b);
    std::cout << "a : " << a << "    "
    << "b :" << b << std::endl;
    std::cout << "swapvalue :" << std::endl;
    swapvalue(c,d);
    std::cout << "c : " << c << "    "
    << "d :" << d << std::endl;
    
    
    return 0;
}

结果是:

a : 1 b :2
c : 3 d :4
swapValue :
a : 1 b :2
swapvalue :
c : 4 d :3

原文地址:https://www.cnblogs.com/boost/p/10347667.html