c++之引用变量

引用的定义:

引用是定义已定义的变量的别名(另一个名称)。

引用一般用途:

引用变量的主要用途是用作函数的形参,通过将引用变量做参数,函数将使用原始数据,而不是拷贝。

创建引用变量:

int i;

int & j = i; 此处& 符号不是地址符 是用来类型标识符的一部分,就像声明中的int*指向int的指针,int& 是指向int的引用。

以上代码等价于 int* const j= i;不同之处在于必须在声明引用时将其初始化,而不是像指针一样,先声明再赋值。可以通过初始化声明来设置引用但是不能通过赋值来设置。

int a = 101;

int *pt = &a;

int &r = *pt;

int b = 50;

pt = &b;

将r初始化为*pt使得r指向a,接下来将pt改为指向b,并不能改变r是引用的是a;

用途

将引用用作函数参数:这种传递参数的方法叫,按引用传递。按引用传递允许被调用函数能够访问调用函数中的变量
#include <iostream>
void swapr(int &a,int &b);//按引用传递
void swapp(int* a,int* b);//按指针传递
void swapv(int a,int b);//按值传递
using namespace std;
int main(){
	int a = 100;
	int b = 300;
	cout<<"调用函数之前:a = "<<a<<" b = "<<b<<endl;
	swapr(a,b);
	cout<<"调用引用:a = "<<a<<" b = "<<b<<endl;
	swapp(&a,&b);
	cout<<"调用指针:a = "<<a<<" b = "<<b<<endl;
	swapv(a,b);
	cout<<"调用按值:a = "<<a<<" b = "<<b<<endl;
	system("pause");
	return 0;
}
void swapp(int* a,int* b){
	int temp =*a;
	*a =*b;
	*b =temp; 
}
void swapr(int &a,int &b){
	int temp = a;
	a = b;
	b= temp;
}
void swapv(int a,int b){
	int temp = a;
	a = b;
	b= temp;
}
按引用和按值调用相同不同点1:声明不同2.按值传递参数是复制a,b的值,引用是a,b的别名直接操作a,b的地址
引用和指针区别很明显这里不累述了。呵呵。
引用函数的参数不能是表达式(以前的编译器可能用临时变量,现在的一般都是报错不允许用)
如:swapr(a+3,b);//不允许,a+3 不符合要求
应尽可能使用const:
如swapr(const int & a,const int & b);
优点:
1.使用const可以避免无意中修改数据的编程错误
2.使用const是函数可以处理const和非const参数,否则只能接受非const
3.使用const引用可以使函数正确的生成并使用临时变量

#include <iostream>
#include <string>
using namespace std;
string version1(const string& s1,const string& s2);
const string& version2(string& s1,const string& s2);
const string& version3(string& s1,const string& s2);
int main(){
	string input;
	string cpy;
	string result;
	cout<<"请输入:"<<endl;
	getline(cin , input);
	cpy = input;
	cout<<"字符串:"<<input<<endl;
	cout<<"version1"<<endl	;
	result = version1(input,"**");
	cout<<"result = "<<result<<endl;
	cout<<"input = "<<input<<endl	;
	cout<<"version2"<<endl	;
	result = version2(input,"##");
	cout<<"result = "<<result<<endl;
	cout<<"input = "<<input<<endl	;
	input = cpy;
	cout<<"version3"<<endl	;
	//result = version3(input,"@@");//不能调用
	cout<<"result = "<<result<<endl;
	cout<<"input = "<<input<<endl	;

	system("pause");
	return 0;
}
string version1(const string& s1,const string& s2){
	string temp;
	temp = s2+s1+s2;
	return temp;//返回一个string字符串 temp的内容将被复制到一个临时返回存储单元中。然后在main中复制给result。
}
const string& version2(string& s1,const string& s2){
	s1 = s2+s1+s2;
	return s1;//直接修改s1的值,可以
}
const string& version3(string& s1,const string& s2){
	string temp;
	temp = s2+s1+s2;
	return temp;//虽然temp既不是指针也不是引用但是返回值是 引用因此函数运行结束之后 temp释放(程序试图引用已经释放的内存)
}

引用,指针和按值传递该什么时候使用?

(1)使用引用参数的主要情况:

a.程序员能够修改调用函数中的数据对象;

b.通过传递引用而不是整个数据对象,可以提高程序的运行速度。

(2)对于使用传递的值而不做修改的函数:

a.数据对象很小,如内置数据类型或小型结构,则按值传递;

b.数据对象是数据,使用const 指针;

c.数据对象是较大的结构,使用const指针或const引用;

d.数据对象是类对象,使用const引用。

(3)对于修改调用函数中数据的函数:

a.数据对象是内置数据类型,使用指针;

b.数据对象是数组,使用指针;

c.数据对象是结构,使用指针或引用

d.数据对象是类对象,使用引用。

速记:内置类型常规处理,数组用(const)指针,类对象用(const)引用,结构两者都可以。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值