引用时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. 指针可以指向堆中的空间,引用不能指向堆中的空间