Time of Update: 2018-12-03
Terminology(術語)作者:Scott Meyers譯者:fatalerror99 (iTePub's Nirvana)發布:http://blog.csdn.net/fatalerror99/這是一個所有程式員都應該瞭解的小型的 C++ vocabulary(詞彙表)。下面的術語都足夠重要,對它們的含義取得完全一致對於我們來說是完全必要的。declaration(聲明)告訴編譯器關於某物的 name(名字)和 type(類型),但它省略了某些細節。以下這些都是 declaration(
Time of Update: 2018-12-03
Item 23: 用 non-member non-friend functions(非成員非友元函數)取代 member functions(成員函數)作者:Scott Meyers譯者:fatalerror99 (iTePub's Nirvana)發布:http://blog.csdn.net/fatalerror99/想象一個代表 web browsers(網頁瀏覽器)的 class。在這樣一個 class 可能提供的大量函數中包括清空已下載部分的緩衝,清空已存取 URLs
Time of Update: 2018-12-03
Item 37: 絕不要重定義一個函數的 inherited default parameter value(通過繼承得到的預設參數值)作者:Scott Meyers譯者:fatalerror99 (iTePub's Nirvana)發布:http://blog.csdn.net/fatalerror99/我們直接著手簡化這個話題。只有兩種函數能被你 inherit(繼承):virtual(虛擬)和 non-virtual(非虛擬)。然而,重定義一個 inherited non-virtual
Time of Update: 2018-12-03
(點擊此處,接上篇)The Strategy Pattern via tr1::function(經由 tr1::function 實現的策略模式)一旦你習慣了 templates(模板)和 implicit interfaces(隱式介面)(參見 Item 41)的應用,function-pointer-based(基於函數指標)的方法看上去就有些死板了。健康值的計算為什麼必須是一個 function(函數),而不能是某種簡單的行為類似 function(函數)的東西(例如,一個
Time of Update: 2018-12-03
Item 36: 絕不要重定義一個 inherited non-virtual function(通過繼承得到的非虛擬函數)作者:Scott Meyers譯者:fatalerror99 (iTePub's Nirvana)發布:http://blog.csdn.net/fatalerror99/假設我告訴你 class(類)D 從 class(類)B publicly derived(公有繼承),而且在 class(類)B 中定義了一個 public member
Time of Update: 2018-12-03
Introduction(導言)作者:Scott Meyers譯者:fatalerror99 (iTePub's Nirvana)發布:http://blog.csdn.net/fatalerror99/學習一種程式設計語言的基礎是一回事;學習如何用那種語言設計和實現高效率的程式完全是另外一回事。對於 C++ ——一種以擁有非同尋常的能力範圍和表現力而自豪的語言——更是尤其如此。如果能正確使用,與 C++ 共事是一件令人快樂的事情。極多樣的設計樣式被直接表達並有效實現。對於 classes(類)
Time of Update: 2018-12-03
Item 22: 將 data members(資料成員)聲明為 private作者:Scott Meyers譯者:fatalerror99 (iTePub's Nirvana)發布:http://blog.csdn.net/fatalerror99/好了,先公布一下計劃。首先,我們將看看 data members(資料成員)為什麼不應該是 public(公有)的。然後,我們將看到所有反對 public data members(公有資料成員)的理由同樣適用於
Time of Update: 2018-12-03
(點擊此處,接上篇)已知 MsgSender 針對 CompanyZ 被特化,再次考慮 derived class(衍生類別)LoggingMsgSender:template<typename Company>class LoggingMsgSender: public MsgSender<Company> {public: ... void sendClearMsg(const MsgInfo& info) { write "before
Time of Update: 2018-12-03
(點擊此處,接上篇)那麼該怎麼做呢?我們依然需要一個方法,既使其他人能調用 swap,又能讓我們得到更高效的 template-specific(模板專用)版本。答案很簡單。我們依然聲明一個 non-member(非成員)swap 來調用 member(成員)swap,只是不再將那個 non-member(非成員)聲明為 std::swap 的 specialization(特化)或 overloading(重載)。例如,如果我們的 Widget-related(Widget 相關)機能都在
Time of Update: 2018-12-03
Preface(前言)作者:Scott Meyers譯者:fatalerror99 (iTePub's Nirvana)發布:http://blog.csdn.net/fatalerror99/我在 1991 年寫出了 Effective C++ 的最早版本,1997 年出了第二版,我更新了一些重要的方面的素材,但是,因為我不想使熟悉本書第一版的讀者感到困惑,我盡最大可能保持了原有的結構。最早的 50 個 Item 標題中的 48
Time of Update: 2018-12-03
Item 25: 考慮支援一個 non-throwing swap(不拋異常的 swap)作者:Scott Meyers譯者:fatalerror99 (iTePub's Nirvana)發布:http://blog.csdn.net/fatalerror99/swap 是一個有趣的函數。最早作為 STL 的構件被引入,後來它成為 exception-safe programming(異常安全編程)的支柱(參見 Item 29)和壓制自賦值可能性的通用機制(參見 Item 11)。因為
Time of Update: 2018-12-03
Item 10: 讓 assignment operators(賦值運算子)返回一個 reference to *this(引向 *this 的引用)作者:Scott Meyers譯者:fatalerror99 (iTePub's Nirvana)發布:http://blog.csdn.net/fatalerror99/關於 assignments(賦值)的一件有意思的事情是你可以把它們穿成一串:int x, y, z;x = y = z = 15;
Time of Update: 2018-12-03
(點擊此處,接上篇)但是也許你注意到無論是 on-the-stack(在棧上)的還是 on-the-heap(在堆上)的方法,為了從 operator* 返回的每一個結果都不得不容忍一次 constructor(建構函式)的調用。也許你還記得我們最初的目標是避免這樣的 constructor(建構函式)調用。也許你認為你知道一種方法能避免除一次以外的幾乎全部的 constructor(建構函式)調用。也許下面這個實現是你做過的,一個基於返回一個引向定義在函數內部的 static
Time of Update: 2018-12-03
Item 12: 拷貝一個 object(對象)的所有 parts(構件)作者:Scott Meyers譯者:fatalerror99 (iTePub's Nirvana)發布:http://blog.csdn.net/fatalerror99/在設計良好的 object-oriented systems(物件導向系統)中,封裝了 object(對象)的內部構件,只有兩個拷貝 objects(對象)的函數:被恰當地稱為 copy constructor(拷貝建構函式)和 copy
Time of Update: 2018-12-03
Item 6: 如果你不想使用 compiler-generated functions(編譯器產生函數),就明確拒絕作者:Scott Meyers譯者:fatalerror99 (iTePub's Nirvana)發布:http://blog.csdn.net/fatalerror99/房地產代理商出售房屋,服務於這樣的代理商的軟體系統自然要有一個 class(類)來表示被出售的房屋:class HomeForSale { ...
Time of Update: 2018-12-03
Item 11: 在 operator= 中處理 assignment to self(自賦值)作者:Scott Meyers譯者:fatalerror99 (iTePub's Nirvana)發布:http://blog.csdn.net/fatalerror99/當一個 object(對象)賦值給自己的時候就發生了一次 assignment to self(自賦值):class Widget { ... };Widget w;...w = w;
Time of Update: 2018-12-03
Item 5: 瞭解 C++ 為你偷偷地加上和調用了什麼函數作者:Scott Meyers譯者:fatalerror99 (iTePub's Nirvana)發布:http://blog.csdn.net/fatalerror99/一個 empty class(空類)什麼時候將不再是 empty class(空類)?答案是當 C++ 搞定了它。如果你自己不聲明一個 copy constructor(拷貝建構函式),一個 copy assignment operator(拷貝賦值運算子)和一個
Time of Update: 2018-12-03
(點擊此處,接上篇)這一行為背後的根本原因是為了防止“當你在一個 library 或者 application framework 中建立一個新的 derived class 時,偶然地發生從遙遠的 base classes 繼承 overloads 的情況”。不幸的是,一般情況下你是需要繼承這些 overloads 的。實際上,如果你使用了 public inheritance 而又沒有繼承這些 overloads,你就違反了 Item 32 講解的“base 和 derived
Time of Update: 2018-12-03
Item 34: 區分 inheritance of interface(介面繼承)和 inheritance of implementation(實現繼承)作者:Scott Meyers譯者:fatalerror99 (iTePub's Nirvana)發布:http://blog.csdn.net/fatalerror99/(public) inheritance 這個表面上簡單易懂的觀念,一旦被近距離審視,就會被證明是由兩個相互獨立的部分組成的:inheritance of
Time of Update: 2018-12-03
Chapter 4. Designs(設計)和 Declarations(聲明)作者:Scott Meyers譯者:fatalerror99 (iTePub's Nirvana)發布:http://blog.csdn.net/fatalerror99/軟體設計——使軟體能做你想讓它做的事情的途徑——典型情況下,從一個相當概括的想法開始,但是最終它們會變得詳細,詳細到足以進行具體的 interfaces(介面)的開發。這些 interfaces(介面)很可能在隨後被轉化為 C++