C 高階程式設計 熟悉類和物件

2021-10-05 10:55:53 字數 3304 閱讀 7302

step1 : 從最小單元spreadsheetcell了解類和物件

1 編寫類定義和類方法

考慮實際電子**允許儲存的物件可以是數字,可以是文字資料。如果接收文字資料,電子**將轉換為數字。簡單的

程式設計實現如下:

spreadsheetcell.h 類方法定義

#spreadsheetcell.h

#ifndef spreadsheetcell_h_

#define spreadsheetcell_h_

#includeclass spreadsheetcell

;#endif

spreadsheetcell.cpp 類方法實現

#spreadsheetcell.cpp

#include "spreadsheetcell.h"

#include #include using namespace std;

void spreadsheetcell::setvalue(double indouble)

void spreadsheetcell::setstring(const string& instring)

const string& spreadsheetcell::getstring() const

string spreadsheetcell::doubletostring(double indouble) const

double spreadsheetcell::stringtodouble(const string& instring) constelse

}

2 編寫物件的建立和使用

在堆疊中的物件呼叫.method(args): 

spreadsheetcell mcell;

mcell.setvalue(5.0);

cout << "mstring " << mcell.getstring() << endl;

在堆中的物件呼叫->method(args)

spreadsheetcell mcell = new spreadsheetcell();

mcell -> setvalue(5.0);

cout << "mstirng " << mcell -> getstring() << endl;

delete mcell;

mcell = nullptr;

二者的主要區別:在堆疊中建立的物件無需手動管理內容,建立的物件記憶體固定;在堆中建立的物件可以動態分配記憶體,但必須在建立時使用new表示式(首先通過operator new為spreadsheetcell物件分配記憶體,然後為這個物件呼叫建構函式,此處建構函式使用預設建構函式),在銷毀時使用delete表示式(首先呼叫spreadsheetcell物件的析構函式,然後呼叫operator delete釋放記憶體)。 

在堆中使用物件時,為避免發生記憶體錯誤,強烈推薦使用智慧型指標。

auto mcell = make_unique();

mcell -> setvalue(5.0)

cout << "mstring " << mcell -> getstring() << endl;

3 物件的生命週期:建立、銷毀、賦值

1 編寫建構函式

//note the var defination order

spreadsheetcell::spreadsheetcell(double indouble):mvalue(indouble), mstring(doubletostring(indouble))

spreadsheetcell::spreadsheetcell(double indouble)

spreadsheetcell::spreadsheetcell(const std::string& instring)

在堆疊中呼叫建構函式:

spreadsheetcell mcell(5.0);
在堆中呼叫建構函式:

spreadsheetcell *mcell = new spreadsheetcell(5.0);

delete mcell;

mcell = nullptr;

//more efficient way

auto smartmcell = make_unipue(5.0);

:無論是在堆中還是在類的物件中宣告指標,但沒有立即初始化物件,都應將指標初始化為nullptr,如果不賦初值nullptr,此時指標未定義,進而可能導致無法預料或難以診斷的記憶體錯誤。

2 特殊的建構函式——複製建構函式

spreadsheetcell::spreadsheetcell(const spreadsheetcell& src)
複製建構函式允許所建立的物件是另乙個物件的精確副本。如果沒有編寫複製建構函式,c++會自動生成乙個,用源物件相應資料成員的值初始化新物件的每個資料成員,如果資料成員是物件,意味著呼叫複製建構函式。

:c++傳遞函式引數的預設方式是按值傳遞,這意味著函式或者方法接收某個值或者物件的副本。因此,無論什麼時候給函式或者方法傳遞乙個物件時,編譯器都會呼叫新物件的複製建構函式進行初始化。當函式或者方法返回物件時,也會呼叫複製建構函式,在此情況下,編譯器使用複製建構函式建立乙個臨時的、沒有名稱的物件。可將傳遞的引數作為const引用,從而避免複製建構函式的開銷。按引用傳遞只需要複製物件的位址,不需要複製物件的全部內容,因此比按值傳遞的效率更高,當按引用傳遞某個物件時,使用物件引用的函式或方法可以修改原始物件,如果只是為了提高效率才使用按引用傳遞,可將物件設定為const以排除這種可能。

3 預設析構函式

當銷毀物件時,首先呼叫析構函式,然後釋放物件占用的記憶體。在析構函式中可以執行物件的清理,如釋放動態記憶體或關閉控制代碼檔案。當堆疊中的物件超出作用域時,意味著當前的函式,方法或者**塊結束,物件被銷毀。沒有智慧型指標的幫助,在堆中分配的記憶體不會自動銷毀,必須使用delete刪除物件指標,從而呼叫析構函式,並釋放記憶體。

practice makes perfect!

C 高階程式設計 物件和型別

類 和 結構 都是建立物件的模板,都可以用 new 類例項化 結構是值型別,儲存在棧上,類是引用型別 儲存在堆上 類可以包含資料成員,函式成員 和 類成員 資料成員 字段,常量 和 事件 在發生某些行為時,事件可以讓物件通知呼叫方,客戶可以包含事件處理程式來響應事件 函式成員 提供了 操作類中資料的...

c 程式設計類和物件

此型別的合法值是什麼?此型別應該有什麼樣的函式和操作符 新型別的物件該如何被建立和銷毀 如何進行物件的初始化和賦值 物件作為函式引數如何以值傳遞 誰將使用此型別的物件成員 語法形式 class 類名稱 在類中宣告函式原型 可以在類外給出函式體實現,並在函式名前使用類名加以限定 也可以直接在類中給出函...

c 物件導向程式設計 類和物件(基礎)

目錄 類的資料成員和成員函式 在類體之外定義成員函式 內聯函式 物件的建立 類成員的訪問 建構函式和析構函式 複製建構函式 物件指標 this指標 靜態類成員 靜態資料成員的宣告,初始化與訪問 靜態成員函式 動態記憶體分配 class 類名 public 公有資料成員,公有成員函式 protecte...