io型別的3個獨立的標頭檔案:
iostream定義讀寫控制視窗的型別,
fstream 定義讀寫已命名檔案的型別, (包含fstream類)
sstream定義讀寫儲存在記憶體中的string物件。(包含了stringstream類)
io型別不可複製或賦值
因此,io型別不可儲存在vector容器中。(io是流物件,而流物件是不能複製的,所以不能儲存在vector容器中)
ofstream out1,out2;
out2 = out1; //error : cannot assign stream objects
ofstream print(ofstream);
out2 = print(out2); //error:cannot copy stream objects
形參或返回型別也不能為流型別。如果要傳遞或返回io物件,則必須傳遞或返回指向該物件的指標或引用。
ofstream &print(ofstream&); //ok:takes a reference,no copy
while(print(out2)) // ok:pass reference to out2
一般,如果要傳遞io物件以便對它進行讀寫,可用非const引用的方式傳遞這個流物件。對io物件的讀寫會改變它的狀態,因此引用必須是非const的。
練習:1)ostream print(ostream os);
這個宣告是錯的:首先,io物件是不能複製的,要傳遞或返回io物件時,必須傳遞或返回指向該物件的指標或引用。
應該改成: ostream &print(ostream& os);
不可擴充套件物件
預設情況下,所有物件都是可以擴充套件的。也就是說,任何時候都可以向物件中新增屬性和方法。例如,可以像下面這樣先定義乙個物件,後來再給它新增乙個屬性。var person person.age 29 即使第一行 已經完整定義 person 物件,但第二行 仍然能給它新增屬性。現在,使用 object....
可變物件,不可變物件
不可變物件為字串,元組等 可變物件為列表,字典,集合等。淺拷貝只是對已經存在的記憶體新增加乙個物件引用。深拷貝就是重新申請乙個新的記憶體,使這個是新物件是新記憶體位址的引用。對於可變物件引用時時經常出現。考慮以下兩段 1 l for i in range 10 num i print l 結果 2 ...
物件複製與淺複製
a 15 echo a.輸出15 b a echo b.輸出15 b 25 echo b.輸出25 echo a.輸出15 可以發現,普通變數是值傳遞,在不同的記憶體空間,其中乙個改變對於另乙個沒有影響 class student public function setage age public ...