c++的引用

目录

  • 一、引用的基本使用
    • 1.语法
    • 2.作用
  • 二、引用注意事项
  • 三、引用作函数参数
  • 四、引用作函数返回值
    • 1.不能返回局部的引用
    • 2.使函数可以作为左值
  • 五、引用的本质
  • 六、常量引用


一、引用的基本使用

1.语法

引用的用法为 : 数据类型 &别名 = 原名

int a = 10;
int &b = a;//给变量a取了一个别名b,这样a和b对应的是同一块内存

2.作用

给变量起别名,使一块内存可以被多个变量名进行修改。

int main() {

	int a = 10;
	int &b = a;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

	b = 100;//对b进行的操作同时也对a起作用

	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

	system("pause");

	return 0;
}

上述代码运行结果如下:
c++的引用_第1张图片

二、引用注意事项

1.引用必须初始化
2.引用在初始化后不可以改变(即不能变成其他变量的别名,但是可以用其他变量来给他赋值)。

int main() {

	int a = 10;
	int b = 20;
	//int &c; //错误,引用必须初始化
	int &c = a; //这里已经将c初始化为a的别名
	//&c = b;//错误,初始化后不可以改变
	c = b; //这是赋值操作,不是更改引用

	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;

	system("pause");

	return 0;
}

上述代码的运行结果如下:
在这里插入图片描述

三、引用作函数参数

函数传参时,可以利用引用让形参修饰实参,这样可以简化指针修改实参。

//引用传递
void mySwap(int& a, int& b) {
	int temp = a;
	a = b;
	b = temp;
}

int main() {

	int a = 10;
	int b = 20;

	mySwap(a, b);
	cout << "a:" << a << " b:" << b << endl;

	system("pause");

	return 0;
}

上述代码的运行结果如下:
在这里插入图片描述

可以看到函数中形参的修改确实可以对实参有影响。

总结:通过引用参数产生的效果同按地址传递是一样的。引用的语法更清楚简单

四、引用作函数返回值

引用是可以作为函数的返回值存在的。

1.不能返回局部的引用

//返回局部变量引用
int& test01() {
	int a = 10; //局部变量,在函数调用完后其内存就被释放了
	return a;
}

int main() {

	//不能返回局部变量的引用
	int& ref = test01();//这里相当于把ref作为局部变量a的别名
	cout << "ref = " << ref << endl;
	cout << "ref = " << ref << endl;

	system("pause");

	return 0;
}

上述代码的运行结果如下:
在这里插入图片描述
局部变量a被销毁后正常来说ref接收的是被释放的内存,而第一次运行正确是因为系统对局部变量a的值进行了一次保留,但并不会一直保留,所以第二次输出就变成乱码。

2.使函数可以作为左值

如果函数作为左值,则必须返回引用。

//返回静态变量引用
int& test02() {
	static int a = 10;//静态变量,存放在全局区,在程序结束后由系统自动释放 
	return a;
}

int main() {

	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++的引用_第2张图片

五、引用的本质

引用的本质在c++内部实现是一个指针常量。当我们写了一个引用后,如int &ref = a;就相当于在c++内部创建了一个指针常量ref,这也是为什么引用不可更改。而后续的ref都会被自动转换为*ref。

//发现是引用,自动转换为 int* const ref = &a;
void func(int& ref){
	ref = 100; // ref是引用,转换为*ref = 100
}
int main(){
	int a = 10;
    
	int& ref = a;//自动转换为 int* const ref = &a; 指针常量是指针指向不可改,也说明为什么引用不可更改 
	func(a);
    
	cout << "a = " << a << endl;
	cout << "ref = " << ref << endl;
    
	return 0;
}

上述代码运行结果如下:
a = 100;
ref = 100;

结论:C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了

六、常量引用

1.当我们不想用形参来修饰实参时,我们就可以用const来修饰形参防止误操作。

//引用使用的场景,通常用来修饰形参
void showValue(const int& v) {
	//v += 10;//因为有const修饰,所以这里不能对v进行修改,否则会报错
	cout << v << endl;
}

2.正常情况下,引用的本身需要一个合法的内存空间,因此引用的右边不能直接是一个值。而加了const后,c++内部会自动生成一个临时变量,并为它分配内存。

int& ref = 10;  10只是一个数,并没有给它分配内存,因此这行错误
//加入const就可以了
const int& ref = 10;//编译器会自动转换为int temp = 10; const int& ref = temp;
ref = 20//因为加了const,res是一个常量而不能被修改,所以此行错误

感谢各位亦菲、于晏的阅读,同时欢迎大家的指正

你可能感兴趣的:(c++,jvm)