从C到C++(引用)

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;
}
原创文章 46 获赞 56 访问量 3884

猜你喜欢

转载自blog.csdn.net/qq_46009744/article/details/105232792