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++ è¯è¨ > éå¼è½¬æ¢
éå¼è½¬æ¢
塿¯å¨è¯å¢ä¸ä½¿ç¨äºæç§è¡¨è¾¾å¼ç±»å T1ï¼ä½è¯å¢ä¸æ¥å该类åï¼èæ¥åå¦ä¸ç±»å T2 çæ¶åï¼ä¼è¿è¡éå¼è½¬æ¢ï¼å
·ä½æ¯ï¼
- è°ç¨ä»¥
T2为形å声æç彿°æ¶ï¼ä»¥è¯¥è¡¨è¾¾å¼ä¸ºå®åï¼ - è¿ç®ç¬¦æå¾
T2ï¼è以该表达å¼ä¸ºæä½æ°ï¼ - åå§å
T2ç±»åçæ°å¯¹è±¡ï¼å æ¬å¨è¿åT2ç彿°ä¸çreturnè¯å¥ï¼ - å°è¡¨è¾¾å¼ç¨äº
switchè¯å¥ï¼T2为æ´åç±»åï¼ï¼ - å°è¡¨è¾¾å¼ç¨äº
ifè¯å¥æå¾ªç¯ï¼T2为 boolï¼ã
ä»
å½åå¨ä¸ä¸ªä» T1 å° T2 çæ æ§ä¹éå¼è½¬æ¢åºåæ¶ï¼ç¨åºè¯æï¼è½ç¼è¯ï¼ã
妿æè°ç¨ç彿°æè¿ç®ç¬¦åå¨å¤ä¸ªéè½½ï¼åå° T1 å°æ¯ä¸ªå¯ç¨ç T2 齿é éå¼è½¬ååºåä¹åï¼ä»¥éè½½å³è®®è§åå³å®ç¼è¯åªä¸ªéè½½ã
注æï¼ç®æ¯è¡¨è¾¾å¼ä¸ï¼é对äºå è¿ç®ç¬¦çæä½æ°ä¸çéå¼è½¬æ¢çç®æ ç±»åï¼æ¯ä»¥ä¸ç»åç¬çéå¸¸ç®æ¯è½¬æ¢çè§åæå³å®çã
转æ¢é¡ºåº
éå¼è½¬æ¢åºåç±ä¸åå 容ä¾ç §è¿ä¸ªé¡ºåºæææï¼
å½èèæé 彿°æç¨æ·å®ä¹è½¬æ¢å½æ°çå®åæ¶ï¼åªå 许ä¸ä¸ªæ å转æ¢åºåï¼å¦åå°å®é ä¸å¯ä»¥å°ç¨æ·å®ä¹è½¬æ¢ä¸²è¿èµ·æ¥ï¼ãä»ä¸ä¸ªå 建类å转æ¢å°å¦ä¸å å»ºç±»åæ¶ï¼åªå 许ä¸ä¸ªæ å转æ¢åºåã
æ å转æ¢åºåç±ä¸åå 容ä¾ç §è¿ä¸ªé¡ºåºæææï¼
|
3) é¶æä¸ä¸ªå½æ°æé转æ¢ï¼
|
(C++17 èµ·) |
ç¨æ·å®ä¹è½¬æ¢ç±é¶æä¸ä¸ªé explicit åå®åæé 彿°æé explicit 转æ¢å½æ°çè°ç¨ææã
å½ä¸ä»
å½ T2 è½ä»è¡¨è¾¾å¼ e å¤å¶åå§åï¼å³å¯¹äºè设ç临æ¶å¯¹è±¡ tï¼å£°æ T2 t = e; è¯æï¼è½ç¼è¯ï¼æ¶ï¼ç§°è¡¨è¾¾å¼ e å¯éå¼è½¬æ¢ä¸º T2ãæ³¨æè¿æå«äºç´æ¥åå§åï¼T2 t(e)ï¼ï¼å
¶ä¸è¿ä¼é¢å¤èè explicit æé 彿°å转æ¢å½æ°ã
æè¯å¢è½¬æ¢
|
ä¸åè¯å¢ä¸ï¼æå¾
ç±»å boolï¼ä¸è¥å£°æ bool t(e); è¯æåè¿è¡éå¼è½¬æ¢ï¼å³èèå¦
|
(C++11 èµ·) |
ä¸åè¯å¢ä¸ï¼æå¾
æä¸ªè¯å¢ç¹å®çç±»å Tï¼è对äºç±»ç±»å E çè¡¨è¾¾å¼ eï¼ä»
å½ E æ¥æå个转æ¢å°ä»»ä½å¯å
许类åçé explicit ç¨æ·å®ä¹è½¬æ¢å½æ° (C++14 å)å¯å
许类å䏿°å¥½æä¸ä¸ªç±»å Tï¼ä½¿å¾ E æ¥æé explicit 转æ¢å½æ°ï¼å
¶è¿åç±»å为ï¼å¯æ cv éå®çï¼T æå°ï¼å¯æ cv éå®çï¼T çå¼ç¨çï¼ä¸ e å¯éå¼è½¬æ¢ä¸º T (C++14 èµ·)æ¶ï¼æå¾å°å
许ãç§°è¿ç§è¡¨è¾¾å¼ e æè¯å¢éå¼è½¬æ¢å°æå®çç±»å Tãæ³¨æï¼å
¶ä¸ä¸èè explicit 转æ¢å½æ°ï¼è½ç¶å¨æè¯å¢è½¬æ¢å° bool æ¶ä¼èèå®ä»¬ã (C++11 èµ·)
- delete 表达å¼çå®åï¼
Tæ¯ä»»ä½å¯¹è±¡æéç±»åï¼ï¼ - æ´å常é表达å¼ï¼å
¶ä¸ä½¿ç¨äºåé¢ç±»ï¼
Tæ¯ä»»ä½æ´æ°ææ ä½ç¨åæä¸¾ç±»åï¼æéä¸çç¨æ·å®ä¹è½¬æ¢å½æ°å¿ é¡»æ¯ constexprï¼ï¼ -
switchè¯å¥çæ§å¶è¡¨è¾¾å¼ï¼Tæ¯æ´æ°ææä¸¾ç±»åï¼ã
#include <cassert>  template<typename T> class zero_init { T val; public: zero_init() : val(static_cast<T>(0)) { } zero_init(T val) : val(val) { } operator T&() { return val; } operator T() const { return val; } };  int main() { zero_init<int> i; assert(i == 0); i = 7; assert(i == 7); switch(i) { } // C++14 åé误ï¼å¤äºä¸ä¸ªè½¬æ¢å½æ°ï¼ // C++14ï¼ä¸¤ä¸ªå½æ°å转æ¢å°åä¸ç±»å intï¼ switch(i + 0) { } // å§ç» OKï¼éå¼è½¬æ¢ï¼ }
å¼åæ¢
å¼åæ¢æ¯æ´æ¹è¡¨è¾¾å¼å¼ç±»å«ç转æ¢ãæ¯å½å°è¡¨è¾¾å¼ç¨ä½æå¾ ä¸åå¼ç±»å«ç表达å¼çè¿ç®ç¬¦çæä½æ°æ¶ï¼åçå¼åæ¢ã
å·¦å¼å°å³å¼è½¬æ¢
ä»»ä½é彿°ãéæ°ç»ç±»å T çæ³å·¦å¼ï¼å¯éå¼è½¬æ¢æåç±»åç纯å³å¼ãè¥ T 为é类类åï¼åæ¤è½¬æ¢äº¦ç§»é¤ cv éå®ç¬¦ã
以䏿 åµä¸å¹¶ä¸è®¿é®è¯¥å·¦å¼ææä»£ç对象ï¼
- 转ååçå¨ä¸æ±å¼è¯å¢ä¸ï¼ä¸å¨ç«å³è°ç¨ä¹å¤ï¼ (C++20 èµ·)ï¼ä¾å¦ä½ä¸º sizeofãnoexceptãdecltype (C++11 èµ·) æ typeid çéæå½¢å¼çæä½æ°
- æ³å·¦å¼å ·æ std::nullptr_t ç±»åï¼æ¤æ åµä¸ç»æçº¯å³å¼æ¯ç©ºæé常é nullptrã
- åå¨äºå¯¹è±¡ç弿¯ç¼è¯æ¶å¸¸éï¼ä¸æ»¡è¶³æäºå ¶ä»æ¡ä»¶ï¼è§ ODR å¼ä½¿ç¨ï¼
è¥ T æ¯é类类åï¼å产ç该对象æå
å«çå¼ä½ä¸ºçº¯å³å¼ç»æã对äºç±»ç±»åï¼æ¤è½¬æ¢
|
å®é
ä¸ä»¥åæ³å·¦å¼ä½ä¸ºå¤å¶æé 彿°çå®åï¼å¤å¶æé ä¸ä¸ª |
(C++17 å) |
|
å°æ³å·¦å¼è½¬æ¢ä¸ºçº¯å³å¼ï¼å ¶ç»æå¯¹è±¡ç±è¯¥æ³å·¦å¼å¤å¶åå§åã |
(C++17 èµ·) |
è¿é¡¹è½¬æ¢æå¡é çæ¯ä»æä¸ªå åä½ç½®ä¸è¯»åå¼å° CPU å¯åå¨ä¹ä¸çå¨ä½ã
è¥æ³å·¦å¼ææä»£çå¯¹è±¡å«æä¸ç¡®å®å¼ï¼ä¾å¦ç±é»è®¤åå§åé类类åçèªå¨åéèå¾ï¼ï¼åå ¶è¡ä¸ºæªå®ä¹
|
ï¼é¤é该ä¸ç¡®å®å¼å ·æå¯æ cv éå®çæ 符å·å符类åï¼ä¸ä¸ç¼åäº CPU å¯åå¨ï¼æè æ£å¼èè¨ï¼
è¥æ³å·¦å¼å«æå·²æ æåçæéå¼ï¼åè¡ä¸ºäº¦ä¸ºç±å®ç°å®ä¹ï¼èéæªå®ä¹ï¼ã |
(C++11 èµ·) |
æ°ç»å°æé转æ¢
âT ç N å
ç´ æ°ç»âæâT çæªç¥è¾¹çæ°ç»âç±»åç左弿å³å¼ï¼å¯éå¼è½¬æ¢ä¸ºâT çæéâç±»åç纯å³å¼ãè¥æ°ç»æ¯çº¯å³å¼ï¼ååç临æ¶éå®è´¨åã (C++17 èµ·)产ççæéæåæ°ç»é¦å
ç´ ï¼ç»èåé
æ°ç»å°æééåï¼ã
临æ¶éå®è´¨åä»»ä½å®æ´ç±»å struct S { int m; }; int k = S().m; // C++17 èµ·æåè®¿é®æå¾ æ³å·¦å¼ï¼ // S() 纯å³å¼è¢«è½¬æ¢ä¸ºäº¡å¼ 临æ¶éå®è´¨åå¨ä¸ä¾æ åµä¸åçï¼
注æä¸´æ¶éå®è´¨åå¨ä»çº¯å³å¼åå§ååç±»å对象ï¼ç±ç´æ¥åå§åæå¤å¶åå§åï¼æ¶ä¸åºç°ï¼ç´æ¥ä»åå§åå¨åå§åè¿ç§å¯¹è±¡ãè¿ç¡®ä¿âåä¿è¯çå¤å¶æ¶é¤âã |
(C++17 èµ·) |
彿°å°æé
彿°ç±»å T çå·¦å¼ï¼å¯éå¼è½¬æ¢ææåè¯¥å½æ°çæéç纯å³å¼ãè¿ä¸éç¨äºééææå彿°ï¼å 为ä¸å卿代ééææå彿°çå·¦å¼ã
æ°å¼æå
æ´åæå
å°æ´åç±»åï¼å¦ charï¼ç纯å³å¼å¯è½¬æ¢ä¸ºè¾å¤§æ´åç±»åï¼å¦ intï¼ç纯å³å¼ãå ·ä½èè¨ï¼ç®æ¯è¿ç®ç¬¦ä¸æ¥åå°äº int çç±»åä¸ºå ¶å®åï¼èå¨å·¦å¼å°å³å¼è½¬æ¢åï¼è¥éç¨åèªå¨å®æ½æ´åæåãæ¤è½¬æ¢å§ç»ä¿æåå¼ã
以ä¸éå¼è½¬æ¢è¢«å½ç±»ä¸ºæ´åæåï¼
-
signed charæsigned shortå¯è½¬æ¢ä¸º intï¼ - è¥ int è½ä¿æå
¶æ´ä¸ªå¼èå´ï¼å
unsigned charãchar8_t(C++20 èµ·) æunsigned shortå¯è½¬æ¢ä¸º intï¼å¦åå¯è½¬æ¢ä¸º unsigned intï¼ -
charå¯è½¬æ¢ä¸º int æ unsigned intï¼åå³äºå ¶åºå±ç±»å为 signed char è¿æ¯ unsigned charï¼è§ä¸æï¼ï¼ -
wchar_tãchar16_tåchar32_t(C++11 èµ·) å¯è½¬æ¢ä¸ºä»¥ä¸å表ä¸è½ä¿æå ¶æ´ä¸ªå¼èå´çé¦ä¸ªç±»åï¼intãunsigned intãlongãunsigned longãlong longãunsigned long long (C++11 èµ·)ï¼ - åºå±ç±»åä¸åºå®çæ ä½ç¨åæä¸¾ç±»åå¯è½¬æ¢ä¸ºä»¥ä¸å表ä¸è½ä¿æå ¶æ´ä¸ªå¼èå´çé¦ä¸ªç±»åï¼intãunsigned intãlongãunsigned longãlong longãunsigned long longãæ©å±æ´æ°ç±»åï¼ä»¥å¤§å°é¡ºåºï¼æç¬¦å·ä¼å äºæ 符å·ï¼ (C++11 èµ·)ãè¥å¼èå´æ´å¤§ï¼åä¸åºç¨æ´åæåï¼
-
|
(C++11 èµ·) |
- è¥ int è½è¡¨ç¤ºä½åçæ´ä¸ªå¼èå´ï¼åä½åç±»åå¯è½¬æ¢ä¸º intï¼å¦åè¥ unsigned int è½è¡¨ç¤ºä½åçæ´ä¸ªå¼èå´ï¼åå¯è½¬æ¢ä¸º unsigned intï¼å¦åä¸å®æ½æ´åæåï¼
- bool ç±»åå¯è½¬æ¢ä¸º intï¼å¼ false å为 â0â è true å为 1ã
注æï¼ææå ¶ä»è½¬æ¢é½ä¸æ¯æåï¼ä¾å¦éè½½å³è®®éæ© char -> intï¼æåï¼ä¼å äº char -> shortï¼è½¬æ¢ï¼ã
æµ®ç¹æå
float ç±»å纯å³å¼å¯è½¬æ¢ä¸º double ç±»åç纯å³å¼ãå¼ä¸æ´æ¹ã
æ°å¼è½¬æ¢
ä¸åäºæåï¼æ°å¼è½¬æ¢å¯ä»¥æ´æ¹å¼ï¼è䏿æ½å¨ç精度æå¤±ã
æ´å转æ¢
任使´æ°ç±»åææ ä½ç¨åæä¸¾ç±»åç纯å³å¼é½å¯éå¼è½¬æ¢æä»»ä½å ¶ä»æ´æ°ç±»åãè¥å ¶è½¬æ¢ååºäºæ´æ°ç±»åæåä¹ä¸ï¼å宿¯æåèé转æ¢ã
- è¥ç®æ ç±»å为æ 符å·ï¼åç»æå¼æ¯çäºæºå¼æ¨¡ 2n
çæå°æ 符å·å¼ï¼å ¶ä¸ n æ¯ç¨äºè¡¨ç¤ºç®æ ç±»åç使°ã
- å³åå³äºç®æ ç±»åæ´å®½ææ´çªï¼åå«å¯¹æç¬¦å·æ°è¿è¡ç¬¦å·æ©å±[èæ³¨ 1]ææªæï¼è对æ ç¬¦å·æ°è¿è¡é¶æ©å±ææªæã
- è¥ç®æ ç±»åæç¬¦å·ï¼å彿ºæ´æ°è½ä»¥ç®æ ç±»å表示æ¶ï¼ä¸æ´æ¹å
¶å¼ãå¦åç»ææ¯å®ç°å®ä¹ç (C++20 å)䏿ºå¼å¯¹ 2n
åä½çå¯ä¸ç®æ ç±»åå¼ï¼å ¶ä¸ n æ¯ç¨äºè¡¨ç¤ºç®æ ç±»åç使° (C++20 èµ·)ï¼æ³¨æè¿ä¸åäºæªå®ä¹çæç¬¦å·æ´æ°ç®æ¯æº¢åºï¼ã - è¥æºç±»å为 boolï¼åå¼ false 转æ¢ä¸ºç®æ ç±»åçé¶ï¼èå¼ true è½¬æ¢æç®æ ç±»åçä¸ï¼æ³¨æè¥ç®æ ç±»å为 intï¼åè¿æ¯æ´æ°ç±»åæåï¼èéæ´æ°ç±»å转æ¢ï¼ã
- è¥ç®æ ç±»å为 boolï¼åè¿æ¯å¸å°è½¬æ¢ï¼è§ä¸æï¼ã
- è¥ç®æ ç±»å为æ 符å·ï¼åç»æå¼æ¯çäºæºå¼æ¨¡ 2n
æµ®ç¹è½¬æ¢
æµ®ç¹ç±»åç纯å³å¼å¯è½¬æ¢æä»»ä½å ¶ä»æµ®ç¹ç±»åç纯å³å¼ãè¥å ¶è½¬æ¢åäºæµ®ç¹æåä¹ä¸ï¼å宿¯æåèé转æ¢ã
- è¥æºå¼è½ä»¥ç®æ ç±»åå确表示ï¼å䏿´æ¹å®ã
- è¥æºå¼å¤äºç®æ ç±»åç两个å¯è¡¨ç¤ºå¼ä¹é´ï¼åç»ææ¯ä¸¤ä¸ªå¼ä¹ä¸ï¼éæ©åªä¸ªæ¯å®ç°å®ä¹çï¼ä¸è¿è¥æ¯æ IEEEï¼åèå ¥é»è®¤ä¸ºå°ææ¥è¿ï¼ã
- å¦åï¼è¡ä¸ºæªå®ä¹ã
æµ®ç¹æ´å转æ¢
- æµ®ç¹ç±»åç纯å³å¼å¯éå¼è½¬æ¢æä»»ä½æ´æ°ç±»åç纯å³å¼ãæªæå°æ°é¨åï¼å³èå¼å°æ°é¨åãè¥ç»æä¸è½éåºå°ç®æ ç±»åä¸ï¼åè¡ä¸ºæªå®ä¹ï¼å³ä½¿å¨ç®æ ç±»å为æ ç¬¦å·æ°æ¶ï¼ä¹ä¸å®æ½æ¨¡ç®æ¯ï¼ãè¥ç®æ ç±»å为 boolï¼åè¿æ¯å¸å°è½¬æ¢ï¼è§ä¸æï¼ã
- æ´æ°ææ ä½ç¨åæä¸¾ç±»åç纯å³å¼å¯è½¬æ¢æä»»ä½æµ®ç¹ç±»åç纯å³å¼ãè¥ä¸è½æ£ç¡®è¡¨ç¤ºè¯¥å¼ï¼åéæ©ä¸ä¹ææ¥è¿çè¾é«å¼è¿æ¯ææ¥è¿çè¾ä½å¼æ¯å®ç°å®ä¹çï¼ä¸è¿è¥æ¯æ IEEEï¼åèå ¥é»è®¤ä¸ºå°ææ¥è¿ãè¥å ¶å¼ä¸è½éåºå°ç®æ ç±»åä¸ï¼åè¡ä¸ºæªå®ä¹ãè¥æºç±»å为 boolï¼åå¼ false 转æ¢ä¸ºé¶ï¼èå¼ true 转æ¢ä¸ºä¸ã
æé转æ¢
- 空æé常éï¼è§ NULLï¼è½è½¬æ¢æä»»ä½æéç±»åï¼èç»ææ¯è¯¥ç±»åç空æéå¼ãå 许è¿ç§è½¬æ¢ï¼ç§°ä¸ºç©ºæé转æ¢ï¼ä½ä¸ºå次转æ¢ï¼è½¬æ¢å° cv éå®ç±»åï¼å³ä¸è®¤ä¸ºå®æ¯æ°å¼åé宿§è½¬æ¢çç»åã
- æåä»»ä½ï¼å¯æ cv éå®çï¼å¯¹è±¡ç±»å
Tçæéç纯å³å¼ï¼å¯è½¬æ¢ææåï¼æçå cv éå®çï¼void çæéç纯å³å¼ãç»ææéä¸åæé表示å åä¸çåä¸ä½ç½®ãè¥åæéæ¯ç©ºæéå¼ï¼åç»æä¸ºç®æ ç±»åç空æéå¼ã - æåæ´¾ç类类åçï¼å¯æ cv éå®çï¼ç©ºæéå¯è½¬æ¢ææåå ¶ï¼æçå cv éå®çï¼åºç±»çæéãè¥åºç±»ä¸å¯è®¿é®æææ§ä¹ï¼å转æ¢éè¯æï¼ä¸è½ç¼è¯ï¼ã转æ¢ç»ææ¯æåå被æå对象å çåºç±»å对象çæéã空æéå¼è½¬æ¢æç®æ ç±»åç空æéå¼ã
æåæé转æ¢
- 空æé常éï¼è§ NULLï¼å¯è½¬æ¢æä»»ä½æåæéç±»åï¼èç»ææ¯è¯¥ç±»åç空æåæéå¼ãå 许è¿ç§è½¬æ¢ï¼ç§°ä¸ºç©ºæåæé转æ¢ï¼ä½ä¸ºå次转æ¢ï¼è½¬æ¢å° cv éå®ç±»åï¼å³ä¸è®¤ä¸ºå®æ¯æ°å¼åé宿§è½¬æ¢çç»åã
- æååºç±»
Bä¸æç±»åTæåçæé纯å³å¼ï¼å¯è½¬æ¢ææåå ¶æ´¾çç±»Dä¸åä¸ç±»åTæåçæé纯å³å¼ãè¥Bæ¯Dçé´æ¥ãææ§ä¹æèåºç±»ï¼ææ¯Dçæä¸ªä¸é´èåºç±»çåºç±»ï¼å转æ¢éè¯æï¼ä¸è½ç¼è¯ï¼ãè½ä»¥D对象解å¼ç¨ç»ææéï¼èå®å°è®¿é®è¯¥D对象çBåºç±»å对象å çæåã空æåæéå¼è½¬æ¢æç®æ ç±»åç空æåæéå¼ã
å¸å°è½¬æ¢
æ´æ°ãæµ®ç¹ãæ ä½ç¨åæä¸¾ãæéåæåæéç±»åç纯å³å¼ï¼å¯è½¬æ¢æ bool ç±»åç纯å³å¼ã
é¶å¼ï¼å¯¹äºæ´æ°ãæµ®ç¹åæ ä½ç¨åæä¸¾ï¼ã空æéå¼å空æåæéå¼å为 falseãææå ¶ä»å¼å为 trueã
|
ç´æ¥åå§åçè¯å¢ä¸ï¼å¯ä»¥ std::nullptr_t ç±»å纯å³å¼ï¼å æ¬ nullptrï¼åå§å bool 对象ãç»æä¸º falseãç¶èä¸è®¤ä¸ºå®æ¯éå¼è½¬æ¢ã |
(C++11 èµ·) |
é宿§è½¬æ¢
- æåæ cv éå®çç±»å
Tçæéç±»åç纯å³å¼ï¼å¯è½¬æ¢ä¸ºæåææ´å¤ cv éå®çåä¸ç±»åTçæé纯å³å¼ï¼æ¢è¨ä¹ï¼è½æ·»å 常æ§åæåæ§ï¼ã - æåç±»
X䏿 cv éå®çç±»åTçæåæéç纯å³å¼ï¼å¯è½¬æ¢ææåç±»X䏿æ´å¤ cv éå®çç±»åTçæåæé纯å³å¼ã
- æåæ cv éå®çç±»å
âæ´å¤â cv éå®è¡¨æ
- æåæ éå®ç±»åçæéè½è½¬æ¢ææå
constçæéï¼ - æåæ éå®ç±»åçæéè½è½¬æ¢ææå
volatileçæéï¼ - æåæ éå®ç±»åçæéè½è½¬æ¢ææå
const volatileçæéï¼ - æå
constç±»åçæéè½è½¬æ¢ææåconst volatileçæéï¼ - æå
volatileç±»åçæéè½è½¬æ¢ææåconst volatileçæéã
- æåæ éå®ç±»åçæéè½è½¬æ¢ææå
对äºå¤çº§æéï¼åºç¨ä¸åéå¶ï¼èº«ä¸º cv1
0 é宿éï¼æå cv1
1 é宿éï¼æåâ¦â¦ cv1
n-1 é宿éï¼æå cv1
n éå® T çå¤çº§æé P1ï¼å¯è½¬æ¢æèº«ä¸º cv2
0 é宿éï¼æå cv2
1 é宿éï¼æåâ¦â¦ cv2
n-1 é宿éï¼æå cv2
n éå® T çå¤çº§æé P2ï¼ä»
å½
- 两个æéç级æ°
nç¸åï¼
- 两个æéç级æ°
|
(C++20 èµ·) |
- è¥å¨
P1çæçº§ï¼é¤äºé¶çº§ï¼ç cv1
k 䏿 constï¼åå¨P2çå级 cv2
k 䏿 constï¼ - è¥å¨
P1çæçº§ï¼é¤äºé¶çº§ï¼ç cv1
k 䏿 volatileï¼åå¨P2çå级 cv2
k 䏿 volatileï¼
- è¥å¨
|
(C++20 èµ·) |
- è¥å¨æçº§
kä¸ï¼P2æ¯P1ææ´å¤ cv é宿P1䏿已ç¥è¾¹çæ°ç»ç±»åèP2䏿æªç¥è¾¹çæ°ç»ç±»å (C++20 èµ·)ï¼åP2å°k为æ¢çæ¯ä¸çº§ï¼é¤äºé¶çº§ï¼cv2
1, cv2
2 ... cv2
k ä¸é½å¿ é¡»æ const ã - åæ ·çè§åç¨äºæåæåçå¤çº§æéåæå对象åæåæåçå¤çº§æ··åæéï¼
- è¥å¨æçº§
|
(C++14 èµ·) |
- é¶çº§ç±éå¤çº§é宿§è½¬æ¢çè§åå¤çã
char** p = 0; const char** p1 = p; // é误ï¼2 çº§ææ´å¤ cv éå®ä½ 1 级é const const char* const * p2 = p; // OKï¼2 çº§ææ´å¤ cv éå®å¹¶å¨ 1 级添å const volatile char * const * p3 = p; // OKï¼2 çº§æ´æ cv éå®å¹¶å¨ 1 级添å const volatile const char* const* p4 = p2; // OKï¼2 çº§æ´æ cv éå®è const å·²å¨ 1 级  double *a[2][3]; double const * const (*ap)[3] = a; // C++14 èµ· OK double * const (*ap1)[] = a; // C++20 èµ· OK
注æ C ç¼ç¨è¯è¨ä¸ï¼åªè½æ·»å const/volatile å°ç¬¬ä¸çº§ï¼
char** p = 0; char * const* p1 = p; // C ä¸ C++ ä¸ OK const char* const * p2 = p; // C ä¸é误ï¼C++ ä¸ OK
彿°æé转æ¢
void (*p)(); void (**pp)() noexcept = &p; // é误ï¼ä¸è½è½¬æ¢ææå noexcept 彿°çæé  struct S { typedef void (*p)(); operator p(); }; void (*q)() noexcept = S(); // é误ï¼ä¸è½è½¬æ¢ææå noexcept 彿°çæé |
(C++17 èµ·) |
å®å ¨ bool é®é¢
å¨ C++11 å¼å ¥æ¾å¼è½¬æ¢å½æ°ä¹åï¼è®¾è®¡ä¸ä¸ªè½ç¨äºå¸å°è¯å¢çç±»ï¼æ¯å¦ï¼if(obj) { ... }ï¼ä¼åºç°é®é¢ï¼ç»å®ä¸ä¸ªç¨æ·å®ä¹è½¬æ¢å½æ°ï¼å¦ T::operator bool() const;ï¼åéå¼è½¬æ¢åºåå 许åå¤ä¸æ¥æ å转æ¢åºåï¼ä¹å°±æ¯ bool ç»æä¼è½¬æ¢æ intï¼å è®¸è¯¸å¦ obj << 1; æ int i = obj; è¿æ ·ç代ç ã
ä¸ä¸ªæ©æçè§£å³æ¹æ¡å¯åè§ std::basic_iosï¼å®å®ä¹ operator! å operator void*(C++11 å)ï¼ä½¿å¾å¦ if(std::cin) {...} ç代ç è½ç¼è¯ï¼å 为 void* è½è½¬æ¢ä¸º boolï¼ä½int n = std::cout; ä¸è½ï¼å 为 void* ä¸å¯è½¬æ¢è³ intãè¿ä»ç¶å è®¸æ æä¹ä»£ç è½ç¼è¯ï¼å¦ delete std::cout;ãè®¸å¤ C++11 åçç¬¬ä¸æ¹åºè®¾è®¡å¸¦ææ´ä¸ºå¤æçè§£å³æ¹æ¡ï¼ç§°ä½å®å ¨ Bool ææ³ã
|
æ¾å¼ bool 转æ¢äº¦è½ç¨äºè§£å³å®å ¨ bool é®é¢ explicit operator bool() const { ... } |
(C++11 èµ·) |
èæ³¨
- â ä» è¥ç®æ¯ä¸ºè¡¥ç æä½¿ç¨ï¼ä» 对å®å®½æ´æ°ç±»åè¦æ±è¡¥ç ãç¶è注æç®åæææ¥æ C++ ç¼è¯å¨çå¹³å°é½ä½¿ç¨è¡¥ç ç®æ¯ã
ç¼ºé·æ¥å
ä¸åæ´æ¹è¡ä¸ºçç¼ºé·æ¥å追溯å°åºç¨äºä»¥ååºçç C++ æ åã
| DR | åºç¨äº | åºçæ¶çè¡ä¸º | æ£ç¡®è¡ä¸º |
|---|---|---|---|
| CWG 330 | C++14 | ä» double * const (*p)[3] å° double const * const (*p)[3] ç转æ¢éæ³ | 转æ¢åæ³ |
| CWG 616 | C++11 | 任使ªåå§å对象çå·¦å¼å°å³å¼çè½¬æ¢æ¯æªå®ä¹è¡ä¸º | å
许ä¸å®å¼ç unsigned char
|
| CWG 1423 | C++11 | std::nullptr_t å¨ç´æ¥æå¤å¶åå§åä¸å¯è½¬æ¢ä¸º bool
|
åªå è®¸ç´æ¥åå§å |
| CWG 1781 | C++11 | std::nullptr_t å° bool 被认为æ¯éå¼è½¬æ¢ï¼å°½ç®¡åªå¯¹ç´æ¥åå§ååæ³
|
ä¸åè®¤ä¸ºå®æ¯éå¼è½¬æ¢ |