1:當函式以相應的類作為形參列表時,物件可以作為函式的引數傳入。在學習函式時,我們曾提過,值傳遞先複製實參產生副本。那麼物件的副本是怎樣的呢?
複製建構函式是指類的物件被複製時所呼叫的函式。下面兩種情況中物件都會呼叫複製建構函式。
(1)將乙個物件賦值給另外乙個物件時。例如:
物件1=物件2;
物件1(物件2);
上面的程式中物件2的複製建構函式會被呼叫。
(2)作為值傳遞的實參。例如:
function(物件1);
在function函式體內,使用的是物件1的副本。所以之前會呼叫物件1的複製建構函式。
和建構函式一樣,c++在未發現自定義的複製建構函式之前會建立乙個預設的建構函式。
自定義的複製建構函式的宣告格式為:
類名(類名& 形參)
值得注意的是,複製建構函式時引用傳遞的函式。既然預設複製建構函式已經完成複製工作,那為何需要重新定義它呢?例如,乙個類具有指標型別的資料,預設複製建構函式執行之後,原物件和副本的指標成員指向的是同乙個記憶體空間。通過指標改變該記憶體,就會改變兩個物件實際應用的資料(也就是這塊記憶體的內容)。這時可以自定義複製建構函式,將兩個指標的記憶體分離開。
2:**如下:
(1)germ.h
#includeview codeusing std::string
;class
germ;
(2)germ.cpp
#include "view codestdafx.h
"#include
"germ.h
"#include
using
std::cout;
using
std::endl;
germ::germ(
string
s)germ::germ(germ&g)
germ::~germ()
(3)main.cpp
//view code7.7.cpp : 定義控制台應用程式的入口點。
//#include
"stdafx.h
"#include
#include
"germ.h
"using
std::cout;
using
std::endl;
germ copygerm(germ gc)
intmain()
//注意,呼叫copygerm後,copygerm會立即被釋放,所以會立即放出析構函式,輸出(無氧菌的複製體的複製體被消滅了)
//以後依次g5,g4,g3,g2,g1被釋放,故依次被輸出這些被消滅
執行結果:
從程式執行結果來分析**:首先在主函式中產生了g1物件,由複製建構函式產生了g1的複製體g2——有氧菌複製體。之後定義了g3——無氧菌。通過複製建構函式產生了g3的複製體g4。前四行輸出即是上面所述的過程。g5的產生前,g5所在賦值語句等號右邊的copygerm函式被呼叫,傳遞的實參為g4——無氧菌的複製體。如同開始提到的,值傳遞實參物件產生副本,副本就是形參gc——無氧菌複製品的複製品。函式執行完畢後,傳遞歸臨時變數,內容是gc。g5的值經過複製語句,所以它是gc(臨時變數使用的記憶體)的複製品。
C 入門經典 例7 9 物件陣列,批量化生產
1 在陣列內容中我們了解到,陣列是通過指標分配到的一段額定大小的內容。同樣,陣列也可以包含物件。宣告物件陣列的形式如下 box boxarray 5 box boxarray2 2 box boxarray3 3 值得注意的是,第一種申請物件陣列的方法必須保證類中含有預設的夠好函式,否則編譯器將會報...
C 入門(7) 物件
類 屬性 方法 類名的第乙個字母一般採用大寫,類宣告的末尾必須加上分號 c 允許在類裡宣告常量,但不允許對它賦值,除非建立乙個靜態常量。構造器 1 構造器的名字和它所在類的名字一樣 2 系統會在建立出某個新例項之後,立刻自動呼叫這個類的構造器 3 構造器永遠不返回任何值。如果沒有在類裡定義乙個構造器...
C 入門分享(五) 物件與類
到目前為止,我們介紹了組成c 語言的主要模組,包括變數 資料型別和程式流語句 並簡要介紹了乙個只包含main 方法的完整小例子。但還沒有介紹如何把這些內容組合在一起,構成乙個完整的程式,其關鍵就在於對類的處理。一 類與結構 類和結構實際上都是建立物件的模板,每個物件都包含資料,並提供了處理和訪問資料...