今天大年初四了,给大家拜个晚年!♂️♂️
祝愿各位2023年结交更多同步共振的朋友,处于一起进步、同时加油的正能量场中。
祝福各位2023年步步为营,学到新技能、拓展新领域;
祝福大家2023年学业进步、升职加薪、能力提升;
祝愿大家过好当下每一天,做幸福生活的人生赢家;
相信大家都希望自己能有美好生活,都有向善向上之心;拥有让自己美好生活的能力;
本文是C++开篇之作,希望大家多多支持,关注、点赞+评论!!!
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
比如:蔡某某,可以称为"鸡哥",或者称为"鲲鲲"
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 引用一旦引用一个实体,再不能引用其他实体
void Test2()
{
int a = 10;
// int& ra; // 该条语句编译时会出错,没有进行初始化
int& Sa = a;
int& SSa = a;
printf("%p %p %p\n", &a, &Sa, &SSa);
int b = 20;
//是引用还是赋值??
Sa = b;
printf("%p %p %p\n", &a, &Sa, &b);
printf("%d\n",a);
}
通过上述代码我们来简单讲述一下引用的第三条特性:Sa本来是变量a的引用,但是后来我们把变量b赋给它,那么Sa会变成b的引用吗?运行代码后可以发现,Sa的地址和a的地址一样,并没有被改变,所以Sa=b相当于把b赋值给Sa,Sa本来是10,现在被改成了20。
函数中修改形参,实参也改变了
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
int Count1()//传值返回
{
int n = 0;
n++;
// ...
return n;
}
int& Count2()//引用返回
{
static int n = 0;
n++;
// ...
return n;
}
结论:出了函数作用域,返回变量不存在了(不加static的情况),不能用引用返回,因为引用返回的结果是未定义的。
出了函数作用域,返回变量仍然存在,可以用引用返回
通常情况下引用要和const结合使用,接下来我们分析一下为什么?
int a = 0;
// 权限平移
int& ra = a;
// 指针和引用赋值中,权限可以缩小,但是不能放大
const int b = 1;
// rb引用b,b只有可读权限,rb可读可写,权限放大,不允许
//int& rb = b;
// 权限平移
const int& rb = b;
// rra引用a,权限缩小了,允许
const int& rra = a;
假设有一个引用做参数的函数,那么当我们调用此函数的时候,传参就会受限制
//修改前
//void Count(int& s)
//{
//}
//修改后
void Count(const int& s)
{
}
int main{
//...上述代码
Count(a);//可以
Count(b);//不可以,传参时候b的权限扩大了
Count(rra);//不可以,同上
}
这种情况,我们就要考虑在形参加一个const修饰一下,加上const之后,a权限缩小,被允许,b和rra权限平移也可以。
int Count()//传值返回
{
int n = 0;
n++;
return n;
}
int main()
{
const int& b = 10;//可以引用常量,即上述函数传参也可以用Count(10)
double d = 12.34;
int i = (int)d; // 可以
//int& rd = d; // 不可以
const int& rd = d; // 可以
cout << rd << endl;//12
//传值返回测试
//int& ret = Count();错误
const int& ret = Count();
return 0;
}
当int& rd = d; 会发生报错,那么原因是什么呢?是类型不匹配吗?还是其他的原因,我们来分析一下。。。
当发生类型转化的时候,都会产生一个临时变量(传值返回也是),临时变量具有常性,不能修改,这就导致rd在引用d的时候并不是引用d本身,而是d的临时变量,所以要加上const
在语法上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间,但是在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。这就像鱼香肉丝没有鱼,夫妻肺片不是用肺做的。