C++练习,引用本质,复杂数据类型示例等

#include <iostream>
using namespace std;

//第一点
/**
int main()
{
    int a = 10;
    int &b = a;
    //b是a的别名,请问c++编译器后面做了什么工作
    b = 11;
    cout<<"b-->"<<a<<endl;
    printf("a:%d\n",a);
    printf("b:%d\n",b);
    printf("&a:%d\n",&a);
    printf("&a:%d\n",&b);
    system("pause");
    return 0;
    //单独定义的引用时,必须初始化,说明很像一个常量
    //a和b均是同一个内存空间的门牌号
}
*/
//普通引用有自己的内存空间,且与指针所占空间相同
struct Teacher
{
    char name[64];//64
    int age;//4

    double &a;//很像指针所占的内存空间大小 4,
    int &b;
};
/**
void main()
{
    printf("sizeof teacher:%d\n",sizeof(Teacher));
    system("pause");
}
*/
/**
    引用的本质
    1、引用在C++中的内部实现,是一个常量指针
       Type &name<-->Type *const name
    2、C++编译器在编译过程中使用常量指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。
    3、从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的
    细节隐藏
**/

void modifyA3(int *p)
{
    *p = 200;//*p 3
}
//间接赋值
/**
void main()
{
    int a = 10;
    int *p = NULL;//间接赋值成立的三个条件,1定义两个变量
    
    p = &a;
    *p = 100;
    {
        *p = 200;
    }
    modifyA3(&a);//2,建立关联
}
*/
/**
    C++引用使用时的难点:
        当函数返回值为引用时
            若返回栈变量 不能成为其它引用的初始值 不能作为左值使用
            若返回静态变量或全局变量
                可以成为其他引用的初始值 既可以作为右值使用,也可作为左值使用
            C++链式编程中,经常用到引用,运算符重载专题
*/
int getAA1()
{
    int a;
    a = 10;
    return a;
}
//返回A的本身,返回a的一个副本
/**
int &getAA2()
{
    int a;//如果是返回栈上的引用,有可能会有问题
    a = 10;
    return 0;//;
}
int *getAA3()
{
    int a;
    a = 10;
    return &a;
}
*/
//若返回栈变量,不能成为其它引用的初始值
/**
void main()
{
    int a1 = getAA1();
    int a2 = getAA2();
//    int &a3 = getAA2();
    printf("a1:%d,a2:%d\n",a1,a2);
    system("pause");
}
*/
//变量是static或者是全局变量
int j1()
{
    static int a = 10;
    a ++;
    return a;
}
int &j2()
{
    static int a = 10;
    a ++;
    return a;    
}
/**
void main()
{
    int a1 = 10;
    int a2 = 20;

    a1 = j1();
    a2 = j2();
    int &a3 = j2();

    printf("a1:%d,a2:%d,a3:%d\n",a1,a2,a3);
    system("pause");
}
*/
//函数当左值
int g1()
{
    static int a = 10;
    a++;
    return a;//返回变量的值
}
//返回变量本身,返回变量所标识的内存空间
int &g2()
{
    static int a = 10;
    a++;
    return a;//返回变量本身
}
void main()
{
    //g1() = 100;
    g2() = 100;//函数返回值是一个引用并且当左值
    g2();
    printf("%d\n",g2());
    system("pause");
}

猜你喜欢

转载自blog.csdn.net/youjiangtengwan1/article/details/83930109