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