###Head File
* #define ä¿æ¤ `___H_`
```
#ifndef BASEITEM_H
#define BASEITEM_H
// code
#endif // BASEITEM_H
```
* 使ç¨å置声æï¼forward declarationsï¼å°½éåå°.h æä»¶ä¸#include çæ°é
å¨å¤´æä»¶å¦ä½åå°ä½¿ç¨ç±»Fooèæ é访é®ç±»çå®ä¹ï¼(åªæè¿ç§æ
嵿è½ä½¿ç¨å£°æçæ¹æ³ï¼èä¸ç¨å¼å
¥å¤´æä»¶)
1) å°æ°æ®æåç±»å声æä¸º Foo * æ Foo &ï¼
2) åæ°ãè¿åå¼ç±»å为 Foo ç彿°å§æ¯å£°æ(ä½ä¸å®ä¹å®ç°)
3) éææ°æ®æåçç±»åå¯ä»¥è¢«å£°æä¸ºFooï¼å ä¸ºéææ°æ®æåçå®ä¹å¨ç±»å®ä¹ä¹å¤ã
å¦ä¸æ¹é¢ï¼å¦æä½ çç±»æ¯ Foo çåç±»ï¼æè
å¨æç±»å为 Foo çééææ°æ®æåï¼åå¿
须为ä¹å
å¨å¤´æä»¶ã
ææ¶ä½¿ç¨æéæåæ¿ä»£å¯¹è±¡æåçç¡®æ´ææä¹ï¼å¦æåªæ¯ä¸ºäºåå°å
å«å¤´æä»¶ï¼è¿æ¯ä¸è¦è¿æ ·æ¿ä»£ï¼å ä¸ºä½¿ç¨æéçæ¹å¼ä¼éä½ä»£ç çå¯è¯»æ§åæ§è¡æçã
* ä¸è¦å
èè¶
è¿10è¡ç彿°ï¼å¯¹äºææå½æ°éè¦æ
éï¼å 为ä¸äºé弿åååºç±»çææå½æ°ä¼è¢«è°ç¨ï¼å
¶å®å¾é¿
* 夿å
è彿°çå®ä¹åºæ¾å¨åç¼å为-inl.hç头æä»¶ä¸
* 彿°åæ°é¡ºåºï¼è¾å
¥åæ°å¨åï¼è¾åºåæ°å¨åï¼å³ä½¿æ¯è¿½å æ°çåæ°ä¹è¦ä¿æè¿ä¸ªåå
* 头æä»¶é¡ºåºï¼
1. cppæä»¶å¯¹åºç头æä»¶
2. Cç³»ç»æä»¶
3. C++ç³»ç»æä»¶
4. å
¶ä»åºå¤´æä»¶
5. æ¬é¡¹ç®å
头æä»¶
###Scope
* å¨.ccæä»¶ä¸ï¼å
许çè³æå¡ä½¿ç¨ä¸å
·åçå½å空é´ï¼é¿å
è¿è¡æ¶çå½åå²çªï¼ä¸è½å¨.hæä»¶ä¸ä½¿ç¨ä¸å
·åçå½å空é´
```
namespace {
// namespaceä¸çå
容ä¸ç¼©è¿
enum ALGIN { RIGHT, LEFT, MIDLE};
ALGIN algin() { return RIGHT;};
} // namespace
```
* å½å空é´å°é¤æä»¶å
å«/å
¨å±æ è¯ç声æ/å®ä¹ä»¥åç±»çå置声æå¤çæ´ä¸ªæºæä»¶å°è£
èµ·æ¥ï¼ä»¥åå
¶ä»å½å空é´ç¸åºå
* æå¥½ä¸è¦ä½¿ç¨usingæç¤ºç¬¦ï¼ä»¥ä¿è¯å½å空é´ä¸çææåç§°é½å¯ä»¥æ£å¸¸ä½¿ç¨
* å¨.ccæä»¶ã.hæä»¶ç彿°ãæ¹æ³æç±»ä¸ï¼å¯ä»¥ä½¿ç¨usingï¼è¿æ¡åååæ ·éç¨äºå½å空é´å«åä¾å¦`namespace fbz=::foo::bar::baz`
* åµå¥ç±»æ¯å®ä¹å¨å¦ä¸ä¸ªç±»ä¸çç±»ï¼ä¸è¦å°åµå¥ç±»å®ä¹ä¸ºpublicï¼é¤é宿¯æ¥å£çä¸é¨åï¼æ¯å¦æä¸ªæ¹æ³ä½¿ç¨äºè¿ä¸ªåµå¥ç±»çä¸ç³»åé项
```
class Container
{
// åµå¥ç±»å£°æ
private:
class Transformer
{
public:
Transformer();
~Transformer();
void transform(BaseItem* item);
};
public:
Container();
~Container();
void addItem(BaseItem* item);
void doTransform();
private:
std::vector m_vItems;
Transformer m_transformer;
};
```
* 使ç¨å½å空é´ä¸çéæå彿°æéææå彿°ï¼å°½éä¸è¦ä½¿ç¨å
¨å±å½æ°ï¼å¦å容æåºç°å½æ°åç§°ç¸åï¼éå®ä¹çæ
åµ
* å°éæå彿°åéæç±»æå彿°ä½ä¸ºæ°ç±»çæåæè®¸æ´ææä¹ï¼å½å®ä»¬éè¦è®¿é®å¤é¨èµæºæå
·æéè¦ä¾èµæ¶æ´æ¯å¦æ¤ãç¸æ¯å纯为äºå°è£
è¥å¹²ä¸ªä¸å
±äº«ä»»ä½éææ°æ®çéææå彿°èå建类ï¼ä¸å¦ä½¿ç¨å½å空é´ã
* 妿å®ä¹çéæå彿°åªæ¯å¨.ccæä»¶ä¸ä½¿ç¨ï¼å¯ä»¥ä½¿ç¨ä¸å
·åå½åç©ºé´æstatic(static int Foo())éå®å
¶ä½ç¨å
* 对äºå±é¨åéï¼å¨å°½å¯è½å°çä½ç¨åä¸å£°æåéï¼ç¦»ç¬¬ä¸æ¬¡ä½¿ç¨è¶è¿è¶å¥½ï¼æäºé
读ã使ç¨åå§åçæ¹å¼ä»£æ¿å
声æåèµå¼çæ¹å¼ã
* 妿å鿝ä¸ä¸ªå¯¹è±¡ï¼éè¦èèæ¯æ¬¡è¿å
¥åéåºä½ç¨åæ¶ï¼è°ç¨å
¶æé åææç代价ã
* classç±»å(å
æ¬stlä¸çvectorï¼string)çå
¨å±åéæ¯ç¦æ¢çï¼å
¨å±åéçæé 彿°ãææå½æ°ã以ååå§åæä½çè°ç¨é¡ºåºåªæ¯è¢«é¨åè§å®ï¼æ¯æ¬¡çæé½ä¼æååï¼ä»è导è´é¾ä»¥åç°çbugï¼ï¼åªå
许å
建类ååç±å
å»ºç±»åææçæ²¡ææé 彿°çç»æä½å®ä¹çå
¨å±åéï¼å¤çº¿ç¨ä¸é常æ°çå
¨å±åé乿¯è¢«ç¦æ¢çãæ°¸è¿ä¸è¦ä½¿ç¨å½æ°çè¿åå¼åå§åå
¨å±åéã
* 妿ä¸å®è¦ç¨å
¨å±ç类对象ï¼å¯ä»¥ä½¿ç¨singleton pattern
* 使ç¨C飿 ¼çå符串å
¨å±åéï¼ä¸è¦ä½¿ç¨stlä¸çstringå
¨å±å符串`const char key[] = "MOMS_CAT";`
* 大夿°çå
¨å±åéåºè¯¥æ¯ç±»çéææ°æ®æåï¼æè
å½å
¶å¨ccæä»¶èå´å
ä½¿ç¨æ¶ï¼å°å
¶å®ä¹å°ä¸å
·åå½å空é´ä¸æä½¿ç¨éæstaticæ¥éå¶å®çä½ç¨å
* éææååé©ä¸¤è§ä½å
¨å±åéï¼æä»¥ä¹ä¸è½æ¯classç±»å
###class
* æé 彿°ä¸åªå¤ç没ææä¹çåå§åï¼å®é
çåå§åå·¥ä½åç¬æ¾å°Init()彿°ä¸ãæé 彿°ä¸ä¸è½è¿è¡å¤ªå¤å·¥ä½çåå ï¼
1. 䏿æ¥åé误ï¼ä¸è½ä½¿ç¨å¼å¸¸
2. æä½å¤±è´¥å¯¼è´å¯¹è±¡åå§åæé 失败ï¼å¤äºä¸ç¡®å®ç¶æ
3. æé 彿°ä¸è°ç¨è彿°ï¼è°ç¨ä¸ä¼æ´¾åå°åç±»å®ç°ä¸
4. 妿ç±å°æ¹å®ä¹äºå
¨å±ç类对象ï¼ç±äºå¨mainä¹åæ§è¡æé 彿°ï¼ä¼å¯¼è´ä¸ä¸åå§åæ¡ä»¶ä¸æ£ç¡®
* 妿ä¸ä¸ªç±»ä¸å®ä¹äºæååéï¼ä¸å®è¦å®ä¹ä¸ä¸ªé»è®¤æé 彿°ï¼å¦åç³»ç»èªå¨çæçé»è®¤æé 彿°ä¸ä¼åå§åæååé
* å¨ä½åæ°çæé 彿°åå¢å explicit修饰ï¼é¿å
é æä¸å¿
è¦çéå¼ç±»å转æ¢ï¼æ·è´æé 彿°ä¸éè¦å£°æä¸ºæ¾ç¤º
* ä»
å¨ä»£ç ä¸éè¦æ·è´ä¸ä¸ªç±»å¯¹è±¡æ¶ä½¿ç¨æ·è´æé 彿°(对象è¿è¡å¼ä¼ éï¼ä»¥åstl容å¨è¦æ±ææå
容å¯ä»¥æ·è´åèµå¼)ï¼ä¸éè¦æ¶ä½¿ç¨DISALLOW_COPY_AND_ASSIGNï¼å¤§é¨åçç±»ä¸éè¦æ·è´åèµå¼æä½ï¼å¼ç¨ä¼ éæçè¦é«å¾å¤ãå½ä½¿ç¨stl容卿¶ï¼å¯ä»¥èè使ç¨std::tr1::shared_ptrï¼ä½¿ç¨æéæåstl容å¨ä¸ç对象
```
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)
// å¨ç±»ç声æä¸ï¼privateå£°ææ·è´æé åèµå¼
private:
DISALLOW_COPY_AND_ASSIGN(Container);
```
* 使ç¨ç»åé常æ¯ç»§æ¿æ´åéï¼å¦æè¦ä½¿ç¨ç»§æ¿çè¯ï¼åªä½¿ç¨publicç»§æ¿
* 尽管ç¶ç±»ä¸å·²ç»å£°æäºå¤æå½æ°ä¸ºvirtualï¼å¨åç±»è¯¥å½æ°ç声æä¸è¿æ¯è¦å ä¸virtualï¼ä¾¿äºé
读
* åªæå½ææåºç±»é¤ç¬¬ä¸ä¸ªå¤é½æ¯çº¯æ¥å£æ¶æè½ä½¿ç¨å¤éç»§æ¿ã为确ä¿å®ä»¬æ¯çº¯æ¥å£ï¼è¿äºç±»å¿
须以Interface为åç¼
* ä¸è¬ä¸è¦éè½½æä½ç¬¦ï¼å°¤å
¶æ¯èµå¼æä½ã妿éè¦çè¯å¯ä»¥å®ä¹Equals()/CopyFromç彿°ãä¸è¦ä»
ä»
å 为stl容卿ä½å°±éè½½==æoperator<ï¼åè代ä¹ï¼åºè¯¥å¨å£°æå®¹å¨çæ¶åå建ç¸ç夿å大尿¯è¾çä»¿å½æ°ç±»åãæäºstlç®æ³ç¡®å®éè¦éè½½==æ¶ï¼å¯ä»¥è¿ä¹åï¼ä½éè¦æä¾ææ¡£è¯´æåå
* æååéä¸å®è¦ç§æåï¼å¹¶æä¾å¯¹åºçgetåset
* publicå¨privateä¹åï¼æå彿°å¨æååéä¹å
* 彿°å¦æè¶
è¿40è¡ï¼å¯ä»¥èèå¨ä¸å½±åç¨åºç»æçæ
åµä¸å°å
¶åå²ä¸ä¸
* 任使
åµä¸é½ä¸è¦ä½¿ç¨auto_ptr,妿è¦ä½¿ç¨æºè½æéçè¯ï¼ä½¿ç¨scoped_ptrï¼å¯¹äºstl容å¨ä¸ç对象ï¼åºåªä½¿ç¨std::tr1::shared_ptrãGoogle建议尽éé¿å
ä½¿ç¨æºè½æéï¼ä½¿ç¨å¯¹è±¡
###other cpp
* è¾å
¥åæ°ä¸ºå¼æconstå¼ç¨ï¼è¾åºåæ°ä¸ºæéï¼è¾å
¥åæ°å¯ä»¥æ¯constæéï¼ä½ä¸è½ä½¿ç¨éconstå¼ç¨å½¢å
* éå¶ä½¿ç¨éè½½å½æ°ï¼ç¸ååå产çå°æï¼åç±»å¯è½åªå®ç°äºä¸ä¸ªï¼ï¼å¦æéè¦éè½½å½æ°ï¼å¯ä»¥ä½¿ç¨ä¸åç彿°åç§°ï¼å¹¶å¨åç§°ä¸ä½ç°ä¸å彿°çç¹ç¹
* è°ç¨å½æ°æ¶å¿
é¡»æç¡®æææ¯ä¸ä¸ªåæ°ï¼é¿å
卿·è´ä»£ç æ¶å¿½ç¥ä¸ä¸ºäººç¥ç缺çåæ°å¼
* ç¦æ¢ä½¿ç¨åé¿æ°ç»åalloca()ï¼ä½¿ç¨å®å
¨çåé
å¨allocatorï¼å¦scoped_ptr/scoped_array
* é常å°åå
å®ä¹å¨åä¸ä¸ªæä»¶ä¸
* ä¸è¦ä½¿ç¨c++å¼å¸¸
* æè·å¼å¸¸å¯è½å¯¼è´å½æ°æåç»æï¼ä½¿å¾å¨catchä¹åçå
åæ²¡æéæ¾ï¼å½±åç¨åºæ§å¶æµ
* 使ç¨throwæ¶ï¼éè¦æ£æ¥ææè°ç¨çå°æ¹æ¯å¦æåºæ¬çå¼å¸¸å®å
¨ä¿æ¤æè
ç¨åºæ£å¸¸ç»æ
* é¤äºå¨åå
æµè¯ä¸ï¼ä¸è¦ä½¿ç¨RTTI(runtime type info)ï¼å¦æç¨åºä¸éè¦å¨è¿è¡æ¶æ£æµå¯¹è±¡ç±»åï¼è¯´æè®¾è®¡æé®é¢æè
æ¢ç§æ¹å¼è¯å«å¯¹è±¡ç±»åï¼èè使ç¨åéååæ¹æ¡ï¼å¦Visitor模å¼
* static_cast: 强å¶è½¬æ¢ï¼æéçç¶ç±»å°åç±»çæç¡®åä¸è½¬æ¢
* const_cast: ç§»é¤const屿§
* reinterpret_cast:æéç±»ååæ´åæå
¶ä»æéé´ä¸å®å
¨çç¸äºè½¬æ¢ï¼ä»
å¨ä½ 对æåä¸åäºç¶äºå¿æ¶ä½¿ç¨
* dynamic_cast:餿µè¯å¤ä¸è¦ä½¿ç¨
* ä¸è¦ä½¿ç¨æµï¼é¤éæ¶æ¥å¿æ¥å£éè¦ï¼ä½¿ç¨printfä¹ç±»ç代æ¿
* 对äºè¿ä»£å¨å模æ¿ç±»åæ¥è¯´ï¼è¦ä½¿ç¨åç½®++/--ãå 为åç½®çæ¹å¼è¦å¯¹è¡¨è¾¾å¼iè¿è¡ä¸æ¬¡æ·è´
* å°½å¯è½çå¤ç使ç¨const
* å°½å¯è½ä½¿ç¨sizeof(varname)ï¼è䏿¯sizeof(type)
* ä¸å®ä¹äºint16_t/uint32_t/int64_tçæ´åï¼å¨éè¦ç¡®å®å¤§å°çæ´åæ¶å¯ä»¥ä½¿ç¨å®ä»¬ä»£æ¿short/unsigned long longãå¨Cä¸åªä½¿ç¨intãé彿
åµä¸ä½¿ç¨size_t or ptrdiff_t
* 对äºå¤§æ´æ°ä½¿ç¨int64_t;ä¸è¦ä½¿ç¨uint32_tçæ ç¬¦å·æ´åï¼é¤éä½ æ¯ç¨æ¥æ è¯bit patternè䏿¯ä¸ä¸ªæ°å¼ãå³ä½¿æ°å¼ä¸ä¼ä¸ºè´å¼ä¹ä¸è¦ä½¿ç¨æ 符å·ç±»åï¼ä½¿ç¨æè¨æ¥ä¿æ¤æ°æ®ãæ¯è¾æç¬¦å·åéåæ ç¬¦å·åéæ¶ï¼Cçç±»åæåæºå¶ä¼å¯¼è´æ 符å·ç±»åçè¡ä¸ºåºä¹ææã
* sizeof(void*)!=sizeof(int)ï¼å¦æéè¦ä¸ä¸ªæé大å°çæ´æ°è¦ä½¿ç¨intptr_t
* 64bitç³»ç»ä¸ä»»ä½æ¥æint64_t/uint64_tæåçç±»åç»æä½å°é»è®¤å¤ç为8åè对é½ãgcc使ç¨__attribute__((packed))ï¼msvc使ç¨#pragma pack()å__declspec(align())æ§å¶åè对é½
* å建64ä½å¸¸éæ¶ä½¿ç¨LLæULLä½ä¸ºåç¼ä¾å¦`int64_t value = 0x123456789LL;`,`uint64_t value = 3ULL <<48;`
* ä¸è¦å¨.hä¸å®ä¹å®ï¼ä½¿ç¨åæ£ç¡®#defineï¼ä½¿ç¨åæ£ç¡®#undef;ä¸è¦åªæ¯å¯¹å·²ç»åå¨çå®ä½¿ç¨#undefï¼éæ©ä¸ä¸ªä¸ä¼å²çªçåç§°ï¼
* æ´æ°ä½¿ç¨0,宿°ä½¿ç¨0.0,å符串使ç¨'\0',æé使ç¨NULL