C++中的引用

引用时C++中最常见的,引用是变量的别名。

引用范例:

#include<iostream>
using namespace std;
int main()
{
	int a;
	int &b = a;
	a = 999;
	cout<<"a:"<<a<<endl;
	b = 0;
	cout<<"a:"<<a<<endl;
	system("pause");
	return 0;
}

输出结果:



查看引用变量的地址:

#include<iostream>
using namespace std;
int main()
{
	int a;
	int &b = a;
	a = 888;
	cout<<"Address a:"<<&a<<endl;
	cout<<"Address b:"<<&b<<endl;
	system("pause");
	return 0;
}

输出地址显示结果:

引用是变量的别名,对引用赋值不会改变成赋值的别名,比如b是a的引用,定义c,然后b = c;不会改变b的地址,只会改变b的值。

比如:

#include<iostream>
using namespace std;
int main()
{
	int a;
	int &b = a;
	a = 888;
	cout<<"a:"<<a<<endl;
	cout<<"b:"<<b<<endl;
	cout<<"&a:"<<&a<<endl;
	cout<<"&b:"<<&b<<endl;
	int c = 777;
	b = c;
	cout<<"c:"<<c<<endl;
	cout<<"b:"<<b<<endl;
	cout<<"&c:"<<&c<<endl;
	cout<<"&b:"<<&b<<endl;
	system("pause");
	return 0;
}

结果显示:



我们也可以定义一个对象的别名,但是不能定义一个类的别名,因为类是一种类型,它没有具体的内存地址,所以不能定义类的别名。

比如:

#include<iostream>
using namespace std;
class Human
{
	public:
		int get();
		void set(int);
	private:
		int i;
};
int Human::get()
{
	return i;
}
void Human::set(int x)
{
	i = x;
}
int main()
{
	Human jack;
	Human &mike = jack;
	jack.set(123);
	int result = jack.get();
	int result2 = mike.get();
	cout<<"result:"<<result<<endl;
	cout<<"result:"<<result2<<endl;
	system("pause");
	return 0;
}

结果显示:


我们在定义一个引用的时候,一定要对这个引用初始化

比如说:

int a;

int &b = a;

是正确的

但是

int a;

int &b;

b = a;

是错误的。

引用时常量,只能对其初始化,不能赋值。


空引用:

        我们知道,指针进行删除操作后,需要将它们赋为空,引用却不需要这么做,这是因为引用时原来对象的别名,假如该对象存放在栈中,那么在对象超出作用于时别名和对象一起消失。加入该对象存放在堆中,由于堆中内存空间必须使用指针来访问,因此用不着别名,即使在定义一个该指针的别名,那么将指针删除并赋空之后,该指针的别名中的地址也相应的赋空了。


利用指针返回多值和利用引用返回多值

一.  利用指针返回多值

#include<iostream>
using namespace std;
int func(int ,double *,double *);
int main()
{
	int a;
	double b,c;
	int check;
	cout<<"请输入要运行的值...\n";
	cout<<"您输入的值将作为圆的半径和正方形的边长:"<<endl;
	cin>>a;
	check = func(a,&b,&c);
	if (check)
	{
		cout<<"您输入的值超过了最大范围!"<<endl;
	}
	else
	{
		cout<<"圆的面积为:"<<b<<endl;
		cout<<"正方形的面积为:"<<c<<endl;
	}
	system("pause");
	return 0;
}
int func(int a,double *b,double *c)
{
	if (a>200)
	{
		a = 1;
	}
	else
	{
		(*b) = a*a*3.1415926;
		(*c) = a*a;
		a = 0;
	}
	return a;
}
返回结果:




二. 利用引用返回多值

#include<iostream>
using namespace std;
int func(int ,double &,double &);
int main()
{
	int a;
	double b,c;
	int check;
	cout<<"请输入要运行的值...\n";
	cout<<"您输入的值将作为圆的半径和正方形的边长:"<<endl;
	cin>>a;
	check = func(a,b,c);
	if (check)
	{
		cout<<"您输入的值超过了最大范围!"<<endl;
	}
	else
	{
		cout<<"圆的面积为:"<<b<<endl;
		cout<<"正方形的面积为:"<<c<<endl;
	}
	system("pause");
	return 0;
}
int func(int a,double &b,double &c)
{
	if (a>200)
	{
		a = 1;
	}
	else
	{
		b = a*a*3.1415926;
		c = a*a;
		a = 0;
	}
	return a;
}





指针和引用的区别:

只能用指针的情况:

#include <iostream>
using namespace std;
int main()
{
	int a = 6;
	int *p = &a;
	int b = 9;
	p = &b;
	cout<<*p<<endl;
	system("pause");
	return 0;
}
下面的代码是错误的代码。

#include <iostream>
using namespace std;
int main()
{
	int a = 6;
	int &p = a;
	int b = 9;
	cout<<"p="<<p<<endl;
	&p = b;
	cout<<"p="<<p<<endl;
	system("pause");
	return 0;
}


指针与引用的区别

1. 指针可以为空,引用不能为空

2. 指针可以被赋值,引用不能被赋值

3. 指针可以指向堆中的空间,引用不能指向堆中的空间





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值