#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");
}