c++传值语义 pass by Reference

reference扮演着外界和对象之间一个间接手柄的角色。        只要在类型名称和reference名称之间插入&符号,便是声明了一个reference;

int ival=1024;//对象,类型为int

int *pi=&ival;//pointer(指针),指向一个Int对象

Int &rval=ival;//reference(引用),代表一个int对象

当我们这么写:
int jval=4096;

rval=jval;

便是将jval 赋值给rval所代表的对象(也iv就是al)。我们无法令rval转而代表jval,因为C++不允许我们改变reference所代表的对象

当我们写pi=&rval;        其实是将ival(此为rval所代表的对象)的地址赋值给pi。我们并未令pi指向rval。        注意!!!重点在面对reference的所有操作都和所面对reference代表的对象所进行的操作一般无二。当我们以reference作为函数参数,亦复如此。

void swap(int &val1,int &val2){

	
	int temp=val1;
	val1=val2;
	val2=temp;
	

}

以此函数为例赋值都是原值

当我们以by reference方式将对象作为函数参数传入时,对象本身并不会赋值出另一份-------复制的是对象的地址。函数中对该对象进行任何操作,都相当于是对传入的对象进行间接操作。

这里将参数声明为reference有两个理由 1希望得以直接对所传入的对象进行修改  2降低复制大型对象的额外负担

void display(const vector<int> vec)
{
	for(int ix=0;ix<vec.size();++ix)
		cout<<vec[ix]<<" ";
	cout<<endl; 
 } 

加上const可以让阅读的人更加了解,我们以传址的方式来传递vector,为的是避免复制操作,而不是为了要在函数中对其修改

如果我们愿意,可以将vector以pointer形式传递。这和以reference传递的效果相同:传递的是对象地址,而不是整个对象的副本。(这非常重要!!!)        唯一差别就是在于两个用法不同

pointer用法

void display(vector<int> vec)
{
    for(!vec){
        cout<<"display(): the vector pointer is 0\n";
        return;
    }
	for(int ix=0;ix<vec.size();++ix)
		cout<<vec[ix]<<" ";
	cout<<endl; 
 } 

 int main(){
 	int ia[8]={8,34,3,13,1,21,5,2};
 	vector<int> vec(ia,ia+8);
 	
 	cout<<"vector before sort:";
 	display(&vec);//传入地址
 	
 	bubble_sort(vec);
 	
 	cout<<"vector after sort:";
 	display(vec);
 	
 }

两个地方不一样,一个是display加了一个pointer其值是否为零,一个是main中修改为display(&vec);//传入地址        指针终究是指向地址的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值