1,拷貝構造函數
String s3(s1); // 以s1爲藍本設定到s3上
2,拷貝賦值this
s3 = s2;
3,若是沒有自定義拷貝構造和拷貝賦值,編譯器會自動生成,可是默認的拷貝構造和拷貝賦值只會很忠實的一個bit一個bit的拷貝過去,對於複數夠用;可是對於帶有指針的則不是很好,由於對於指針賦值,是兩個指針指到同一個地方,而不是真正的拷貝,這個是淺拷貝,並且容易引發內存泄漏
4,只要類中有定義指針,必定要寫拷貝構造和拷貝賦值函數
5,析構函數
當離開做用域的時候,析構函數會被自動調用
若是沒有這個析構函數,動態分配的內存就會形成內存泄漏了
6,字符串兩種表示方法
1,有長度和字符兩個信息
2,在字符的結尾有一個'\0'結尾
7,strlen計算的值不包含結束符
8,以下兩種方式都調用了拷貝構造函數,行爲一毛同樣spa
String s2(s1); String s2 = s1; 而「String s2; s2 = s1;」調用的是拷貝賦值函數
9,檢測自我賦值----效率高,不單單效率高,若是不這樣,還可能會出錯操作系統
if(this == &str) return *this;
10,stack(棧)
是存在於某做用域(scope)的一塊內存空間。例如當調用函數,函數自己即會造成一個stack用來放置它所接收的參數,以及返回地址。
在函數本體內聲明的任何變量,其所使用的內存塊都取自上述stack。
11,heap(堆)
是由操做系統提供的一塊global內存空間,程序可動態分配從其中得到若干區塊
12,array new 必定要搭配 array delete
13,static
1,class裏的static數據只有一份,銀行戶頭,利率對於全部人都同樣
2,class裏的static函數沒有this,只能處理靜態數據
3,靜態數據須要在外部定義
4,靜態函數能夠經過object調用和經過class調用
14,把ctors放在private區
靜態數據只有一份
靜態函數被class調用
返回對象調用setup函數
Singleton指針
class A
{
public: static A& getInstance( return a; ); setup() { ... } private: A(); A(const A& rhs); static A a; ...
};
調用方式:A::getInstance().setup();code
Meyers Singleton class A { public: static A& getInstance(); setup() { ... } private: A(); A(const A& rhs); ... }; A& A::getInstance() { static A a; return a; }
調用方式:A::getInstance().setup();
15,類模板會形成代碼的膨脹
16,函數模板---類模板中的關鍵字typename和函數模板中的class是相通的,都同樣對象
template <class T> inline const T& min(const T& a, const T& b) { return b < a ? b :a; }
17,namespace
防止重名blog
namespace std { ... }