C++ åèæå
- C++11
- C++14
- C++17
- C++20
- C++ ç¼è¯å¨æ¯ææ åµè¡¨
- ç¬ç«ä¸å®¿ä¸»å®ç°
- C++ è¯è¨
- å鿍¡æ¿(C++14 èµ·)
- æ´æ°åé¢é
- èååå§å
- æ¯è¾è¿ç®ç¬¦
- é»è®¤æ¯è¾(C++20 èµ·)
- 转ä¹åºå
- for 循ç¯
- while 循ç¯
- ç¨æ·å®ä¹è½¬æ¢
- SFINAE
- 䏻彿°
- ASCII ç 表
- æ è¯ç¬¦
- ç±»å
- å 忍¡å
- 对象
- åºæ¬æ¦å¿µ
- 表达å¼
- 声æ
- åå§å
- 彿°
- è¯å¥
- ç±»
- è¿ç®ç¬¦éè½½
- 模æ¿
- å¼å¸¸
- äºå¡æ§å å
- å ä½ç¬¦ç±»å说æç¬¦ (C++11 èµ·)
- decltype 说æç¬¦
- 彿°å£°æ
- final 说æç¬¦ (C++11 èµ·)
- override 说æç¬¦(C++11 èµ·)
- å¼ç¨å£°æ
- ç§»å¨æé 彿°
- ç§»å¨èµå¼è¿ç®ç¬¦
- æä¸¾å£°æ
- constexpr 说æç¬¦(C++11 èµ·)
- å表åå§å (C++11 èµ·)
- æé 彿°ä¸æååå§åå¨å表
- using 声æ
- nullptrï¼æéåé¢é
- åºç¡ç±»å
- ç±»åå«åï¼å«å模ç (C++11 èµ·)
- å½¢åå
- èåä½å£°æ
- å符串åé¢é
- ç¨æ·å®ä¹åé¢é (C++11 èµ·)
- 屿§è¯´æç¬¦åºå(C++11 èµ·)
- Lambda è¡¨è¾¾å¼ (C++11 èµ·)
- noexcept 说æç¬¦ (C++11 èµ·)
- noexcept è¿ç®ç¬¦ (C++11 èµ·)
- alignof è¿ç®ç¬¦(C++11 èµ·)
- alignas 说æç¬¦ (C++11 èµ·)
- åå¨ç±»è¯´æç¬¦
- åºäºèå´ç for å¾ªç¯ (C++11 èµ·)
- static_assert 声æ
- éå¼è½¬æ¢
- 代ç¨è¿ç®ç¬¦è¡¨ç¤º
- èªå¢/èªåè¿ç®ç¬¦
- æå 表达å¼(C++17 èµ·)
- 类模æ¿å®åæ¨å¯¼(C++17 èµ·)
- 模æ¿å½¢å䏿¨¡æ¿å®å
- if è¯å¥
- inline 说æç¬¦
- ç»æåç»å®å£°æ (C++17 èµ·)
- switch è¯å¥
- å符åé¢é
- å½å空é´
- æ±å¼é¡ºåº
- å¤å¶æ¶é¤
- consteval 说æç¬¦ (C++20 èµ·)
- constinit 说æç¬¦ (C++20 èµ·)
- åç¨ (C++20)
- 模å (C++20 èµ·)
- 约æä¸æ¦å¿µ (C++20 èµ·)
- new 表达å¼
- do-while 循ç¯
- continue è¯å¥
- break è¯å¥
- goto è¯å¥
- return è¯å¥
- 卿å¼å¸¸è¯´æ
- throw 表达å¼
- try å
- å½å空é´å«å
- 类声æ
- cvï¼const ä¸ volatileï¼ç±»åéå®ç¬¦
- é»è®¤åå§å
- å¼åå§å(C++03 èµ·)
- é¶åå§å
- å¤å¶åå§å
- ç´æ¥åå§å
- 常éåå§å
- å¼ç¨åå§å
- å¼ç±»å«
- C++ è¿ç®ç¬¦ä¼å 级
- å¸å°åé¢é
- æµ®ç¹åé¢é
- typedef 说æç¬¦
- æ¾å¼ç±»å转æ¢
- static_cast 转æ¢
- dynamic_cast 转æ¢
- const_cast 转æ¢
- reinterpret_cast 转æ¢
- delete 表达å¼
- æé 彿°ä¸æååå§åå¨å表
- this æé
- 访é®è¯´æç¬¦
- åå 声æ
- virtual 彿°è¯´æç¬¦
- explicit 说æç¬¦
- éææå
- é»è®¤æé 彿°
- å¤å¶æé 彿°
- å¤å¶èµå¼è¿ç®ç¬¦
- ææå½æ°
- 类模æ¿
- 彿°æ¨¡æ¿
- æ¾å¼ï¼å ¨ï¼æ¨¡æ¿ç¹å
- æ±ç¼å£°æ
- C++ çåå²
- ä½ç¨å
- çåæ
- å®ä¹ä¸åä¸å®ä¹è§åï¼ODRï¼
- å忥æ¾
- æéå®çå忥æ¾
- æ éå®çå忥æ¾
- å¦åè§å
- æªå®ä¹è¡ä¸º
- ç¿»è¯é¶æ®µ
- 常é表达å¼
- èµå¼è¿ç®ç¬¦
- ç®æ¯è¿ç®ç¬¦
- é»è¾è¿ç®ç¬¦
- æå访é®è¿ç®ç¬¦
- å ¶ä»è¿ç®ç¬¦
- sizeof è¿ç®ç¬¦
- typeid è¿ç®ç¬¦
- æé声æ
- æ°ç»å£°æ
- è¯è¨é¾æ¥
- 详述类å说æç¬¦
- é»è®¤å®å
- åé¿å®å
- å®åä¾èµæ¥æ¾
- éè½½å³è®®
- éè½½å½æ°çå°å
- æ³¨å ¥ç±»å
- ééææ°æ®æå
- ééææå彿°
- åµå¥ç±»
- æ´¾çç±»
- 空åºç±»ä¼å
- æ½è±¡ç±»
- ä½å
- è½¬æ¢æé 彿°
- æå模æ¿
- 模æ¿å®åæ¨å¯¼
- é¨å模æ¿ç¹å
- sizeof... è¿ç®ç¬¦
- å¾ å³å
- 彿° try å
- æ©å å½åç©ºé´ std
- åæ¯ç¼©å
- RAII
- ä¸/äº/é¶ä¹æ³å
- PImpl
- é¶å¼éåå
- ç±»å
- éå¼è½¬æ¢
- 注é
- C++ å ³é®è¯
- é¢å¤çå¨
- C++ æ ååºå¤´æä»¶
- å ·åè¦æ±
- åè½ç¹æ§æµè¯ (C++20)
- å·¥å ·åº
- ç±»åæ¯æï¼åºæ¬ç±»åãRTTIãç±»åç¹æ§ï¼
- æ¦å¿µåº (C++20)
- é误å¤ç
- 卿å å管ç
- æ¥æåæ¶é´å·¥å ·
- å符串åº
- 容å¨åº
- è¿ä»£å¨åº
- èå´åº (C++20)
- ç®æ³åº
- æ°å¼åº
- è¾å ¥/è¾åºåº
- æä»¶ç³»ç»åº
- æ¬å°ååº
- æ£å表达å¼åº
- ååæä½åº
- çº¿ç¨æ¯æåº
- å®éªæ§ C++ ç¹æ§
- æç¨çèµæº
- ç´¢å¼
- std 符å·ç´¢å¼
- åç¨æ¯æ (C++20)
- C++ å ³é®è¯
ä½ç½®ï¼é¦é¡µ > C++ åèæå >C++ è¯è¨ > æé声æ
æé声æ
声ææéææåæåæéç±»åçåéã
è¯æ³
æéçå£°ææ¯ç®å声æï¼å ¶å£°æç¬¦æ¥æä¸åå½¢å¼
* attr(å¯é) cv(å¯é) 声æç¬¦
|
(1) | ||||||||
åµå¥å说æç¬¦ * attr(å¯é) cv(å¯é) 声æç¬¦
|
(2) | ||||||||
D 声æä¸ºæå åµå¥å说æç¬¦ S æç¡®å®ç±»åçæéãD 声æä¸ºæå C ç åµå¥å说æç¬¦ S æç¡®å®ç±»åçééææ°æ®æåçæéã| 声æç¬¦ | - | é¤å¼ç¨å£°æç¬¦ä¹å¤çä»»æå£°æç¬¦ï¼æ æåå¼ç¨çæéï¼ãå®å¯ä»¥æ¯å¦ä¸æé声æç¬¦ï¼å 许æåæéçæéï¼ |
| attr(C++11) | - | 屿§çå¯éå表 |
| cv | - | åºç¨å°è¢«å£°ææéç const/volatile éå®ï¼èå¹¶é被æåç±»åï¼å ¶é宿¯ 声æè¯´æç¬¦åºå çä¸é¨åï¼ |
| åµå¥å说æç¬¦ | - | åååä½ç¨åè§£æè¿ç®ç¬¦ :: çåºå
|
æ æåå¼ç¨çæéï¼æ æåä½åçæéã 彿²¡æè¯¦è¿°å°æåâæéâæ¶ï¼é常ä¸å 嫿åï¼ééæï¼æåçæéã
æé
æéç±»åç弿¯ä¸åä¹ä¸ï¼
- æå对象æå½æ°çæéï¼è¯¥æ åµä¸è¯´è¯¥æéæå彿°æå¯¹è±¡ï¼ï¼æ
- 对象æ«å°¾åæéï¼æ
- 该类åç空æéå¼ï¼æ
- æ ææéå¼ã
æå对象çæéè¡¨ç¤ºå ¶å°åï¼ä¸ºå åä¸å¯¹è±¡æå ç¨çé¦åèçå°åãå¯¹è±¡çæ«å°¾åæé亦表示å°åï¼ä¸ºå åä¸å¯¹è±¡æå ç¨çåå¨ä¹åçé¦ä¸ªåèçå°åã
注æï¼ä¸¤ä¸ªè¡¨ç¤ºåä¸å°åçæéå¯è½æ¥æä¸åçå¼ã
struct C { int x, y; } c;  int* px = &c.x; // px çå¼ä¸ºâæå c.x çæéâ int* pxe= px + 1; // pxe çå¼ä¸ºâ c.x çå°¾åæéâ int* py = &c.y; // py çå¼ä¸ºâæå c.y çæéâ  assert(pxe == py); // == æµè¯ä¸¤ä¸ªæéæ¯å¦è¡¨ç¤ºç¸åå°å // å¯è½æå¯è½ä¸å¼åæè¨  *pxe = 1; // å³ä½¿æªå¼åæè¨ï¼äº¦ä¸ºæªå®ä¹è¡ä¸º
éè¿æ ææéå¼é´æ¥å¯»åï¼åå°æ ææéå¼ä¼ éç»è§£åé
彿°åæ¥ææªå®ä¹è¡ä¸ºãæ ææéå¼çä»»ä½å
¶ä»ç¨æ³æ¥æç±å®ç°å®ä¹çè¡ä¸ºã
对象æé
对象æéï¼è½ä»¥åºç¨äºä»»ä½å¯¹è±¡ç±»åï¼å å«å¦ä¸æéç±»åï¼ç表达å¼çååè¿ç®ç¬¦çè¿åå¼åå§åï¼
int n; int* np = &n; // int çæé int* const* npp = &np; // é const int ç const æéçé const æé  int a[2]; int (*ap)[2] = &a; // int çæ°ç»çæé  struct S { int n; }; S s = {1}; int* sp = &s.n; // æåä½ä¸º s çæåç int çæé
æéå¯ä½ä¸ºå
å»ºé´æ¥å¯»åè¿ç®ç¬¦ï¼ä¸å
operator*ï¼çæä½æ°ï¼è¿åæä»£è¢«æå对象çå·¦å¼è¡¨è¾¾å¼ï¼
int n; int* p = &n; // æå n çæé int& r = *p; // ç»å®å°æä»£ n çå·¦å¼è¡¨è¾¾å¼çå¼ç¨ r = 7; // åå¨ int 7 äº n std::cout << *p; // å·¦å¼å°å³å¼éå¼è½¬æ¢ä» n 读åå¼
æå类对象çæé亦å¯ä½ä¸ºæå访é®è¿ç®ç¬¦ operator-> å operator->* ç左侧æä½æ°ã
ç±äºæ°ç»å°æééå¼è½¬æ¢çåå ï¼å¯ä»¥ä»¥æ°ç»ç±»åç表达å¼åå§åæåæ°ç»é¦å ç´ çæéï¼
int a[2]; int* p1 = a; // æåæ°ç» a é¦å ç´ a[0]ï¼ä¸ä¸ª intï¼çæé  int b[6][3][8]; int (*p2)[3][8] = b; // æåæ°ç» b é¦å ç´ b[0] çæéï¼ // 被æè 为 int ç 8 å ç´ æ°ç»ç 3 å ç´ æ°ç»
ç±äºæéçæ´¾çç±»å°åºç±»éå¼è½¬æ¢çåå ï¼å¯ä»¥ä»¥æ´¾çç±»çå°ååå§åæååºç±»çæéï¼
struct Base {}; struct Derived : Base {}; Â Derived d; Base* p = &d;
è¥ Derived æ¯å¤æçï¼åè¿ç§æéå¯ç¨äºè¿è¡è彿°è°ç¨ã
æäºå æ³ãåæ³ãèªå¢åèªåè¿ç®ç¬¦å¯¹äºæåæ°ç»å ç´ çæéæå®ä¹ï¼è¿ç§æé满足éçéæºè®¿é®è¿ä»£å¨ (LegacyRandomAccessIterator) è¦æ±ï¼å¹¶å 许 C++ åºç®æ³å·¥ä½äºåå§æ°ç»ä¸ã
æäºæ åµä¸ï¼æ¯è¾è¿ç®ç¬¦å¯¹æéæå®ä¹ï¼ä¸¤ä¸ªè¡¨ç¤ºç¸åå°åçæéæ¯è¾ç¸çï¼ä¸¤ä¸ªç©ºæé弿¯è¾ç¸çï¼æåå䏿°ç»ä¸çå ç´ çæéçæ¯è¾ä¸åå ç´ çæ°ç»ä¸æ çæ¯è¾æ¹å¼ç¸åï¼èæåæ¥æç¸åæå访é®çééææ°æ®æåçæé以åæåç声æé¡ºåºè¿è¡æ¯è¾ã
夿°å®ç°äº¦ä¸ºéæºæ¥æºçæéæä¾ä¸¥æ ¼å ¨åºï¼ä¾å¦å°å®ä»¬å®ç°ä¸ºè¿ç»èæå°å空é´ä¸çå°åãæªè½åå°çå®ç°ï¼ä¾å¦ï¼å ¶ä¸å¹¶éæéçææä½é½æ¯å åå°åçä¸é¨åå è卿¯è¾æ¶å¿ 须忽ç¥ä¹ï¼æè è¦æ±é带ç计ç®ï¼æè æé䏿´æ°å¹¶éä¸å¯¹ä¸å ³ç³»ï¼ï¼ä¸ºæéæä¾äºå ·ææ¤é¡¹ä¿è¯ç std::less ç¹åãè¿ä½¿å¾å¯å¨å ³è容å¨ï¼å¦ std::set æ std::mapï¼ä¸ä½¿ç¨ææéæºæ¥æºçæéã
void çæé
æåä»»æç±»å对象çæéï¼å¯éå¼è½¬æ¢ææå void çæéï¼å¯éå°æ cv éå®ï¼ï¼ä¸æ¹åå ¶å¼ãéåç转æ¢è¦æ± static_cast ææ¾å¼è½¬åï¼çæå ¶åæéå¼ï¼
int n = 1; int* p1 = &n; void* pv = p1; int* p2 = static_cast<int*>(pv); std::cout << *p2 << '\n'; // æå° 1
è¥åæéæåæå¤æç±»å对象ä¸çåºç±»å对象ï¼åå¯ç¨ dynamic_cast è·å¾æåæç»æ´¾çç±»åç宿´å¯¹è±¡ç void*ã
void æéç¨äºä¼ éæªç¥ç±»å对象ï¼è¿å¨ C æ¥å£ä¸å¸¸è§ï¼std::malloc è¿å void*ï¼std::qsort æå¾ æ¥å两个 const void* åæ°çç¨æ·æä¾åè°ãpthread_create æå¾ æ¥åå¹¶è¿å void* çç¨æ·æä¾çåè°ãæææ åµä¸ï¼è°ç¨æ¹è´è´£å¨ä½¿ç¨åå°æé转åå°æ£ç¡®ç±»åã
彿°æé
彿°æéè½ä»¥éæå彿°æéææå彿°çå°ååå§åãç±äºå½æ°å°æééå¼è½¬æ¢çåå ï¼ååè¿ç®ç¬¦æ¯å¯éçï¼
void f(int); void (*p1)(int) = &f; void (*p2)(int) = f; // ä¸ &f ç¸å
ä¸åäºå½æ°æå½æ°çå¼ç¨ï¼å½æ°æéæ¯å¯¹è±¡ï¼ä»èè½åå¨äºæ°ç»ã被å¤å¶ã被èµå¼çã
彿°æéå¯ç¨ä½å½æ°è°ç¨è¿ç®ç¬¦ç左侧æä½æ°ï¼è¿ä¼è°ç¨è¢«æåç彿°ï¼
int f(int n) { std::cout << n << '\n'; return n * n; } Â int main() { int (*p)(int) = f; int x = p(7); }
è§£å¼ç¨å½æ°æéçææ è¯è¢«æå彿°çå·¦å¼ï¼
int f(); int (*p)() = f; // æé p æå f int (&r)() = *p; // å°æ è¯ f çå·¦å¼ç»å®å°å¼ç¨ r(); // éè¿å·¦å¼å¼ç¨è°ç¨å½æ° f (*p)(); // éè¿å½æ°å·¦å¼è°ç¨å½æ° f p(); // ç´æ¥éè¿æéè°ç¨å½æ° f
è¥åªæä¸ä¸ªéè½½å¹é æéç±»åçè¯ï¼å½æ°æéå¯ä»¥ä»å¯å å«å½æ°ã彿°æ¨¡æ¿ç¹åå彿°æ¨¡æ¿çä¸ä¸ªéè½½éè¿è¡åå§åï¼ç»èè§éè½½å½æ°çå°åï¼ï¼
template<typename T> T f(T n) { return n; } double f(double n) { return n; }  int main() { int (*p)(int) = f; // å®ä¾åå¹¶éæ© f<int> }
ç¸çæ¯è¾è¿ç®ç¬¦å¯¹äºå½æ°æéæå®ä¹ï¼è¥æååä¸å½æ°åå®ä»¬æ¯è¾ç¸çï¼ã
æåæé
æ°æ®æåæé
æåä½ä¸ºç±» C çæåçééææ°æ®æå m çæéï¼è½åç¡®å°ä»¥è¡¨è¾¾å¼ &C::m åå§åãå¨ C çæå彿°ä¸ï¼å¦ &(C::m) æ &m è¿æ ·ç表达å¼ä¸æææåæåæéã
è¿ç§æéè½ç¨ä½æåæé访é®è¿ç®ç¬¦ operator.* ä¸ operator->* çå³ä¾§æä½æ°ï¼
æåå¯è®¿é®æ æ§ä¹éèåºç±»çæ°æ®æåçæéï¼å¯ä»¥éå¼è½¬æ¢ææåæ´¾çç±»çå䏿°æ®æåçæéï¼
struct Base { int m; }; struct Derived : Base {}; Â int main() { int Base::* bp = &Base::m; int Derived::* dp = bp; Derived d; d.m = 1; std::cout << d.*dp << ' ' << d.*bp << '\n'; // æå° 1 1 }
ç¸åæ¹åç转æ¢ï¼å³ä»æåæ´¾çç±»çæ°æ®æåçæéå°æåæ æ§ä¹éèåºç±»çæ°æ®æåçæéï¼å è®¸ç± static_cast åæ¾å¼è½¬åæ¥è¿è¡ï¼å³ä½¿åºç±»å¹¶æ 该æåï¼ä½å½ç¨è¯¥æéè®¿é®æ¶ï¼æç»æ´¾çç±»ä¸æï¼äº¦å¯ï¼
æåæéç被æåç±»åä¹å¯ä»¥æ¯æåæéèªèº«ï¼æåæéå¯ä¸ºå¤çº§ï¼èä¸å¨æ¯çº§å¯ä»¥æä¸åç cv éå®ã亦å 许æéåæåæéçæ··åå¤çº§ç»åï¼
struct A { int m; // æåé const æåç const æé int A::* const p; };  int main() { // æåæ°æ®æåçé const æéï¼è¯¥æåæ¯æåé const æåç const æé int A::* const A::* p1 = &A::p;  const A a = {1, &A::m}; std::cout << a.*(a.*p1) << '\n'; // æå° 1  // æå const çæåæéç常è§é const æé int A::* const* p2 = &a.p; std::cout << a.**p2 << '\n'; // æå° 1 }
æå彿°æé
æåä½ä¸ºç±» C çæåçééææå彿° f çæéï¼å¯åç¡®å°ä»¥è¡¨è¾¾å¼ &C::f åå§åãå¨ C çæå彿°å
ï¼å¦ &(C::f) æ &f è¿æ ·ç表达å¼ä¸æææå彿°æéã
è¿ç§æéå¯ä»¥ç¨ä½æåæé访é®è¿ç®ç¬¦ operator.* ä¸ operator->* ç峿使°ãç»æè¡¨è¾¾å¼åªè½ç¨ä½å½æ°è°ç¨è¿ç®ç¬¦ç左侧æä½æ°ï¼
struct C { void f(int n) { std::cout << n << '\n'; } };  int main() { void (C::* p)(int) = &C::f; // æåç±» C çæå彿° f çæé C c; (c.*p)(1); // æå° 1 C* cp = &c; (cp->*p)(2); // æå° 2 }
æååºç±»çæå彿°çæéå¯ä»¥éå¼è½¬æ¢ææåæ´¾çç±»çå䏿å彿°çæéï¼
struct Base { void f(int n) { std::cout << n << '\n'; } }; struct Derived : Base {}; Â int main() { void (Base::* bp)(int) = &Base::f; void (Derived::* dp)(int) = bp; Derived d; (d.*dp)(1); (d.*bp)(2); }
ç¸åæ¹åç转æ¢ï¼å³ä»æåæ´¾çç±»çæå彿°çæéå°æåæ æ§ä¹éèåºç±»çæå彿°çæéï¼å è®¸ç± static_cast 䏿¾å¼è½¬åæ¥è¿è¡ï¼å³ä½¿åºç±»æ 该æå彿°ï¼ä½å¨ç¨è¯¥æéè¿è¡è®¿é®æ¶ï¼æç»æ´¾çç±»æï¼ï¼
struct Base {}; struct Derived : Base { void f(int n) { std::cout << n << '\n'; } };  int main() { void (Derived::* dp)(int) = &Derived::f; void (Base::* bp)(int) = static_cast<void (Base::*)(int)>(dp);  Derived d; (d.*bp)(1); // OKï¼æå° 1  Base b; (b.*bp)(2); // æªå®ä¹è¡ä¸º }
æå彿°æéå¯ç¨ä½åè°æå½æ°å¯¹è±¡ï¼é常å¨åºç¨ std::mem_fn æ std::bind ä¹åï¼
#include <iostream> #include <string> #include <algorithm> #include <functional> Â int main() { std::vector<std::string> v = {"a", "ab", "abc"}; std::vector<std::size_t> l; transform(v.begin(), v.end(), std::back_inserter(l), std::mem_fn(&std::string::size)); for(std::size_t n : l) std::cout << n << ' '; }
è¾åºï¼
1 2 3
空æé
æ¯ä¸ªç±»åçæé齿¥æä¸ä¸ªç¹æ®å¼ï¼ç§°ä¸ºè¯¥ç±»åç空æéå¼ï¼null pointer valueï¼ãå¼ä¸ºç©ºçæé䏿å对象æå½æ°ï¼è§£å¼ç¨ç©ºæéæ¯æªå®ä¹è¡ä¸ºï¼ï¼å¹¶ä¸ææäº¦ä¸ºç©ºå¼çåç±»åæéæ¯è¾ç¸çã
ä¸ºå°æéåå§å为空æèµç©ºå¼ç»æ¢åæéï¼å¯ä»¥ä½¿ç¨ç©ºæéåé¢é nullptrã空æé常é NULL æä»æ´æ°å¼ â0â çéå¼è½¬æ¢ã
é¶åå§ååå¼åå§åäº¦å°æéåå§åä¸ºå ¶ç©ºå¼ã
空æéå¯ç¨äºæç¤ºå¯¹è±¡ä¸åå¨ï¼ä¾å¦ function::target()ï¼ï¼æä½ä¸ºå ¶ä»é误æ¡ä»¶çæç¤ºå¨ï¼ä¾å¦ dynamic_castï¼ãéå¸¸ï¼æ¥åæéå®åç彿°å§ç»éè¦æ£æ¥å¼æ¯å¦ä¸ºç©ºï¼å¹¶ä»¥ä¸åæ¹å¼å¤ç该æ åµï¼ä¾å¦ï¼delete 表达å¼å¨ä¼ é空æéæ¶ä¸åä»»ä½äºï¼ã
叏鿧
- è¥æé声æä¸ cv å¨
*ä¹ååºç°ï¼å宿¯ 声æè¯´æç¬¦åºå çä¸é¨åï¼å¹¶åºç¨å°è¢«æåç对象ã - è¥æé声æä¸ cv å¨
*ä¹ååºç°ï¼å宿¯ 声æç¬¦ çä¸é¨åï¼å¹¶åºç¨å°æå£°æçæéã
| è¯æ³ | å«ä¹ |
|---|---|
| const T* | æå const 对象çæé |
| T const* | æå const 对象çæé |
| T* const | æå对象ç const æé |
| const T* const | æå const 对象ç const æé |
| T const* const | æå const 对象ç const æé |
// pc æ¯ const int çé const æé // cpc æ¯ const int ç const æé // ppc æ¯ const int çé const æéçé const æé const int ci = 10, *pc = &ci, *const cpc = pc, **ppc; // p æ¯é const int çé const æé // cp æ¯é const int ç const æé int i, *p, *const cp = &i;  i = ci; // OKï¼å¤å¶ const int å¼å°é const int *cp = ci; // OKï¼è½ä¿®æ¹é const intï¼ä¸º const æéææåï¼ pc++; // OKï¼è½ä¿®æ¹é const æéï¼æå const intï¼ pc = cpc; // OKï¼è½ä¿®æ¹é const æéï¼æå const intï¼ pc = p; // OKï¼è½ä¿®æ¹é const æéï¼æå const intï¼ ppc = &pc; // OKï¼const int çæéçå°åæ¯ const int çæéçæé  ci = 1; // é误ï¼ä¸è½ä¿®æ¹ const int ci++; // é误ï¼ä¸è½ä¿®æ¹ const int *pc = 2; // é误ï¼ä¸è½ä¿®æ¹è¢«æåç const int cp = &ci; // é误ï¼ä¸è½ä¿®æ¹ const æéï¼æåé const intï¼ cpc++; // é误ï¼ä¸è½ä¿®æ¹ const æéï¼æå const intï¼ p = pc; // é误ï¼é const int çæéä¸è½æå const int ppc = &p; // é误ï¼const int çæéçæéä¸è½æåé const int çæé
é常ï¼ä»ä¸ä¸ªå¤çº§æéå°å¦ä¸ä¸ªçéå¼è½¬æ¢ï¼éµå¾ªéå®è½¬æ¢åæéæ¯è¾è¿ç®ç¬¦ä¸ææè¿°çè§åã