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