一、只要類中帶有指針,則類中必須有Big Three。
Big Three 分別是:
1.拷貝構(gòu)造函數(shù): string(const string& other); 簡(jiǎn)稱 copy ctor
2.拷貝賦值:string& operator = (const string& other); 簡(jiǎn)稱 copy op=
3.析構(gòu)函數(shù): ~string();
拷貝賦值不等于拷貝構(gòu)造
string s3(s1);與s3 = s1;不一樣,前者是拷貝構(gòu)造的方式進(jìn)行初始化,而后者是賦值,需要重載=,是拷貝賦值。
在構(gòu)造函數(shù)中,需要對(duì)指針進(jìn)行動(dòng)態(tài)內(nèi)存分配,而在析構(gòu)函數(shù)中,需要消除該內(nèi)存空間。
new 與 delete對(duì)應(yīng);
new TypeName[] 與 delete[] pointer name 對(duì)應(yīng)
拷貝賦值經(jīng)典寫法:
-檢查賦值對(duì)象與被賦值對(duì)象是否是同一地址(檢測(cè)自我賦值),是的話直接地址返回被賦值對(duì)象。一方面可以提高效率,另一方面是比較出現(xiàn)賦值對(duì)象的內(nèi)存空間被同一地址的被賦值對(duì)象消除,以至于在接下來的步驟中出錯(cuò);
-先清空被賦值對(duì)象的內(nèi)存空間;
-再動(dòng)態(tài)創(chuàng)建一個(gè)被賦值對(duì)象的新內(nèi)存空間;
-再賦值。
二、stack(棧)與heap(堆)
圖中表示的是動(dòng)態(tài)分配所得到的內(nèi)存塊
紅色的稱為cookies,用來表示內(nèi)存塊的起始位置與終點(diǎn)位置;
灰色的是調(diào)試模式下才有的
綠色的則是類在棧中的內(nèi)存模型
淺綠色的是為了內(nèi)存對(duì)齊,需要能夠被16整除,所以原本是占了52個(gè)單元,但實(shí)際上是占用了64個(gè)單位的內(nèi)存空間。
三、Singleton
有時(shí)候一個(gè)類不希望被其他人創(chuàng)建對(duì)象,則可以將構(gòu)造函數(shù)設(shè)為私有,此時(shí)該類的使用方式會(huì)比較特別:
class A{
public:
static A& getInstance(return a;);
setup() {...}
private:
A();
A(const A& rhs);
static A a;
...
};
使用方法:
A::getInstance().setup();
或者是另一種寫法
class A{
public:
static A& getInstance(return a;);
setup() {...}
private:
A();
A(const A& rhs);
...
};
A& A::getInstance()
{
static A a;
return a;
};
使用方法:
A::getInstance().setup();