C++ __ 引用

引用

引用就是一个目标的别名, 就像水浒传里面每个人都有一个外号, 比如:宋江又叫及时雨,呼保义

01, 引用的目标可以是变量和对象

引用必须初始化(将引用与目标绑定)
操作引用就是操作目标本身, 反之亦然

02, 一个变量可以有多个引用

就像一个人可以有多个外号

03, 一个引用只能对应一个目标

就像一个外号不能对应多个人, 比如: 及时雨指宋江, 及时雨不可能又指李逵

04, 引用的类型必须和目标一致
05, 有指针的引用, 没有数组的引用, 没有void引用
06, const 常引用, 可以确保变量的值不会被随意修改
07, 使用引用传递函数参数, 可以减少拷贝, 提高效率
08, 使用引用作为函数返回值,可以减少一次拷贝,提高效率

但要注意,返回值为引用类型时,不要把一个局部变量返回出去
因为函数结束, 局部变量就销毁了, 引用就会绑空,这个引用的值就不确定了

示例代码

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<string>

using namespace std;

void Swap1(int &t_x, int &t_y)
{
    int tmp = t_x;
    t_x = t_y;
    t_y = tmp;
}

//定义一个全局变量
double g_tmp = 0;

double& mul(double &t_x, double &t_y)
{
    //double t_product = t_x * t_y;
    g_tmp = t_x * t_y; // 解决方法, 用全局变量返回
    //return t_product;
    return g_tmp;
}

void fun1()
{
    double t_a = 99.99;
}

void fun2()
{
    double t_b = 88.8099;
}

struct Person
{
    string name; //字符串类型
    int t_age;
};

void getPersonInfo(const Person &person)
{
    //person.name = "Rose";
    cout << "name: " << person.name << endl;
    cout << " age: " << person.t_age << endl;
}


//引用
int main()
{
    //引用就是一个目标的别名, 就像水浒传里面每个人都有一个外号, 比如:宋江又叫及时雨,呼保义
    //引用的目标可以是变量和对象
    //引用必须初始化(将引用与目标绑定)
    //操作引用就是操作目标本身, 反之亦然
    int t_a = 100;
    int &t_b = t_a;
    cout << "t_a: " << t_a << "  &t_a: " << &t_a << endl;
    cout << "t_b: " << t_b << "  &t_b: " << &t_b << endl;
    cout << endl;

    //一个变量可以有多个引用
    int &t_c = t_a;
    cout << "t_a: " << t_a << "  &t_a: " << &t_a << endl;
    cout << "t_c: " << t_c << "  &t_c: " << &t_c << endl;
    cout << endl;

    //修改引用, 变量也会跟着变
    //指向同一目标的引用也会随之改变
    t_b = 200;
    cout << "t_a: " << t_a << "  &t_a: " << &t_a << endl;
    cout << "t_b: " << t_b << "  &t_b: " << &t_b << endl;
    cout << "t_c: " << t_c << "  &t_c: " << &t_c << endl;
    cout << endl;

    //一个引用只能对应一个目标
    int t_d = 300;
    //t_b = t_d; // 这里只是把 t_d 的值赋给 t_b, 而不是 t_b 是 t_d 的引用
    //cout << "t_a: " << t_a << "  &t_a: " << &t_a << endl;
    //cout << "t_b: " << t_b << "  &t_b: " << &t_b << endl;
    //cout << "t_c: " << t_c << "  &t_c: " << &t_c << endl;
    //cout << "t_d: " << t_c << "  &t_d: " << &t_d << endl;
    //cout << endl;

    //引用的类型必须和目标一致
    //int t_e = 1000;
    //double &t_f = t_e; //此时是编译不过的

    //有指针的引用
    int *t_g = &t_a;
    int *&t_p = t_g;
    cout << "&t_a: " << &t_a << "  t_a: " <<  t_a << endl;
    cout << " t_g: " <<  t_g << " *t_g: " << *t_p << endl;
    cout << " t_p: " <<  t_p << " *t_p: " << *t_p << endl;
    cout << endl;

    //没有void引用
    //void t_h = 500;
    //void &t_i = t_h;//此时也是编译不过的

    //没有数组的引用
    //int arr[3] = {1, 2, 3};
    //int &t_arr[3] = arr[3];//引用数组是非法的,编译不过

    //const 常引用, 可以确保变量的值不会被随意修改
    Person man = {"Jack", 20};
    //如果getPersonInfo函数参数没加const, 那么man的成员的值可能被修改
    //加了const, 如果man成员的值被修改,直接就编译不过
    getPersonInfo(man);
    cout << endl;


    //使用引用传递函数参数, 可以减少拷贝, 提高效率
    cout << "t_a: " << t_a << "  &t_a: " << &t_a << endl;
    cout << "t_d: " << t_d << "  &t_d: " << &t_d << endl;
    Swap1(t_a, t_d);
    cout << "after swap : " << endl << "t_a: " << t_a << "  &t_a: " << &t_a << endl;
    cout << "t_d: " << t_d << "  &t_d: " << &t_d << endl;
    cout << endl;


    //使用引用作为函数返回值,可以减少一次拷贝,提高效率
    //但要注意,返回值为引用类型时,不要把一个局部变量返回出去
    //因为函数结束, 局部变量就销毁了, 引用就会绑空,这个引用的值就不确定了
    double t_m = 12.12;
    double t_n = 13.13;
    double &ret = mul(t_m, t_n);
    cout << "ret: " << ret << endl;
    cout << endl;
    fun1();
    cout << "ret: " << ret << endl;//此时ret的值将会改变
    cout << endl;
    fun2();
    cout << "ret: " << ret << endl;
    cout << endl;


    cout << "hello, world" << endl;
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sinat_36629696/article/details/80026691