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