CPP學習備忘 7 物件生滅

2021-06-02 14:39:56 字數 2218 閱讀 7529

當以無初始化的形式,如:date d;定義時,若建立全域性物件,則以全0位的模式表示物件。若建立區域性物件,則以隨機值表示物件。

作為物件的建構函式,其根本的使命就是建立物件實體,如果建立失敗,這時若真要論及處理,就該讓程式捕捉該異常,或者乾脆終止程式的執行。因此建構函式的工作不以物件體作為返回值,也不以執行的成敗狀態作為繼續執行的依據,建構函式的成功執行,確立了物件實體今後的操作合法性,建構函式的失敗執行,預示著後繼工作無法展開而必須另尋其他途徑。

建構函式是型別名稱引導的定義語句,不是無返回值的函式呼叫語句,所以,建構函式也不是無型別函式。

建立物件如果不給出物件名,也就是說,直接以類名呼叫建構函式,則產生乙個無名物件,無名物件經常在引數傳遞時用到,如:coutint a; //變數定義

int b();    //返回整型值的無參函式宣告

date g; //無參物件定義

data f();   //返回類物件的無參函式宣告

的形式。

在建構函式的引數列表右括號後面,花括號前面,可以用冒號引出建構函式的呼叫表,該呼叫表可以省略型別名稱,但卻行建立物件之職:

class student

區域性和靜態物件是指塊作用域(區域性作用域)和檔案作用域的物件。它們宣告的順序與它們在程式中出現的順序是一致的。而且靜態物件只建立一次。

和全域性變數一樣,所有全域性物件在主函式(main)啟動之前,全部已被構造。所以在程式啟動之前已經有程式語句(建構函式)在那裡被執行過了。因為除錯總是從main函式的位置開始的,因此在開始捕捉錯誤之前,錯誤可能已經產生了。

構造全域性物件不像區域性物件那麼簡單,全域性物件沒有明確的控制流來表明其順序。因為全域性物件還有多個原始檔之間的協調問題,多檔案的程式只有等到程式鏈結之後相互之間的關係才能搞定,但程式檔案相互關係確定並不等於物件建立順序確定,事實上,全域性物件的建立順序是編譯器造出來的,因而不同的編譯器做法就不同。為了避免不確定的問題,應盡量不要設定全域性物件,這是程式設計重用及安全要訣,更不要讓全域性物件之間相互依賴。

成員物件以其在類中宣告的順序構造。

全域性物件、常物件、靜態物件都放在全域性資料區的位置。要想讓物件的宣告期與執行的程式等壽命,只能放在全域性資料區。

預設拷貝構造僅僅拷貝了物件本體。

自定義拷貝建構函式的引數必須是類物件的常量引用:

person(const person& s);

因為:1.物件複製的語義本身尚處於當前定義當中,引數傳遞若為傳值形式,則物件複製操作呼叫的拷貝建構函式在**?!所以只能是引用或者指標。

2.但是指標引數將影響複製的語法:

person p2(*p1); //或者person p1=*p2;這種語法並不優雅,所以用物件的引用;

自定義拷貝建構函式在物件本體與物件實體不一致時,便是需要的,否則無此必要;

當物件本體與物件實體一致時,其拷貝稱為淺拷貝;當物件本體與物件實體不一致時,其拷貝稱為深拷貝。深拷貝需要做動態記憶體分配的工作。因此,當物件的生命期終止時,也就是物件本體消失時,需要做好動態記憶體的釋放工作。動態記憶體申請是人為的,因此釋放也是人為的。

因為析構函式沒有引數,所以函式形式是唯一的,沒有過載的析構函式。另外,析構函式的呼叫不是通過顯式語句表示的,而是自動呼叫的。

從fn(student&)和student(const string&)可以推得fn(string(「jenny」))呼叫。這就是建構函式用來從一種型別轉換為另一種型別的能力。不過須注意,推導過程是簡單的,規則如下:

1.     只會嘗試含有乙個引數的建構函式;

2.     如果有二義性,則會放棄嘗試;

3.     推導是一次性的,不允許多步推導;

物件拷貝就是物件賦值。

person p1(「ranny」);

person p2;

p2=p1; //物件賦值

類機制中有預設的賦值操作符,只要定義了類,就可以進行物件的賦值操作。但是預設的賦值操作符只管物件的本體的複製,如果物件之間要做深拷貝的話,則必須自定義賦值操作符。

自定義賦值操作符必須注意,原來的物件已經存在,要先將原來的資源釋放掉,然後再進行深拷貝式的複製。

賦值操作的返回是引用返回,這是為了與賦值操作符的語義一致。因為賦值操作的結果是乙個可以遞進操作的左值。

任何類,c++都有乙個預設的賦值操作符,用來進行物件本體的複製。賦值操作符過載一般是在物件本體與物件實體不一致時,為了實現物件本體賦值操作以外的操作而進行的。過載了賦值操作符,預設的賦值操作符就不復存在。

一般來說,賦值操作符是與拷貝建構函式和析構函式結隊而行的。

賦值操作必須判斷物件是否在給自己賦值。

CPP學習備忘 9 多型

雖然從廣義上說,資料型別是資料結構在一定的程式語言中的描述形式,但實際上描述群體資料 容器 的抽象資料型別才是資料結構的真正體現。類定義不占用任何記憶體空間,也沒有任何物件的預處理,所以沒有任何操作上的開銷。乙個操作隨著所傳遞或 的物件型別的不同能夠做出不同的反應,其行為模式稱為多型。c 中採用一種...

CPP學習備忘 12 模板

模板使程式設計師能夠快速建立具有型別安全的類庫集合和函式集合,以方便更大規模的軟體開發。c 的stl全賴於模板實現,模板是c 物件導向程式設計的重要補充。函式模板的定義形式為 template 型別參數列 返回型別 函式模板名 資料參數列 函式模板定義體 函式模板不是函式,它是以具體的型別為實參來生...

CPP學習備忘 1 基本程式設計語句

switch括號中的表示式只能是整型 字元型或列舉型表示式。case後面的常量表示式之型別必須與其匹配。流iostream主管資料型別的識別工作和溝通作業系統,全權負責把流中的資料送到對應的裝置上。流的格式操作亦可直接以輸出流的方式操作。常用的流狀態 showpos 在正數 包括0 之前顯示 號 l...