《c++沉思錄》的第六章介紹了控制代碼類,第七章也介紹控制代碼類,不過這章介紹的是引用技術和物件資料分開的技術,有3個類handle,point和usecount組成(順便新增了點自己認為重要的注釋)
使用三個資料結構取代第六章的兩個資料結構會增加了模組化的程度而沒有增加額外的複雜性(並不是很理解這句話的意思)
class point
point(int x, int y):xval(x), yval(y){}
point(const point& p):xval(p.xval), yval(p.yval){}
///設定xval和yval的值
point& x(int xv)
point& y(int yv)
///得到xval和yval的值
int x() const
int y() const
private:
int xval;
int yval;
};相對於第六章使用point*而不是upoint*是很重要的,因為正是point*使我們不僅嫩嫩狗狗將乙個handle繫結到乙個point,還能將其繫結到乙個繼承自point的類的物件。
這裡對引用計數器進行了抽象
class usecount
;usecount::usecount(): p(new int(1)){}
usecount::~usecount()
}usecount::usecount(const usecount& u):p(u.p)
///usecount& usecount::operator=(const usecount&)
bool usecount::only()
bool usecount::reattach(const usecount& u)
p = u.p;
return false;
}bool usecount::makeonly()
--*p;
p = new int(1);
return true;
}class handle
;handle(int x, int y):p(new point(x, y)){}
handle(const point& p0):p(new point(p0)){}
handle(const handle& h):p(h.p), u(h.u){}
~handle();
handle& operator=(const handle& h);
private:
point* p;
///引用計數器類u和資料類分離
usecount u;
};handle::~handle()
}handle& handle::operator=(const handle& h)
p = h.p;
return *this;
}
C 沉思錄 控制代碼2
1 c 沉思錄 控制代碼1 存在問題 控制代碼為了繫結到point的物件上,必須定義乙個輔助類upoint,如果要求控制代碼繫結到point的子類上,那就存在問題了。2 有沒有更簡單的辦法呢?控制代碼使用point 直接繫結到point物件上 包括子類 為了保持多個控制代碼引用計數的一致性,使用in...
C 沉思錄 控制代碼類1
看了下 c 沉思錄 第六章的內容介紹的是控制代碼第一部分,採用引用計數器的方式減少記憶體的拷貝 動手敲了下 加深點印象,加了點注釋 class point point int x,int y xval x yval y int x const int y const point x int xv p...
C 沉思錄 控制代碼1
1 在 c 沉思錄 類中,使用了 類,存在問題 a 複製,每次建立乙個副本,這個開銷有可能很大 b 有些物件不能輕易建立副本,比如檔案 2 怎麼解決這個問題?使用引用計數控制代碼,對動態資源封裝,控制代碼包含指標,多個控制代碼可以指向同乙個物件。複製的時候,只是複製控制代碼的指標。3 使用引用計數控...