函数传值和传址(或者引用)

在c++中,类对象是基于结构的,因此结构编程方面的有些考虑因素也适用于类。例如,可按值将对象传递给函数,在这种情况下,函数处理的是原始对象的副本。另外,也可传递指向对象的指针,这让函数能够操作原始的对象。

(1)传递数组:在函数传递数组时,参数是数组名,不用加取地址符号&,传递的是数组的首地址

(2)传递结构:在函数传递结构时,虽然结构和数组都可以存储多个数据项,单在涉及函数时,结构变量的行为更接近于单值变量。也就是说,与数组不同,结构将其数据组合成单个实体或者数据对象。可以将一个结构直接赋值给另外一个结构,同样,也可以按值传递结构。在这种情况下,函数将使用结构的副本,另外,函数也可以返回结构。

与数组名就是数组的第一个元素的地址不同的是,结构名只是结构的名称,要获得结构的地址,必须使用地址运算符&。

在使用结构编程时,最直接的方式就是像处理基本类型那样来处理结构,也就是说,将结构作为函数参数传递,并在需要时将结构作为返回值使用。然而,按值传递有一个缺点,如果结构非常大,则复制结构将耗费内存,并且复制副本也需要时间。出于这个原因(最初的c语言不允许按值传递结构),很多程序员都倾向于传递结构的地址,然后使用指针或者引用来访问结构类容。

(3)string:string对象与结构相似,另外也可以传递指向对象的指针或者引用

(4)array:c++11的array对象与结构也相似,另外也可以传递指向对象的指针或者引用

(5)vector:vector对象与结构也相似,另外也可以传递指向对象的指针或者引用

(6)cv::Mat  函数传递的是地址,而不是副本,与数组相似。其本质是应为cv::Mat存储的数据分为两部分,cv::Mat对象区和数据区,对象区有指向数据区的指针,因此不管是传递地址、传递对象本身、还是引用,其指向数据区的指针指向不变,因此表现出来的是传递地址、浅复制。复制一个副本使用clone、copyTo()。

 

赋值操作=总结:

(1)数组名不能直接赋值,因为数组名是常指针

(2)结构,对象(string、vector、array)赋值都是深复制,传递的是副本,副本修改不影响原来的对象;

(3)cv::Mat的赋值操作是浅复制,复制对象修改对原来对象有影响。copyTo和clone为cv::Mat 的深复制

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值