C++入门 引用详解

    xiaoxiao2021-03-26  23

    //1.引用作为其他变量的别名而存在,因此在一些场合可以代替指针

    //2.引用相对于指针来说具有更好的可读性和实用性

    //3.引用在C++内部实现就是一个常量指针 *const p //int &a == int *const a  

     

    #include "stdafx.h"

    #include<iostream>

    #include"string"

    using namespace std;

     

    class Teacher

    {

    public:

    int  age;

    string name;

    };

     

    void GetAgeA(Teacher *PT)

    {

    cout << PT->age << "  ";

    PT->age = 25;

    }

    //引用就不一样了,引用时将PT和下边的t1绑定在了一起,PT相当于t1的别名,他们都指向同一块内存

    void GetAgeB(Teacher &PT)

    {

    cout << PT.age << "  ";

    PT.age = 25;//所以改了PT就改了t1,这属于C++的一个加强

    }

    void GetAgeC(Teacher PT)//PT是实参,和下边的t1没有直接的内存关系,只是t1 复制了一份数据给了PT

    {

    PT.age = 25;//因为先改了PT 所以运行结果是25

    cout << PT.age << "  ";

    //如果在这里改了PT的age 就只改变了PT的age对t1没有任何影响

    }

     

    //这样的函数是不能实现交换的

    void MySwap(int a, int b)

    {//这样只是进行了a和b的值的交换而对下边的x和y的值却没有影响

    int c = 0;

    c = a;

    a = b;

    b = c;

    }

    //如果要实现交换就要用到指针

    void MySwap2(int *a, int *b)

    {

    int c = 0;

    c = *a;

    *a = *b;

    *b = c;

    }

    //使用引用

    void MySwap3(int &a, int &b)

    {

    int c = 0;

    c = a;

    a = b;

    b = c;

    }

     

    int GetA1()

    {

    int a = 10;

    a++;

    return a;

    }

    //返回值为引用的函数,就是返回a的副本,有内存地址也有值

    //因为返回的是a的副本,相当于一个变量所以也可以当左值,但是必须是静态变量或者是全局变量,不会被析构,才可以。

    int& GetA2()

    {

    int a = 10;

    a++;

    return a;

    }

    //返回值当左值的测试,变量a为静态

    int& GetA3()

    {

    static int a = 10;

    a++;

    cout << "GetA3中的a: " << a << endl;

    return a;

    }

     

    int main()

    {

    int a = 5;

    int &b = a;//这是一个普通的引用,当使用时必须初始化,b就为a的一个别名,很像一个常量定义

    //引用Win32平台下占用4个字节,和指针的占用空间一样

    cout << b << endl;//输出的结果为5

    cout << &b << endl;

    cout << &a << endl;//地址是一样的,这就说明a和b都是同一块内存地址的别名,就是门牌号

     

    Teacher t1;

    t1.age = 20;

    GetAgeC(t1);//使用三种方法调用,这里先使用第三种,目的是看结果,因为第三种方法不改变t1的值,运行后的结果一目了然//25   20

    cout << t1.age << endl;

    GetAgeA(&t1);//使用一种方法调用//20  25

    cout << t1.age << endl;

    GetAgeB(t1);//使用二种方法调用,因为是别名,所以不需要任何符号//25   25

    cout << t1.age << endl;

    int x = 10;

    int y = 20;

    MySwap(x, y);//是第一个交换的方法,没有效果

    cout << "x: " << x << "   " << "y: " << y << endl;

    MySwap2(&x, &y);

    cout << "x: " << x << "   " << "y: " << y << endl;

    MySwap3(x, y);//利用引用,可以使代码简单,也可以实现

    cout << "x: " << x << "   " << "y: " << y << endl;

     

    int x1;

    int y1;

    x1 = GetA1();

    y1 = GetA2();//如果用int值的变量来接这个函数C++会把a的值赋给y1

    int &z = GetA2();//定义一个引用来接这个函数吗,也就是来接a的本身,就是那串内存地址,相当于接了个指针

    cout << "x1: " << x1 << "y1: " << y1 << endl;

    cout << "&z: " << z << endl;//z之所以是乱码是因为GetA2返回的是引用,相当于返回的是一个内存地址,打印z就是取*z,也就是取得这个内存地址中的值10,由于a这个变量在GetA2函数结束时就被析构掉了,所以没有值了,所以为乱码

     

    GetA3() = 100;//可以编译成功说明没有问题,将100赋值给GetA3,也就是将变量a变成了100

    cout << GetA3() << endl;//这里又调用了一次所以为101

     

    return 0;

    }

     

     

    转载请注明原文地址: https://ju.6miu.com/read-660946.html

    最新回复(0)