承接上C++(入门1):CSDN
引用:(类似指针但不同于指针,后续会将两则不同)
概念
引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间, 它和它引⽤的变量共⽤同⼀块内存空间。(类似于一个人有自己的名字还有其他外号,但都是只这个人)
定义
类型& 引⽤别名 = 引⽤对象;
案列理解:
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
int main() {
int a = 10;
printf("a=%d\n",a );
//对a取别名
int& b = a;
printf("b=%d\n",b);
//对a取别名
int& c = a;
printf("c=%d\n",c);
//对b取别名
int& d = b;
printf("d=%d\n",d );
//对d取别名
int& e = d;
printf("e=%d\n",e );
return 0;
}
由上述案例可知,给变量取别名,取别名后的变量与原变量相同,修改某一个别名后,原变量也会跟着变。
优于指针的一个实践:
我们刚学指针的时候,交换两个数值的案列大家应该还知道,接下来就用引用来解决。
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
void temp(int& a1,int &b1) {
int tem = a1;
a1 = b1;
b1 = tem;
}
int main() {
int a = 10;
int b = 20;
cout << "交换前a=:" << a << " b=:" << b << endl;
temp(a, b);
cout << "交换后a=:" << a << " b=:" << b << endl;
return 0;
}
这样一来我们就不需要在传地址,只需起个别名就可以实现交换功能。
引⽤的特性
• 引⽤在定义时必须初始化(明确给那个变量取别名)
• ⼀个变量可以有多个引⽤ (给一个变量取多个别名)
• 引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体
引用其他实体后,只修改值不修该指向(地址)
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
int main() {
int a = 10;
int& b = a;
cout << a << " " << b << endl;
cout << &a << endl;
cout << &b << endl;
int d = 20;
//这时复制的是d的值,并没有改变b的指向
b = d;
cout << a << " " << b << endl;
cout << &a << endl;
cout << &b << endl;
cout << &d << endl;
return 0;
}
引⽤的使⽤
• 引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被 引⽤对象。 比特就业课
• 引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些。
• 引⽤返回值的场景相对⽐较复杂,我们在这⾥简单讲了⼀下场景,还有⼀些内容后续类和对象章节 中会继续深⼊讲解。
• 引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。C++的引⽤跟其他 语⾔的引⽤(如Java)是有很⼤的区别的,除了⽤法,最⼤的点,C++引⽤定义后不能改变指向, Java的引⽤可以改变指向。
const引用
• 可以引⽤⼀个const对象,但是必须⽤const引⽤。
int main() {
//可以引⽤⼀个const对象,但是必须⽤const引⽤。
const int a = 10;
const int& ra = a;
return 0;
}
const引⽤也可以引⽤普通对象。
int main() {
//可以引⽤⼀个const对象,但是必须⽤const引⽤。
int a = 10;
const int& ra = a;
return 0;
}
总结:对象的访问权限在引⽤过程中可以缩⼩,但是不能放⼤。
const引用常量
int main(){
const int& ra=30;
return 0;
}
const引用表达式
int main() {
const int a = 10;
int b = 20;
const int& ra = (a + b);
return 0;
}
const引用不同类型
int main() {
double a = 22.222;
const int& ra = a;
return 0;
}
像上面一些场景,常量30,b表达式(a+b),double型22.222,都先存在临时对象,⽽C++规定临时对象具有常性(常性:就认为被const修饰),所以这⾥ 就触发了权限放⼤,必须要⽤常引⽤才可以。
• 所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象, C++中把这个未命名对象叫做临时对象。
注意:const使用场景主要是传值使用,小编还未学到,暂时先行了解到此。
引用和指针的关系
C++中指针和引⽤就像两个性格迥异的亲兄弟,指针是哥哥,引⽤是弟弟,在实践中他们相辅相成,功能有重叠性,但是各有⾃⼰的特点,互相不可替代。
• 语法概念上: 引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。
• 引⽤在定义时必须初始化(给谁取别名),指针建议初始化,但是语法上不是必须的。
• 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。 • 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。
• sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下 占4个字节,64位下是8byte)
• 指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些。