• c++引用总结


    引用做函数參数

    struct Teacher
    {
        char name[64];
        int age ;
    };
    
    void printfT(Teacher *pT)
    {
        cout<<pT->age<<endl;
    }
    
    //pT是t1的别名 ,相当于改动了t1
    void printfT2(Teacher &pT)
    {
        //cout<<pT.age<<endl;
        pT.age = 33;
    }
    
    //pT和t1的是两个不同的变量
    void printfT3(Teacher pT)
    {
        cout<<pT.age<<endl;
        pT.age = 45; //仅仅会改动pT变量 ,不会改动t1变量
    }
    void main()
    {
        Teacher t1;
        t1.age = 35;
    
        printfT(&t1);
    
        printfT2(t1); //pT是t1的别名
        printf("t1.age:%d 
    ", t1.age); //33
    
        printfT3(t1) ;// pT是形參 ,t1 copy一份数据 给pT     //---> pT = t1
        printf("t1.age:%d 
    ", t1.age); //35
    
        cout<<"hello..."<<endl;    
        system("pause");
        return ;
    }
    

    引用的本质

    struct Teacer {
        int &a; //4个字节,相似指针
        int &b;
    };
    int main()
    {
        printf("sizeof(Teacher) %d
    ", sizeof(Teacer));
        system("pause");
        return 0;
    }

    1)引用在C++中的内部实现是一个常指针Type& name ==Type* const name
    2)C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针同样。
    3)从使用的角度。引用会让人误会其仅仅是一个别名。没有自己的存储空间。这是C++为了有用性而做出的细节隐藏。当实參传给形參引用的时候,仅仅只是是c++编译器帮手工取了一个实參地址,传给了形參引用(常量指针)

    函数返回值是引用

    int getAA1()
    {
        int a;
        a = 10;
        return a;
    }
    
    //基础类型a返回的时候,也会有一个副本
    int& getAA2()
    {
        int a;
        a = 10;
        return a;
    }
    
    int* getAA3()
    {
        int a;
        a = 10;
        return &a;
    }
    

    指针引用

    #include <iostream>
    using namespace std;
    
    namespace namespaceA {
        int a = 20;
    }
    
    namespace namespaceB {
        int a = 10;
        namespace namespaceC { //命名空间嵌套
            struct Teacher {
                string name;
                int age;
            };
        }
    }
    
    struct Teacher {
        string name;
        int age;
    };
    
    void OperatorTeacher(Teacher * const p) { //指针不能被改动
    
    }
    void OperatorTeacher(const Teacher *  p) {//指针指向的数据不能被改动
    
    }
    void swap(int &a, int &b){  //引用交换。c++编译器用常指针实现。* const
        int c;
        c = a;
        a = b;
        b = c;
    }
    
    void getTeacher(Teacher **p) {    //*p=pT
        Teacher *tmp = NULL;
        tmp = (Teacher *)malloc(sizeof(Teacher)); 
        tmp->age = 50;
        *p = tmp;
    }
    
    void getTeacher2(Teacher* &p) {   //p是pT的别名
        Teacher *tmp = NULL;
        tmp = (Teacher*)malloc(sizeof(Teacher));
        tmp->age = 60;
        p = tmp;
    }
    int main() {
        //using namespace namespaceB::namespaceC;
        cout << "hello" << endl;
        //cout << namespaceB::a << endl;
    
        int a = 0;
        int &b = a;  //引用,b是a别名 
        const int &c = a;//常引用,不能变数值
        //cout << b << endl;
    
        int x = 1, y = 2;
        swap(x, y);
        //cout << x << endl << y << endl;
    
    
        Teacher *pT = NULL;
        getTeacher(&pT);   //通过指针方式获取数据,子函数内产生数据
    
        getTeacher2(pT);   //通过引用方式获取数据。子函数内产生数据
        cout << pT->age << endl;
    
        return 0;
    }

    常引用

    void main()
    {
        //普通引用
        int a = 10;
        int &b = a;
        //常量引用 :让变量引用仅仅读属性
        const int &c = a;  
    
        //常量引用初始化 分为两种
        //1 用变量 初始化 常量引用
        {
            int x = 20;
            const int& y = x;
            printf("y:%d 
    ", y);
        }
    
        //2 用常量 初始化 常量引用
        {
            //int &m = 10; //引用是内存空间的别名 字面量10没有内存空间 没有方法做引用
            const int &m = 10; //当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名
        }
        cout<<"hello..."<<endl;
        system("pause");
        return ;
    }
    
  • 相关阅读:
    Mysql探索之索引详解,又能和面试官互扯了~
    POJ 1163
    POJ 1157
    POJ 1143
    POJ 1164
    HDU 2553
    POJ 1321
    POJ 1125
    POJ 2488
    POJ 3083
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8868542.html
Copyright © 2020-2023  润新知