前言:謝謝阿秀,指路阿秀的學習筆記
一、基礎語法
1.構造和析構:
類的構造函數是一種特殊的函數,在創建一個新的對象時調用。類的析構函數也是一種特殊的函數,在刪除所創建的對象時調用。
構造順序:父類->子類
析構順序:子類->父類
?2.函數重載和運算符重載
函數重載:在同一作用域內可以聲明多個重名函數,其函數參數的個數或順序或類型必須不同,不能僅通過返回類型的不同來重載函數。
運算符重載:運算符重載函數是類的成員函數(法一)時,它的第一個操作數是調用該函數的對象(即?this
?指針指向的對象),第二個操作數是通過參數傳遞的對象。
Box operator+(const Box& b) {Box box;box.length = this->length + b.length;box.breadth = this->breadth + b.breadth;box.height = this->height + b.height;return box;
}
上述代碼是針對+的重載,可以實現兩個Box對象的相加。
例:Box3=Box1+Box2
實際上相當于? Box1.operator+(Box2);
還有一種方式是通過全局函數的方式重載(定義在類外面)
Box operator+(const Box& a, const Box& b) {Box box;box.setLength(a.getLength() + b.getLength());box.setBreadth(a.getBreadth() + b.getBreadth());box.setHeight(a.getHeight() + b.getHeight());return box;
}
調用方式依然是Box3=Box1+Box2。此時編譯器會將其解釋為Box3 = operator+(Box1, Box2);
3.結構體內存對齊
? 含義:以空間換時間,使一次訪存可以取出一條指令,加快存取速度,常用于RISC指令流水線。
-
?在按字節編址的計算機中,char對齊值是1,int是4,double是8。結構體的默認對齊值是其所有成員中最大的對齊值。
-
struct的長度必須是成員中最大對齊值的整數倍(不夠補空字節)。
? ? 可查看struct大小
struct Example {char a; // 1 字節int b; // 4 字節double c; // 8 字節
};
cout << "Size of Example: " << sizeof(Example) << endl;
- 如何控制內存對齊方式???
? ? ? ? 1. c++11提供了alignas,可以指定結構體對齊方式。
struct alignas(16) Example {char a;int b;double c;
};
?注意事項:alignas的對齊值必須是2的冪次倍,且不能小于結構體最小成員對齊值。
?當指定數值小于默認值的時候,alignas無效。
? ? ?2.#pragma pack(push,n)
? ? ? alignas無效時,使用#pragma強制將對齊方式設置為?n
?字節