10_引用本质探究

/*
    1)引用作为其它变量的别名而存在,因此在一些场合可以代替指针
    2)引用相对于指针来说具有更好的可读性和实用性

    引用本质
    1、单独使用引用时,必须初始化,说明很像一个常量
    2、引用有地址,引用是常量 引用在C++中的内部实现是一个常指针
       Type& name <==>Type* const name
    3、C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同
*/

#if 1
struct Teacher
{
    char name[64];  //64
    int age;        //4
    int &a;     //4  很像指针所占的内存空间的大小
    int &b;     //4  引用也占用内存空间
    char &c;    //4
};

/*引用
    当实参传给形参引用的时候,只不过是c++编译器帮我们程序员手工取了一个实参地址,
    传给了形参引用(常量指针)

    间接赋值成立的三个条件
        1 定义两个变量 (一个实参一个形参)
        2 建立关联 实参取地址传给形参  (引用,c++编译器帮程序员做了这步骤)
        3 *p形参 去间接的修改 实参的值

        // 123 写在一块 普通使用
        // 12   3   函数的使用
        // 1    23  引用

    引用在实现上,只不过是把:间接赋值成立的三个条件的后两步和二为一

    使用引用时:
        当我们使用引用语法的时,我们不去关心编译器引用是怎么做的
        当我们分析奇怪的语法现象的时,我们才去考虑c++编译器是怎么做的
*/
void modifyA(int &a1)
{
    a1 = 100;
}

//引用c++编译器实际的动作
void modifyA2(int* const a1)
{
    *a1 = 200;//*实参的地址 ,去间接的修改实参的值 
}

void modifyA3(int *p)
{
    *p = 300;  //*p 3*p形参去间接修改实参的值
}

void test()
{
    //单独定义引用时,必须初始化;说明很像一个常量
    const int c1 = 10;

    int a = 10;
    int &b = a;

    cout << "&a: " << &a << endl;
    //引用有没有地址 即能不能给内存取别名 
    cout << "&b: " << &b << endl;//a  b地址相同; a b均是同一块内存的门牌号

    //引用占内存空间 
    cout << "sizeof(Teacher):" << sizeof(Teacher) << endl;//80

    modifyA(a);//指向这个函数调用的时候,我们程序员不需要取a的地址
    cout << "a: " << a << endl;
    a = 10;
    modifyA2(&a);//如果是指针 需要我们程序员手工的取实参的地址 
    cout << "a: " << a << endl;

    int *p = NULL; //间接赋值成立的三个条件 1 定义两个变量 
    p = &a;
    *p = 100;
    {
        *p = 200;
    }
    modifyA3(&a); //2 建立关联
    cout << "a: " << a << endl;
}
#endif

猜你喜欢

转载自blog.csdn.net/WUZHU2017/article/details/81175642