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 vec)
{
	for(int ix=0;ix

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

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

pointer用法

void display(vector vec)
{
    for(!vec){
        cout<<"display(): the vector pointer is 0\n";
        return;
    }
	for(int ix=0;ix vec(ia,ia+8);
 	
 	cout<<"vector before sort:";
 	display(&vec);//传入地址
 	
 	bubble_sort(vec);
 	
 	cout<<"vector after sort:";
 	display(vec);
 	
 }

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

你可能感兴趣的:(50,c++,开发语言)