目录
8.7 引用(Reference)
8.7.1 普通变量引用
8.7.2 数组引用
8.7.3 指针变量的引用方法
8.7.4 函数的引用
8.7.5 引用作为函数的参数
8.7.6 引用作为函数的返回值类型
1. 返回值类型不用使用局部变量的引用类型
2.返回值类型为引用,可以完成一系列操作链式操作
8.7.7 常引用
1、给常量取别名,不能通过常引用修改内容
2、常引用作为函数的参数:防止函数内部修改外部的值
在C/C++中指针的作用基本都是一样的,但是C++增加了另外一种给函数传递地址的途径,这就是按引用传递(pass-by-reference)。变量名实质上是一段连续内存空间的别名,是一个标号(门牌号)程序中通过变量来申请并命名内存空间通过变量的名字,可以使用存储空间对一段连续的内存空间只能取一个别名吗?C++11开始以后新增了引用的概念,引用可以作为一个以及存在的对象的别名。
8.7 引用(Reference)
8.7.1 普通变量引用
引用的本质是对象的一个别名,即一个引用是对某个对象的另一个名称。
引用过程步骤:
1.&取个别名
2.给那个变量取别名,就定义一个相同的类型
3.从上往下整体替换
例如:
int a = 10; //给变量a取引用的别名,叫b int &b = a; //引用必须初始化
int a = 10;
//给变量a取引用的别名,叫b
//定义的时候 &修饰变量为引用 b就是a的别名(引用)
//编译器不会给引用的别名开辟空间
int &b = a; //引用必须初始化
//此时,a和b代表同一地址空间
//1.看内容
cout<<"a:"<<a<<endl;
cout<<"b:"<<b<<endl;
//2.看地址
cout<<"&a:"<<&a<<endl;
cout<<"&b:"<<&b<<endl;
//3.操作引用对象b就是操作原始的对象a
b = 100;
cout<<"a2:"<<a<<endl;
cout<<"b2:"<<b<<endl;
8.7.2 数组引用
int arr[5] = {10, 20, 30, 40, 50};
int n = sizeof(arr) / sizeof(arr[0]);
int (&myArr)[5] = arr;
int i = 0;
for (i = 0; i < n; i++) {
cout << myArr[i] << " ";
}
cout << endl;
8.7.3 指针变量的引用方法
int num = 10;
int *p = #
int* &myP = p;
std::cout << "*p = " << *p << std::endl; // 输出:10
std::cout << "*myP = " << *myP << std::endl; // 输出:10
8.7.4 函数的引用
8.7.5 引用作为函数的参数
函数内部可通过引用操作外部的变量
例如:
void swap1(int *x,int *y){
int temp = *x;
*x = *y;
*y = temp;
}
使用引用传参,需要直接传地址
void swap2(int &x,int &y){
int temp = x;
x = y;
y = temp;
}
代码:
void swap1(int *x,int *y){
int temp = *x;
*x = *y;
*y = temp;
}
void swap2(int &x,int &y){
int temp = x;
x = y;
y = temp;
}
void test07(){
int a = 10;
int b = 20;
cout << "a = "<< a << ",b =" <<b<<endl;//
//swap1(&a,&b);
swap2(a,b);
cout << "a = "<< a << ",b =" <<b<<endl;
}
引用的语法更清楚简单:
1) 函数调用时传递的实参不必加“&”符2) 在被调函数中不必在参数前加“*”符 引用作为其它变量的别名而存在,因此在一些场合可以代替指针
3)C++主张用引用传递取代地址传递的方式,因为引用语法容易且不易出错。
8.7.6 引用作为函数的返回值类型
1. 返回值类型不用使用局部变量的引用类型
注意此时的引用对象的生命周期,局部变量的生命周期就只存活在该函数体之内的范围。
2.返回值类型为引用,可以完成一系列操作链式操作
struct Stu{
Stu& printstu(Stu &ob,int value){
cout<<value<<" ";
return ob;
}
};
void test09(){
Stu ob1;
ob1.printstu(ob1,100).printstu(ob1,200).printstu(ob1,300);//100 200 300
}
8.7.7 常引用
1、给常量取别名,不能通过常引用修改内容
代码:
//int &num1 = 10;//error 不可以,
const int& num = 10; //num 就是10的别名
//num = 10 是错误的说法
cout << num <<endl;//10
2、常引用作为函数的参数:防止函数内部修改外部的值
void printInt(const int &a){
//a = 200;//err
cout<<"a ="<<a<<endl;
}
void test11(){
int num = 100;
printInt(num);//a = 100
}