博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

LinuxC/C++基础——引用

Posted on 2019-12-18 23:08  煮酒论天下  阅读(381)  评论(0编辑  收藏  举报

1.引用(Reference)

1.1引用的基本语法

引用是C++对C的重要扩充,也存在与其他一些编程语言中,并不是C++的发明。通过引用,C++增加了

另外一种给函数传递地址的途径,这就是按引用传递(pass-by-reference)

引用就是已定义变量的别名

void test01(){

    int a = 10;
    //给变量a取一个别名b,语法:Type& ref = val;
    int& b = a;
    cout << "a:" << a << endl;
    cout << "b:" << b << endl;
    cout << "------------" << endl;
    //操作b就相当于操作a本身
    b = 100;
    cout << "a:" << a << endl;
    cout << "b:" << b << endl;
    cout << "------------" << endl;
    //一个变量可以有n个别名
    int& c = a;
    c = 200;
    cout << "a:" << a << endl;
    cout << "b:" << b << endl;
    cout << "c:" << c << endl;
    cout << "------------" << endl;
    //a,b,c的地址都是相同的
    cout << "a:" << &a << endl;
    cout << "b:" << &b << endl;
    cout << "c:" << &c << endl;
}

 

 使用引用的注意事项

void test02(){
    //1) 引用必须初始化
    //int& ref; //报错:必须初始化引用
    //2) 引用一旦初始化,不能改变引用
    int a = 10;
    int b = 20;
    int& ref = a;
    ref = b; //不能改变引用
    //3) 不能对数组建立引用
    int arr[10];
    //int& ref3[10] = arr;
}

 1.2函数中的引用

最常见引用的地方实在函数的参数和返回值中。当引用被用作函数参数的时候,在函数内对任何引用的修改,将对函数外的参数

产生改变。相对比指针,引用具有更加清晰的语法。

void ValueSwap(int m,int n){
    int temp = m;
    m = n;
    n = temp;
}
//地址传递
void PointerSwap(int* m,int* n){
    int temp = *m;
    *m = *n;
    *n = temp;
}
//引用传递
void ReferenceSwap(int& m,int& n){
    int temp = m;
    m = n;
    n = temp;
}
void test(){
    int a = 10;
    int b = 20;
    //值传递
    ValueSwap(a, b);
    cout << "a:" << a << " b:" << b << endl;
    //地址传递
    PointerSwap(&a, &b);
    cout << "a:" << a << " b:" << b << endl;
    //引用传递
    ReferenceSwap(a, b);
    cout << "a:" << a << " b:" << b << endl;
}

 

1.3引用的本质

引用的本质在C++内部实现时一个指针常量(指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。在定义的同时必须初始化)

//发现是引用,转换为 int* const ref = &a;
void testFunc(int& ref){
    ref = 100; // ref是引用,转换为*ref = 100
}
int main(){
    int a = 10;
    int& aRef = a; //自动转换为 int* const aRef = &a;这也能说明引用为什么必须初始化
    aRef = 20; //内部发现aRef是引用,自动帮我们转换为: *aRef = 20;
    cout << "a:" << a << endl;
    cout << "aRef:" << aRef << endl;
    testFunc(a);
    return EXIT_SUCCESS;
}

 1.4指针的引用

1.5常量引用

void test01(){
    int a = 100;
    const int& aRef = a; //此时aRef就是a
    //aRef = 200; 不能通过aRef的值
    a = 100; //OK
    cout << "a:" << a << endl;
    cout << "aRef:" << aRef << endl;
}
void test02(){
    //不能把一个字面量赋给引用
    //int& ref = 100;
    //但是可以把一个字面量赋给常引用
    const int& ref = 100; //int temp = 200; const int& ret = temp;
}

 

    [const引用使用场景]
    常量引用主要用在函数的形参,尤其是类的拷贝/复制构造函数。
将函数的形参定义为常量引用的好处:
   引用不产生新的变量,减少形参与实参传递时的开销。
   由于引用可能导致实参随形参改变而改变,将其定义为常量引用可以消除这种副作用。
   如果希望实参随着形参的改变而改变,那么使用一般的引用,如果不希望实参随着形参改变,那么使用常引用。

 

j