引用的基本使用
作用:给变量起别名
语法: 数据类型 &别名 = 原名
int a = 10;
int &b = a; //b就是a的引用
引用注意事项
- 引用必须初始化
- 引用在初始化后,不可以改变
int a = 10;
int b = 20;
//int &c; //错误,引用必须初始化
int &c = a; //一旦初始化后,就不可以更改
c = b; //这是赋值操作,不是更改引用
引用做函数参数
作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化指针修改实参
//1. 值传递
void mySwap01(int a, int b) {
int temp = a;
a = b;
b = temp;
}
//2. 地址传递
void mySwap02(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
//3. 引用传递
void mySwap03(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
总结:通过引用参数产生的效果同按地址传递是一样的。引用的语法更清楚简单
引用做函数返回值
作用:引用是可以作为函数的返回值存在的
注意:不要返回局部变量引用
用法:函数调用作为左值
//返回局部变量引用
int& test01() {
int a = 10; //局部变量
return a;
}
//返回静态变量引用
int& test02() {
static int a = 20;
return a;
}
int main() {
//不能返回局部变量的引用
int& ref = test01();
cout << "ref = " << ref << endl;
cout << "ref = " << ref << endl;
//如果函数做左值,那么必须返回引用
int& ref2 = test02();
cout << "ref2 = " << ref2 << endl;
cout << "ref2 = " << ref2 << endl;
test02() = 1000;
cout << "ref2 = " << ref2 << endl;
cout << "ref2 = " << ref2 << endl;
system("pause");
return 0;
}
引用的本质
本质:引用的本质在c++内部实现是一个指针常量.
//发现是引用,转换为 int* const ref = &a;
void func(int& ref){
ref = 100; // ref是引用,转换为*ref = 100
}
结论:C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了
常量引用
作用:常量引用主要用来修饰形参,防止误操作
在函数形参列表中,可以加const修饰形参,防止形参改变实参
//int& ref = 10; 引用本身需要一个合法的内存空间,因此这行错误
//加入const就可以了,编译器优化代码,int temp = 10; const int& ref = temp;
const int& ref = 10;
//ref = 100; //加入const后不可以修改变量
cout << ref << endl;
习题
1、下面程序片段哪个没错?
A. int n = 4;
int & r = n * 5;
B. int n = 6;
const int & r = n;
r = 7;
C. int n = 8;
const int & r1 = n;
int & r2 = r1;
D. int n = 8;
int & r1 = n;
const int r2 = r1;
选D
A、错,只能引用变量,不能引用返回值不是变量的表达式 B、错,不能对常引用进行赋值 C、错,不能用常引用对非常引用进行初始化
2、下面程序片段输出结果是什么
int a = 1,b = 2;
int & r = a;
r = b;
r = 7;
cout << a << endl;
A.1
B.2
C.7
D.8
选C
3、下面说法哪种是对的?
A.常引用所引用的变量,其值不能被修改
B.不能通过常量指针,去修改其指向的变量
C.常量指针一旦指向某个变量,就不能再指向其他变量
D.1+1 = 3
选B
A、错,其值可以被修改,只是不能通过引用它的常引用去修改 C、可以指向其他变量 。只是不能通过它修改它所指向的变量 D、1+1 = 2
4、表达式 “new int”的返回值类型是:
A.int
B.int *
C.int &
D.void
选B
5、下面小段程序,哪个是正确的:
A. char * p = new char[10];
p[0] = 'K';
delete [] p;
B. int *p = new int[25];
p[10] = 100;
delete p
C. char * p = new int;
p = 'a';
delete p;
D.int * p = new char[20];
选A
B、delete 数组的时候要用 [] C、类型不匹配 D、类型不匹配
6、下面说法正确的是:
A.多个重载函数的参数个数必须不同。
B.两个函数,参数表相同,返回值类型不同,它们是重载关系。
C.调用一个第二个和第三个参数都有有缺省值的函数时,可以不写第二个实参而写第三个实参。
D.使用内联函数的目的是提高程序的运行速度。
选D
本文根据 https://www.bilibili.com/video/BV1et411b73Z/ 的讲义整理