在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 的深复制