【學習筆記】構造函數+重載相關
一、構造函數
構造函數在創建對象的過程就會執行,帶參數與不帶參數,帶參數的構造函數會默認將成員變量賦值傳進去的參數。
class Layer {
private:int layer_id; // 層IDstd::string layer_json; // 層的JSON配置
public:Layer(){ }// 構造函數實現Layer(int layerId, const std::string& layerJson) {layer_id = layerId; // 初始化層IDlayer_json = layerJson; // 初始化JSON配置}
};
// 使用帶參數的構造函數創建Layer對象
Layer layer(1, "{\"name\":\"background\",\"opacity\":0.8}");// 等價于先創建對象,再賦值(但更高效)
Layer layer2;
layer2.layer_id = 1;
layer2.layer_json = "{\"name\":\"background\",\"opacity\":0.8}";
二、拷貝構造函數
拷貝構造函數的主要作用是用一個已存在的Window對象來初始化新對象。
class Window
{public:Window(){ }virtual ~Window(){ }// const:確保原對象不被修改,允許接收常量對象。Window(const Window& obj){win_id = obj.win_id; sizeType = obj.sizeType;type = obj.type;zorder = obj.zorder; isBackground = obj.isBackground; isFreeze = obj.isFreeze; }
..........
*默認行為:要是沒有自定義拷貝構造函數,編譯器會生成默認的,不過默認的是淺拷貝,這在對象管理動態資源時可能會引發問題。比如指針,淺拷貝僅復制指針值,導致多個對象指向同一塊內存,析構時會引發雙重釋放錯誤。
三、賦值運算符重載
賦值運算符重載 Window& operator=(const Window& obj) 允許你使用 = 符號將一個 Window 對象的值賦給另一個 Window 對象。
class Window
{public:Window(){ }virtual ~Window(){ }Window& operator=(const Window& obj){if (this == &obj) return *this; // 處理自我賦值win_id = obj.win_id; sizeType = obj.sizeType;type = obj.type;zorder = obj.zorder; isBackground = obj.isBackground; isFreeze = obj.isFreeze; isLock = obj.isLock; return *this;}
..........
舉例:
Window win1;
Window win2;
win2 = win1;
四、比較運算符重載
class Window
{public:Window(){ }virtual ~Window(){ }// 相等比較運算符的實現bool operator==(const Window& obj) const{if(win_id == obj.win_id &&sizeType == obj.sizeType &&type == obj.type &&zorder == obj.zorder &&source == obj.source &&layerout == obj.layerout &&invalidResource == obj.invalidResource &&layerType == obj.layerType)return true;elsereturn false;}// 不相等比較運算符的實現bool operator!=(const Window& obj) const{return !operator==(obj);}
..........
舉例:
Window win1;
Window win2;
win2 = win1;
if(win1 == win2)
{........
}