只讀文件可以拷貝么 c 中如何正確實(shí)現(xiàn)克隆(原型)模式?
c 中如何正確實(shí)現(xiàn)克隆(原型)模式?克隆模式一般針對引用語義(一般只能復(fù)制對對象的引用)的語言,如java,需要通過clone方法顯式的創(chuàng)建與原對象完全一樣的對象;而C 原則上不需要克隆模式,因?yàn)?/p>
c 中如何正確實(shí)現(xiàn)克?。ㄔ停┠J剑?/h2>
克隆模式一般針對引用語義(一般只能復(fù)制對對象的引用)的語言,如java,需要通過clone方法顯式的創(chuàng)建與原對象完全一樣的對象;而C 原則上不需要克隆模式,因?yàn)?,C 本質(zhì)上是值語義的,一般有默認(rèn)的或自定義的拷貝構(gòu)造函數(shù)和拷貝賦值操作符,可以方便的復(fù)制(深拷貝)完全一樣的對象;
不過,C 是很靈活的,也許用戶定義了引用語義的class(類似智能指針那樣的東西),這時(shí)可以通過定義clone接口提供深拷貝復(fù)制對象的方法;
關(guān)于C 的拷貝控制、智能指針、移動(dòng)語義等等知識(shí),可以參考小編的C 11系列文章,歡迎關(guān)注!
PHP對象的淺復(fù)制與深復(fù)制的實(shí)例詳解?
原型模式
用原型實(shí)例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象
原型模式是基于深復(fù)制和淺復(fù)制的,在Java里面有2種復(fù)制:
淺復(fù)制
將一個(gè)對象復(fù)制之后,生成一個(gè)新的對象,新對象的所有成員變量(基本類型或引用類型)都含有與原
有對象相同的值,如果原有對象的成員變量是基本數(shù)據(jù)類型,就會(huì)將這個(gè)變量的值拷貝一份到新對象
里面,如果原有對象的成員變量是引用數(shù)據(jù)類型,那么這個(gè)引用指向的對象不會(huì)新生成一份,而是,
在新對象里面的這個(gè)引用跟原有對象的引用指向的是同一個(gè)對象。
深復(fù)制
將一個(gè)對象復(fù)制之后,生成一個(gè)新的對象,新對象的基本數(shù)據(jù)類型變量含有與原有對象相同的值,如
果原有對象的成員變量是引用數(shù)據(jù)類型,在新對象里面,這些引用變量將指向被復(fù)制過的新對象,而
不再是指向原有的那些被引用的對象,深復(fù)制把要復(fù)制的對象所引用的對象都復(fù)制一遍。
比如:
有一個(gè)A對象,經(jīng)過復(fù)制之后產(chǎn)生一個(gè)B對象,如果A里面有一個(gè)int型的變量i值為4,那么B對象里面
的inti的值也是4,A對這個(gè)int型變量的改變,不會(huì)影響B(tài),如果A里面有一個(gè)成員變量c是引用類型
的,它指向了對象D,經(jīng)過復(fù)制,B里面也會(huì)有一個(gè)c,這個(gè)c也指向D對象,A的c和B的c指向的是同一個(gè)
對象D,這就是淺復(fù)制。如果是深復(fù)制,A里面的c指向一個(gè)D對象,對于B里面的c會(huì)指向一個(gè)新的對象
,他們指向的不是同一個(gè)對象,這樣,在原有對象里面對成員變量c指向的對象D做的任何改變,不會(huì)
影響新對象。
舉個(gè)最簡單的例子:
classA{
publicinti
publicintj
}
Aa=newA()
淺拷貝:
Aa1=a
深拷貝:
Aa1=newA()
a1.i=a.i
a1.j=a.j
感覺如下:
淺拷貝只拷貝對象本身
深拷貝則拷貝對象中引用的對象,一直拷貝下去。