在物件導向設計中,「不知情」和「忽略「也是一種天賜之福。實際上體現的就是一種松耦合,不需要執行 期的實際型別(動態型別)的精確知識。這就是不知情和松耦合的優點。p101頁。
c++中的new有三種形態,一種是最常見的 new運算子,也就是用來在堆上分配記憶體,然後呼叫建構函式的那個。一種是operator new,可以過載,使用者可以自己實現。還有是標準庫中對operator new提供的一種過載,placement new,布局運算子。布局new 運算子的定義如下:
void* operator new (std::size_t size, void* ptr) throw();
注意這裡很奇特的地方,呼叫的時候,這麼寫 new(p) t(args)即會去呼叫布局new 運算子。只有在operator new(...) 這樣寫時,才需要按原型那樣去呼叫。
使用者自定義的operator new 運算子可以帶有多個引數,不過第乙個引數一定要是size_t 型別的(operator delete的第乙個引數是指標,第二個是size_t),而且實際呼叫過程中,也不用顯示的傳入這個引數,這個引數是在最後邊通過接上乙個型別隱式傳入的。
void* operator new(size_t size,string str)
最後呼叫時,使用
t *px = new("a new class") t;
即可。標準的operator new 在std空間中,同malloc() 一樣,只分配記憶體。
如果在類的內部過載了operator new,也就是類成員版本的operator new,那麼每次用new 後接乙個該類的型別,呼叫的都是類成員版本的operator new。這也就是成員版本的operator new 和operator delete。operator new是用來構造物件的,所以那時候還沒有乙個this指標,所以成員版本的operator new 必須是static 的,但是這個static 同 virtual 一樣,是可選的。見c++必知必會63章。
如果在類內部自定義了operator new,同時將operator new設定為protected,這就是說,在堆上構造其物件new 的時候會發生錯誤,無法呼叫operator new。如果將析夠函式設為私有的,也就是外部不能呼叫,那麼可以強制物件只能在堆上構造,可以在用乙個成員函式中,delete this 即可,這樣就不會在外部去呼叫析夠函式。
另外,c++11的容器中引入的emplace() 函式,引數為乙個迭代器表示位置,剩下的是和某個建構函式一樣的引數,利用的就是placement new,直接在給出的記憶體位址上構造乙個物件出來,而不是先構造乙個再拷貝構造乙個。
將建構函式設定為私有的,可以防止被繼承,可以用來實現單例模式。設為保護的,則是為了在派生類的建構函式中能夠呼叫(c++的設計哲學是,public是對所有人開放的,protected是留給孩子的,private 則是對朋友敞開的)。
c++必知必會**片段:
1、使用typename 和 template 消除歧義:
typedef typename a:: template b::type othertype;
這裡b是乙個巢狀於模板a中的內部模板,需要用template 說明,type 是b內部的乙個巢狀型別,即成員型別,需要用typename 說明。
2、對於運算子->的過載,實際是這樣的:
ptr->draw();
這裡ptr是乙個物件,operator->過載運算子的返回值必須是指標,實際完整的寫法是這樣的:
(ptr.operator->())->draw;
3、模板的模板引數:
這裡cont就乙個帶有兩個型別引數的模板,cont 本身又作為myclss模板的乙個模板引數。template class cont>
class myclass
;
4、函式模板的型別引數可以推導,所以不需要顯示的寫出來;但是類模板的型別引數必須得寫出來,這樣,可以借助一些輔助函式,借助於函式模板的型別推導來間接進行類模板的推導,簡潔的完成類模板的例項化。
標準庫中的make_pair<>(), ptr_fun<>() 都是這個理。template pfunmakefun(r (*pf)(t1, t2))
《C 必知必會》讀書筆記(上)
1 資料抽象 1 首先,為型別取乙個描述性的名字。如果很難為這個型別命名,那就說明我們還不知道要實現什麼。因此,我們需要多開動腦筋,結合業務邏輯,給即將產生的類乙個好的合適的職責。這就是設計過程。乙個抽象資料型別應該表示乙個單一的 明確的概念,而且為該概念所取的名字應該是顯而易見的。2 其次,列出型...
《C 必知必會》讀書筆記4
int f 乙個返回值為int 的函式 int f 乙個函式指標,指向乙個返回型別為int的並且無引數的函式 const int n 12 int a n 首先,提醒這段 在c中不行。這個是乙個具有n個int 元素的陣列 int a n 乙個指標,指向乙個具有n個int元素的陣列。int p n 乙...
SQL必知必會》讀書筆記
慎用 檢索所有列 一般而言,除非你確實需要表中的每一列,否則最好別使用 萬用字元。雖然使用萬用字元能讓你自己省事,不用明確列出所需列,但檢索不需 要的列通常會降低檢索和應用程式的效能。使用萬用字元有乙個大優點。由於不明確指定列名 因為星號檢索每一列 所以能檢索出名字未知的列。2.關於distinct...