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 ;
}
【推广】 免费学中医,健康全家人
原文地址:https://www.cnblogs.com/zhchoutai/p/8868542.html