9.C++引入了“引用类型”,即一个变量是另一个变量的别名
(C++真是妙啊,这个引用确实是很好用的啦,推荐一波~~)
在C语言中的所有类型都是值类型,我们定义了一个变量,那么这个变量就对应着一个内存块,即每个变量都是对应内存块的mingzi
而C++介绍了引用变量,这个引用类型的变量本身不占据独立的内存块,实际上是另外一个变量的别名
#include <iostream>
using namespace std;
int main()
{
double a=3.1415927;
double &b=a; //&在这不是C语言中的取地址运算符,在定义b的时候前面加上了&,说明b是一个引用类型的变量
cout<<"b contains:"<<b<<endl; //b引用了a,b就是a的别名,也就是b和a就是同一个
b=89; //b等于89,也就是a等于89,因为a和b是同一个内存块的不同的名字 ,此时内存块值为89
//修改b和修改a是一样的
cout<<"a contains:"<<a<<endl;
return 0;
}
作用1:
引用变量常用作函数的形参,表示形参和实参实际上是同一个对象,
在函数中对形参的修改也就是对实参的修改
那么C++中函数的参数的传递就是三种方式啦:
①传值
②传地址
③传引用
例:交换变量
//①传值:不起作用
#include <iostream>
using namespace std;
void swap(int x,int y)
{
cout<<"swap函数交换前"<<x<<" "<<y<<endl;
int t=x;
x=y;
y=t;
cout<<"swap函数交换后"<<x<<" "<<y<<endl; //在函数中x和y确实交换了
}
int main()
{
int a=3,b=4;
swap(a,b);
cout<<a<<","<<b<<endl; //在这a和b没有发生交换
return 0;
}
//②传地址:起作用,但使用起来比较混乱
#include <iostream>
using namespace std;
void swap(int *x,int *y) //使用指针变量
{
cout<<"swap函数交换前"<<*x<<" "<<*y<<endl;
int t=*x;
*x=*y;
*y=t;
cout<<"swap函数交换后"<<*x<<" "<<*y<<endl;
}
int main()
{
int a=3,b=4;
swap(&a,&b); //a和b本身没有传过去,而是传他们的地址,间接访问
// &a赋值给x,&b赋值给y,
//x,y分别是int*指针,指向a,b
//*x, *y就是a和b,x和y没有修改,而是x和y指向的变量修改了
cout<<a<<","<<b<<endl;
return 0;
}
//③传引用:起作用,而且使用起来很自然
#include <iostream>
using namespace std;
void swap(int &x,int &y) //定义的x,y是引用类型的 int型的, x、y 本身没有占新的历程
{
cout<<"swap函数交换前"<<x<<" "<<y<<endl;
int t=x;
x=y;
y=t;
cout<<"swap函数交换后"<<x<<" "<<y<<endl; //可以看出引用变量使用起来比较自然
}
int main()
{
int a=3,b=4;
swap(a,b); //x,y分别是a,b的引用,即x就是a,y就是b
cout<<a<<","<<b<<endl;
return 0;
}
作用2:
当实参占据内存大时,用引用代替传值(需要复制)可提高效率,(用引用代替实参)
如果不希望因此无意中修改实参,可以用const修改符(const为常量的意思)。
如:
#include <iostream>
using namespace std;
void change (double &x, const double &y,double z)
{
x = 100;
y = 200; //编译错误! y不可修改,因为是const double &,此时在函数中b定义为常量了,只能在主函数中修改
z = 300;
}
int main ()
{
double a,b,c;//内在类型变量未提供初始化式,默认初始化为0
change(a, b, c); //
cout << a << ", " << b << ", " << c << endl;
return 0;
}