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

相关推荐

  1. c++语义 pass by Reference

    2024-01-16 19:24:06       33 阅读
  2. C++ 调用

    2024-01-16 19:24:06       15 阅读
  3. C++ 学习】C++ 指针 引用

    2024-01-16 19:24:06       19 阅读
  4. C/C++-/地址的区别

    2024-01-16 19:24:06       28 阅读
  5. c/c++引用的区别

    2024-01-16 19:24:06       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-16 19:24:06       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-16 19:24:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-16 19:24:06       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-16 19:24:06       20 阅读

热门阅读

  1. Linux软连接

    2024-01-16 19:24:06       29 阅读
  2. shardingsphere 出现 Cannot support database type ‘MySQL‘

    2024-01-16 19:24:06       35 阅读
  3. 构建 aarch64 以及 riscv64 交叉编译工具链(裸机)

    2024-01-16 19:24:06       34 阅读
  4. Python中loguru的配置和使用

    2024-01-16 19:24:06       31 阅读
  5. [HarmonyOS]第一课:运行HelloWorld

    2024-01-16 19:24:06       31 阅读
  6. 《设计模式的艺术》笔记 - 建造者模式

    2024-01-16 19:24:06       23 阅读
  7. GBASE南大通用ExecuteScalar 方法

    2024-01-16 19:24:06       34 阅读