看了下《c++沉思錄》第六章的內容介紹的是控制代碼第一部分,採用引用計數器的方式減少記憶體的拷貝
動手敲了下**加深點印象,加了點注釋
class point
point(int x, int y): xval(x), yval(y){}
int x() const
int y() const
point& x(int xv)
point& y(int yv)
private:
int xval;
int yval;
};point類代表的是座標系上的1個點,point類有2個成員變數xval和yval,有2個建構函式,有獲取xval,yval這兩個值得函式x(),y(),有設定xval,yval這兩個值得函式x(),y()
-------------------控制代碼類------------------------------------------
class handle
;handle::handle():up(new upoint()){}
handle::~handle()
}handle::handle(int x, int y):up(new upoint(x, y)){}
handle::handle(const point &p0):up(new upoint(p0)){}
///拷貝建構函式,引用計數器++
handle::handle(const handle& h):up(h.up)
///等號操作符,先遞增右側的引用計數器,再遞減左側引用計數器
///這一操作即使左右兩個控制代碼引用同乙個upoint物件也能正常工作
handle& handle::operator=(const handle& h)
up = h.up;
return *this;
}int handle::x() const
int handle::y() const
handle& handle::x(int xval)
///指標語義
handle& handle::y(int yval)
///值語義
/*handle h(3, 4);
handle h2 = h;
h2.x(5);
int n = h.x(); ///是3還是5
handle& handle::x(int xval)
up->p.x(xval);
return *this;}*/
handle應該控制它所繫結的物件,就是由handle建立和銷毀物件,從效果上來講handle就是一種只包含單個物件的容器,如果不想暴露point的具體操作,就必須明確的選擇讓handle類支援那些point操作
----------------upoint---------------------------
///為什麼需要upoint這個類?該類用來容納引用計數器和乙個point物件,
///這個類存粹是為了實現而設計的
class upoint
upoint(int x, int y):p(x, y), u(1){}
upoint(const point& p0):p(p0), u(1){}
point p;
int u;
};/*
* 控制代碼類可以避免記憶體的重複拷貝
*/int main()
這個控制代碼類有乙個缺點就是引用計數器和物件本身是存放在upoint中的
C 沉思錄 控制代碼1
1 在 c 沉思錄 類中,使用了 類,存在問題 a 複製,每次建立乙個副本,這個開銷有可能很大 b 有些物件不能輕易建立副本,比如檔案 2 怎麼解決這個問題?使用引用計數控制代碼,對動態資源封裝,控制代碼包含指標,多個控制代碼可以指向同乙個物件。複製的時候,只是複製控制代碼的指標。3 使用引用計數控...
C 沉思錄 控制代碼類2
c 沉思錄 的第六章介紹了控制代碼類,第七章也介紹控制代碼類,不過這章介紹的是引用技術和物件資料分開的技術,有3個類handle,point和usecount組成 順便新增了點自己認為重要的注釋 使用三個資料結構取代第六章的兩個資料結構會增加了模組化的程度而沒有增加額外的複雜性 並不是很理解這句話的...
C 沉思錄 控制代碼2
1 c 沉思錄 控制代碼1 存在問題 控制代碼為了繫結到point的物件上,必須定義乙個輔助類upoint,如果要求控制代碼繫結到point的子類上,那就存在問題了。2 有沒有更簡單的辦法呢?控制代碼使用point 直接繫結到point物件上 包括子類 為了保持多個控制代碼引用計數的一致性,使用in...