c++传值语义 pass by Reference

发布时间:2024年01月16日

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);//传入地址? ? ? ? 指针终究是指向地址的

文章来源:https://blog.csdn.net/weixin_61847358/article/details/135625653
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。