C 學習之一 掌握類和物件

2021-06-16 07:53:55 字數 2266 閱讀 9806

掌握類和物件

物件構造:

在棧上使用建構函式唯一正確的方法:

classname myclass(5);

在堆上使用建構函式:

classname *myclass = new classname(5);

在棧上宣告物件就會呼叫其建構函式,而在堆上可以宣告乙個類的物件指標,不必立即呼叫建構函式。

在棧上呼叫預設建構函式要去掉建構函式的小括號。

一旦自己定義了建構函式,系統就不會自動生成預設建構函式了。

即如果沒有顯式得定義建構函式,系統會自動生成乙個預設建構函式(0引數建構函式)

如果沒有顯式得定義拷貝建構函式,系統會自動生成乙個按值傳遞的拷貝建構函式。

定義建構函式時,盡量使用初始化列表,警告:資料成員會按其出現在類定義中的順序得到初始化,而不是按照初始化列表中的順序。

如果函式或類方法中不會改變引數的值,則盡量使用const 引用來傳遞引數。

物件撤銷:

如果沒有析構函式,系統會自動生成乙個析構函式。

對於棧上的物件,一旦出了作用域,則物件會呼叫析構函式撤銷物件。

所以不要返回函式或者類方法中定義的物件的引用。

物件賦值:

如下面:

spreadsheetcell mycell(5),anthercell;

anthercell = mycell;

你可能想說mycell被「複製」到anthercell。不過,在c++世界中,「複製」只會在物件初始化才會出現。如果乙個物件已經有值了,而這個值要被重寫或覆蓋。,更準確地說是「賦值」。c++為複製操作提供的是拷貝建構函式。由於拷貝建構函式是乙個建構函式,因此只能用於物件建立,而不能用於以後對物件的賦值操作了。因此c++為賦值操作提供的是賦值操作符=過載。如果你沒有自己定義乙個賦值操作符,則系統會自動生成乙個預設的賦值操作符=,它與預設拷貝行為幾乎完全等同。不過不同與拷貝建構函式的是,賦值操作符會返回物件的乙個引用,原因是賦值可以串鏈。

mycell = anthercell = othercell;

區分賦值和複製:

spreadsheetcell mycell(5);

spreadsheetcell anthercell(mycell);   //複製(拷貝)建構函式

//也是複製建構函式構造的,沒有呼叫operator=!,相當於spreadsheetcell athirdcell(mycell);

spreadsheetcell athirdcell = mycell; 

anthercell = mycell; //呼叫operator=!因為anther已經構造。

綜上:=不一定是呼叫operator=表示賦值,當用在變數宣告的同一行上時,是複製建構函式的簡寫。

物件作為返回值:

spreadsheetcell mycell(5);

string s1;

s1 = mycell.getstring();

解析:當getstring()返回物件mycell的mstringl時,編譯器呼叫了乙個string拷貝建構函式,建立乙個匿名的string物件。將這個結果賦值給s1時,會以這個臨時string作為引數,對s1呼叫賦值操作符。然後這個臨時string物件會被撤銷。

而對於:

spreadsheetcell mycell(5);

string s1 = mycell.getstring();

解析:當getstring()返回物件mycell的mstringl時,編譯器呼叫了乙個string拷貝建構函式,建立乙個匿名的string物件。然後s1呼叫拷貝建構函式,而不是賦值操作符。

拷貝建構函式和物件成員:

如果乙個物件的成員中還包含其他物件時,,編譯器生成的拷貝建構函式就會遞迴地呼叫所包含的各個物件的拷貝建構函式。如果你編寫了自己的拷貝建構函式,可以利用初始化列表提供同樣的語義。如果在初始化列表中沒有包含某個資料成員,編譯器會對其完成預設初始化(即呼叫該物件的0引數預設建構函式),然後才執行建構函式體中的**。因此,一旦使用初始化列表,等到執行建構函式體時,所有物件成員已經得到了初始化。

也可以不用初始化列表來編寫拷貝建構函式,如下:

spreadsheetcell::spreadsheetcel(const spreadsheetcel & src)

此時拷貝建構函式體中為資料成員賦值時,呼叫的是賦值操作符,而不是資料成員的拷貝建構函式。

linux下c程式設計起步一 掌握gcc基本用法

初學時最好從命令列入手,這樣可以熟悉從編寫程式 編譯 除錯和執行的整個過程。編寫程式可以用vi或其它編輯器編寫。編譯則使用gcc命令。要往下學習首先就得熟悉gcc命令的用法。gcc命令提供了非常多的命令選項,但並不是所有都要熟悉,初學時掌握幾個常用的就可以了,到後面再慢慢學習其它選項,免得因選項太多...

VC 學習(2) 掌握C

c 的標準輸入輸出流 c 中提供了一套輸入輸出流類的物件,它們是 cin cout 和cerr 對應c 語言中的三個檔案指標 stdin stdout stderr 分別指向終端輸入 終端輸出和標準出錯輸出 也從終端輸出 cin與 一起完成輸入操作,cout cerr 與 一起完成輸出與標準錯誤輸出...

04掌握需求過程閱讀筆記之一

本次,我學習了業務用例,即萬無一失的工作劃分方法,從而為需求調研鋪平了道路。1.確定用例 用例及其用例 use case 這個術語最先由 ivar jacobson在1987年提出,用於描述系統及其使用者之間的互動。jacobson需要將系統分解為較小的單元,因為他感到物件模型不具備可擴充套件性。所...