C++ day6 C++的引用 定义,注意事项。引用的值传递,引用的返回值

1.

引用:给变量起别名

语法:数据类型(跟原名的一样) &别名 =  原名

int &b =  a;

b=20;

cout << a << endl;   //因为a与b都指向相同一块内存

2.注意事项

(1)引用必须初始化

不能一开始就int &b;必须一开始就告诉是谁的别名

(2)初始化后引用不可改变

int &b = a;后

不可以再 int &b = c;  //只能引用一个变量,不能同时几个

int a =10;int c = 20;

int &b =  a;

int &b = c;

cout << a << endl;   //因为a与b指向同一块内存,现在b与c也指向同一块内存,则根据整型顺序,c的值赋给b,b改变也意味着a的值改变。等于C的赋值

3.引用做函数参数

引用函数的值传递也可以修改参数

变量的值传输到引用函数中给变量起的别名里,使这个别名也代表那段地址。则引用函数中的别名的值的改变,也代表地址所表示的值的变化

(1)实现函数交换

//值传递
void trans1(int a, int b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}

 //地址传递
void trans2(int *a, int *b)  //创建两个指针变量接收地址
{
	int temp;
	temp = *a;         //接受的地址解引用
	*a = *b;
	*b = temp;
}


//引用传递
void trans3(int &a, int &b)     //上面这个a是下面主函数a的别名。这个a也代表那段地址的值。
								//在这函数中这个a值的改变也代表地址值的改变,进而影响到了主函数中a的值
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}
int main()
{
	int a = 10; int b = 20;
	trans1(a,b);
	trans2(&a, &b);
	trans3(a, b);        //传输的不是地址,只是把值赋给了引用函数中的别名里
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
	system("pause");
	return 0;
}

4.引用做函数返回值

(1)不要返回局部变量的引用

//不要返回局部变量的引用
int& trans1()     //返回值类型 函数名 (参数列表)  
{
	int a = 10;  //局部变量存放在栈区
	return a;   //这里返回的值是a,然后int &a 代表返回值类型,所以这里返回的是一个别名
}

int main()
{	
	int &ref1 = trans1(); //trans1()是一个别名,用int &ref接收这个别名并用ref表示
	cout << "ref1=" << ref1 << endl;
	cout << "ref1=" << ref1 << endl;//因为第二次地址已被释放掉	
	system("pause");
	return 0;
}

(2)函数的调用可以作为左值(等式左边的值)和a先是局部变量后改成全局变量后的输出问题

        

//不要返回局部变量的引用
int& trans1()     //返回值类型 函数名 (参数列表)  
{
	int a = 10;  //局部变量存放在栈区
	return a;   //这里返回的值是a,然后int &a 代表返回值类型,所以这里返回的是一个别名
}

//函数的调用可以作为左值(等式左边的值)
int& trans2()     //返回值类型 函数名 (参数列表)  
{
	static int a = 10;  //静态变量存放在全局区,数据在程序结束后由系统释放掉
	return a;   //这里返回的值是a,然后int &a 代表返回值类型,所以这里返回的是一个别名
}

int main()
{
	
	int &ref1 = trans1(); //trans1()是一个别名,用int &ref接收这个别名并用ref表示
	int &ref2 = trans2(); 
	
	cout << "ref1=" << ref1 << endl; //这里输出的也是乱的数值,猜测原因是trans1()执行后,trans2()
						//将a的内存地址从栈区变换到了全局区,使得ref1所指向的地址已没有,所以输出的为乱码
					//这里如果把trans2()移到trans1()前,则都输出为10
	cout << "ref1=" << ref1 << endl;//因为第二次地址已被释放掉
	cout << "ref2=" << ref2 << endl;  //因为全局变量由系统在程序结束后释放
	trans2() = 1000;    //相当于a = 1000;
	cout << "ref2=" << ref2 << endl;  //ref2所指向的地址被赋予了1000的值,所以输出变化

	system("pause");
	return 0;
}

5.引用的本质

本质就是一个指针常量,初始化后不能改变是因为这是一个指定方向的指针

int main()
{
    int a = 10;  //开辟内存
    int &ref = a;  //相当于 int * const ref = &a ,创建了一个指针常量ref的指向不变,值可变
    ref = 20; //等于就是*ref = 20;
    system("pause");
    return 0;   
}

6.常量引用

(1)概念理解 

int a = 10;  //开辟内存
    //int &ref = 10;  //这样不行,应用必须是溢出合法的内存空间,得有地址
    //加上const 相当于 int temp = 10;const int &ref = temp;相当于创建了临时空间,所以这里只有别名没有原名
    const int &ref = 10;  
    //ref = 20; 这个值应将成了常数,只读状态,不可更改

(2)const修饰防止误操作

void showvalue(const int &a)  //使这个a变为只读状态的常数
{
	//a = 45; 不能修改
}

int main()
{
	int a = 23;
	showvalue(a);
	cout << "a = " << a << endl;
	system("pause");
	return 0;   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值