c IO物件不可複製

2022-02-17 11:58:20 字數 834 閱讀 8742

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 ...