1.減少依賴
handle類,即通過包含來實現功能
class cperson
private:
cpersonimpl* pimpl;
};介面類,即通過繼承來實現功能
class iperson
;class cperson : public iperson
static std::tr1::shared_ptrcreate(...){} //這種類一般會有乙個工廠類
}為減少依賴,為標頭檔案和宣告分別提供標頭檔案,看清楚了,都寫在標頭檔案裡面
typedef 不支援提前宣告
2.用巨集時,可能會產生意想不到的錯誤,
對於 function-like macros(類似函式的巨集),用 inline functions(內聯函式)取代 #defines
3.不用初始化列表時,成員變數:先呼叫default constructor, 後呼叫copy assignment constructor
用初始化列表就只有乙個copy constructor
4.析構函式應該永遠都不丟擲異常,如果要對這個異常做出回應,最好另外提供乙個介面來釋放資源
5.不是設計用來作為 base classes(基類)或不是設計用於 polymorphically(多型)的 classes(類)就不應該宣告 virtual destructor
(虛擬析構函式)。
6. assignment operators(賦值運算子)返回乙個 reference to *this(引向 *this 的引用)。
7.拷貝函式應該保證拷貝乙個物件的所有資料成員以及所有的基類部分
8.避免返回堆疊上的指標,如
const rational& operator*(const rational& lhs, // warning! more bad
const rational& rhs) // code!
rational w, x, y, z;
w = x * y * z;
此時,將會發生資源洩漏
const rational& operator*(const rational& lhs, // warning! yet more
const rational& rhs) // bad code!
rational a, b, c, d;
if ((a * b) == (c * d)) //此時條件永遠為真
{}所以,不要輕易返回static物件的引用
8. 函式宣告型別不同的含義:
1.****** virtual function : 繼承乙個介面同時可以作為預設實現
如果不想讓繼承類有乙個不知道怎麼來的預設實現,用 「2」中的方法,同時另外實現乙個non-virtual函式作為預設實現
2.pure virtual function : 純繼承介面
3.non-virutal function : 繼承乙個強制實現
9 inline
記住,inline 是向編譯器發出的乙個請求,而不是乙個命令。這個請求能夠以顯式的或隱式的方式提出。
①隱式的方法就是在乙個類定義的內部定義乙個函式:
class person // an implicit inline request: age is
... // defined in a class definition
private:
int theage;};②
顯式地宣告乙個
inline
函式的方法是在它的宣告之前加上
inline
關鍵字inline
函式一般必須在標頭檔案內,因為大多數構建環境在編譯期間進行
inline
化。為了用被呼叫函式的函式本體替換乙個函式呼叫,編譯器必須知道函式看起來像什麼樣子
(模板一般在標頭檔案內,因為編譯器需要知道乙個模板看起來像什麼以便用到它時對它進行例項化。(同樣,也不是全部如此。一些構建環境可以在連線期間進行模板例項化。然而,編譯期例項化更為普遍)
10.
11.private繼承不允許從繼承類到基類的轉換
private inheritance(私有繼承)意味著 is-implemented-in-terms-of(是根據……實現的)的事實有一點混亂,因為 item 38
指出 composition(復合)也有同樣的含義。你怎麼預先在它們之間做出選擇呢?答案很簡單:只要你能就用 composition(復合),只有在絕對必要的時候才用 private inheritance(私有繼承)。什麼時候是絕對必要呢?主要是當 protected members(保護成員)和/或 virtual functions(虛函式)摻和進來的時候
12.用傳引用給 const 取代傳值。典型情況下它更高效而且可以避免切斷問題。
· 這條規則並不適用於內建型別及 stl 中的迭代器和函式物件型別。對於它們,傳值通常更合適。
13.
·operator>>和operator《決不能是成員函式。如果f是operator>>或operator<<,讓f成為非成員函式。如果f還需要訪問c的非公有成員,讓f成為c的友元函式。
·只有非成員函式對最左邊的引數進行型別轉換。如果f需要對最左邊的引數進行型別轉換,讓f成為非成員函式。如果f還需要訪問c的非公有成員,讓f成為c的友元函式。
1.在宣告乙個函式時,如果用到某個類,是絕對不需要這個類的定義的,即使函式是通過傳值來傳遞和返回這個類:
方式①/********test.h******/
date returnadate()
/********datedef.h******/
class date
};/********main.cpp******/
#include "datedef.h" //注意順序,否則不能編譯
#include "test.h"
int _tmain(int argc, _tchar* argv)
這樣,只改變date的定義時,tset.h不會被編譯。
方式②/*******test.h******/
class date;
date returnadate();
/********datedef.h 跟上面一樣******/
/********main.cpp******/
#include "test.h"
#include "datedef.h" //這的順序跟上面不一樣
date returnadate()
int _tmain(int argc, _tchar* argv)
2.只能定義成巨集使用,不能直接在函式裡面使用
#define t(x) #x
#define t_link(x, y) x##y
#define t_dot(x) #@x
class ca
{};void function()
{}int _tmain(int argc, _tchar* argv)
3.取隨機數
int random = rand() % 100;
4.通過extern使用全域性變數時,這個變數必須是在cpp裡面定義的
5.指標陣列(這個不同於2維陣列,二維陣列的列是固定的)
int a1[2] = ;
int a2[3] = ;
int a3[4] = ;
int* parray[3] = ;
int** pparray = parray;
std::cout << (parray)[1][1] << std::endl;
函式陣列:
int (*pfn[3])(int, int);
int add(int one, int two)
int sub(int one, int two)
int div(int one, int two)
int _tmain(int argc, _tchar* argv)
}6.含有虛函式的類物件不能用memset初始化
用例分析技術小記 1
用例被用來描繪乙個系統外在可見的需求情況,常被用在專案的需求分析階段,對專案的測試計畫和使用者指南也有用處。他們被用來建立和驗證被提議的設計,並確保該設計滿足所有的需求。用例也被用來在建立專案計畫時決定在每乙個版本中應該加入什麼內容。在專案中常有的乙個問題就是,已經進入了開發階段了確還要對某些東西進...
C 反射技術小結
要用c 反射技術的話,首先得引入system.reflection 命名空間,這個命名空間裡的類,具有動態引導程式集 型別,動態呼叫方法 設定和取得屬性和字段的值 可以獲取型別和方法的資訊的功能。要想對乙個型別例項的屬性或字段進行動態賦值或取值,首先得得到這個例項或型別的type,微軟已經為我們提供...
練習4 c 基礎
using system using system.collections.generic using system.linq using system.text namespace列舉 列舉可用來儲存字串與數字的值對,相當於乙個對照表 常用方法 getname getvalue parse 宣告乙...