(二)引用

引用的基本使用

作用:给变量起别名

语法: 数据类型 &别名 = 原名

	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/ 的讲义整理

猜你喜欢

转载自www.cnblogs.com/myqD-blogs/p/12926545.html