C++语法之引用

1.引用的概念;
(1)是C++中新增加的概念
所以当引用在C编译器(如gcc编译器)中编译的时候,一般会出错
(2) 引用可以看作一个已定义变量的别名,切记引用不能单独定义。
(3) 引用的语法:Type& name = var
(4)当引用做函数参数的时候(引用作为函数参数声明时不进行初始化)

例题代码;

#include <iostream> 
#include <windows.h>

using namespace std;
 
int main(void){ 
	int a = 666; 
	float c = 10.0; 
	int &b = a; 
	float &d = c; 

	//不能直接定义没有指向的别名 
	int &e = a; 
	couut<<"a ="<< a<<","<<"b = " <<b<<endl; 
	b = 888; 
	couut<<"a ="<< a<<","<<"b = " <<b<<endl; 
	couut<<"a 的地址:"<< &a<<","<<"b 的地址:%p" <<&b<<endl; 
	system("pause"); 
	return 0; 
}

2.引用的作用:
(1)引用可以做函数参数
普通引用在声明时必须用其它的变量进行初始化,
引用作为函数参数声明时不进行初始化

例题代码:

#include <iostream> 
#include <windows.h>

using namespace std;

void swap(int a, int b) { 
	int tmp = a; 
	a = b; 
	b = tmp;
}

//方式一, 使用指针 
void swap1(int *a, int *b) { 
	int tmp = *a; 
	*a = *b; 
	*b = tmp; 
}

//方式二, 使用引用 
void swap2(int &a, int &b) { 
	//int &c; //不可以,因为引用不可单独存在 
	int tmp = a;
	a = b; 
	b = tmp; 
}

int main(void){ 
	int x = 10, y = 100; 
	//swap1(&x, &y); 
	swap2(x, y); 
	cout<<"x ="<<x<<","<<"y ="<<y<<endl;
	system("pause"); 
	return 0; 
}

3.引用的意义:
(1)引用作为其它变量的别名而存在,因此在一些场合可以代替指针
(2)引用相对于指针来说具有更好的可读性和实用性

例题代码:

int swap(int &a, int &b){ 
	int t = a; 
	a = b; 
	b = t; 
	return 0; 
}

int swap(int *a, int *b) { 
	int t = *a; 
	*a = *b; 
	*b = t; 
	return 0; 
}

这两种代码从功能上是等同的,但引用却比指针更容易理解和使用

4.引用的本质
在使用引用的时候,你是否思考过下面这几个问题?
(1)对同一内存空间可以用引用取好几个名字吗?
(2)引用它有没有自己的空间?
(3)比如b 是 a 的别名(int &b = a;),那在运行的过程中 c++编译器后面做了什么工作?

例题讲解代码:

#include <iostream> 
#include <windows.h>

using namespace std;

/*
int swap1(int &a, int &b){ 
	int t = a;
	a = b; 
	b = t; 
	return 0; 
}
*/

int swap2(int * const _a, int *const _b){ 
	int t = *_a; 
	*_a = *_b; 
	*_b = t;
	return 0; 
}

int main(void){ 
	int x = 10; 
	int &y = x; 
	int z = 1000; 
	int w = 10000; 

	y = z; //y 是没有办法指向 z的,这里只不过是把z的值赋给y,改变了x的值

	cout<<"x = "<<&x<<","<<"z ="<< &z<<","<<"w ="<< &w<<endl;
	
	//int &b = a; 
	//b 是 a 的别名,请问 c++编译器后面做了什么工作? 

	//1. 请思考:对同一内存空间可以取好几个名字吗? 
	//int &c = a; 
	//int &d = a; 
	//cout<<"a:" <<a<<","<<"b:"<< b<<","<<"c:"<< c<<","<<"d:"<<d<<endl; 
	//这里打印出来的信息会是a,b,c,d的值都是相同的


	//2. 引用有没有自己的空间
	//上面当打印出来x,y,z,w的地址的时候,会发现每两个之间的距离(彼此相差的字节)是一样的,然后再把打印x,z,w的地址,发现x和z之间相差的字节比原来多了一倍的字节。因此说明引用也有自己的空间。

	//结论: 引用可以定义多个,引用有自己的空间,那么,引用像什么? 
	//综上几点分析: 别名很像常指针 
	//int &b = a等价于int * const b = &a; 
	//swap1(z, w); 换成 swap2(&z, &w); 
	cout<<"z:"<<z<<"," <<"w:"<<w<<endl; 
	system("pause"); 
	return 0; 
}

本质:
1)引用在C++中的内部实现是一个常指针 Type& name 《===》Type* const name
2)C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大 小与指针相同。
3)从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++ 为了实用性而做出的细节隐藏

void func(int &var){ 
	var = 15; 
}
//电脑上会私下里把上面的代码换成下面的代码来执行
void func(int *const var){ 
	*var = 15; 
}

结论:
当实参传给形参引用的时候,只不过是c++编译器帮我们程序员手工取了一个实参地 址,传给了形参引用(常量指针)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值