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++ è¯è¨ > èååå§å
èååå§å
ä»è±æ¬å·åå§åå¨å表åå§åèåä½
è¯æ³
T object = {arg1, arg2, ...};
|
(1) | ||||||||
T object {arg1, arg2, ...};
|
(2) | (C++11 èµ·) | |||||||
T object = { .ææ´¾ç¬¦ = arg1 , .ææ´¾ç¬¦ { arg2 } ... };
|
(3) | (C++20 èµ·) | |||||||
T object { .ææ´¾ç¬¦ = arg1 , .ææ´¾ç¬¦ { arg2 } ... };
|
(4) | (C++20 èµ·) | |||||||
T object (arg1, arg2, ...);
|
(5) | (C++20 èµ·) | |||||||
è§£é
èååå§å对èåä½è¿è¡åå§åã宿¯å表åå§åçä¸ç§å½¢å¼ (C++11 èµ·)ï¼æç´æ¥åå§åçä¸ç§å½¢å¼ (C++20 èµ·)ã
èå使¯ä¸åç±»åä¹ä¸ï¼
- æ°ç»ç±»å
- 符å以䏿¡ä»¶ç类类åï¼å¸¸ä¸º struct æ unionï¼
- æ ç§ææåä¿æ¤çç´æ¥ (C++17 èµ·)ééææ°æ®æå
|
(C++11 å) |
|
(C++11 èµ·) (C++17 å) |
|
(C++17 èµ·) (C++20 å) |
|
(C++20 èµ·) |
- æ èãç§ææåä¿æ¤ (C++17 èµ·)åºç±»
- æ èæå彿°
| (C++11 èµ·) (C++14 å) |
èååå§åçæææ¯ï¼
- æ¯ä¸ªç´æ¥å ¬å¼åºç±»ã (C++17 èµ·)æ°ç»å ç´ æééæç±»æåï¼ä»¥æ°ç»ä¸æ /åºç°äºç±»å®ä¹ç顺åºï¼ä»åå§åå¨å表ä¸ç对åºåå¥è¿è¡å¤å¶åå§åã
- è¥åå§åå¨å奿¯è¡¨è¾¾å¼ï¼åæ ¹æ®å¤å¶åå§åå 许è¿è¡éå¼è½¬æ¢ï¼ä½å¯¹äºå表åå§åå½¢å¼ç¦æ¢çªåè½¬æ¢ (C++11 èµ·)ã
- è¥åå§åå¨å奿¯åµå¥çè±æ¬å·åå§åå¨å表ï¼å ¶å¹¶é表达å¼ï¼ï¼åå ¶å¯¹åºçæ°ç»å ç´ /ç±»æå/å ¬å¼åºç±» (C++17 èµ·)ä»è¯¥åå¥è¿è¡å表åå§åï¼èååå§åæ¯éå½çã
- è¥å¯¹è±¡æ¯æªç¥å¤§å°çæ°ç»ï¼èææä¾çè±æ¬å·ç¯ç»çåå§åå¨åè¡¨æ¥æ
n个åå¥ï¼åæ°ç»ç大å°ä¸ºnãï¼æ³¨ææ¤æ åµä¸ç对象ä¸è½æ¯ééææ°æ®æåï¼æåå¿ é¡»æ¥æå®æ´ç±»åãï¼
- éææ°æ®æååæ åä½åå¨èååå§åä¸è¢«è·³è¿ã
- è¥åå§åå¨åå¥çæ°éè¶ åºæè¦åå§åçæåååºç±» (C++17 èµ·)çæ°éï¼åç¨åºéè¯æã
|
(C++11 å) |
|
(C++11 èµ·) |
- å½èååå§åèå使¶ï¼åªåå§åå ¶é¦ä¸ªééææ°æ®æåã
è¥èååå§å使ç¨å¤å¶å表åå§åè¯æ³ï¼ T a = {args..} ï¼ï¼å (C++14 å)坿¶é¤ï¼çç¥ï¼ç¯ç»åµå¥çåå§åå¨å表çè±æ¬å·ï¼è¿ç§æ
åµä¸ï¼ä½¿ç¨æéæ°éçåå§åå¨åå¥åå§å对åºçåèåä½çå个æåæå
ç´ ï¼èåç»§çå个åå§åå¨åå¥è¢«ç¨äºåå§å对象ä¸çåç»æåãç¶èï¼è¥å¯¹è±¡æ¥æä¸å¸¦ä»»ä½æåçåèåä½ï¼ç©ºç»æä½ï¼æåªä¿æéææåçç»æä½ï¼ï¼åä¸å
许æ¶é¤è±æ¬å·èå¿
须使ç¨ä¸ä¸ªç©ºçåµå¥å表 {} ã
ææ´¾åå§åå¨è¯æ³å½¢å¼ (3,4) è¢«ç§°ä¸ºææ´¾åå§åå¨ï¼æ¯ä¸ª ææ´¾ç¬¦ å¿ é¡»æå T çä¸ä¸ªç´æ¥ééææ°æ®æåï¼è表达å¼ä¸æç¨çææ ææ´¾ç¬¦ å¿ é¡»æç §ä¸ T çæ°æ®æåç¸åç顺åºåºç°ã struct A { int x; int y; int z; }; A a{.y = 2, .x = 1}; // éè¯¯ï¼ææ´¾ç¬¦ç顺åºä¸å¹é 声æé¡ºåº A b{.x = 1, .z = 2}; // OKï¼b.y åå§å为 0 ææ´¾åå§å卿æåçæ¯ä¸ªç´æ¥ééææ°æ®æåï¼ä»å ¶ææ´¾ç¬¦åéç对åºè±æ¬å·æçå·åå§åå¨åå§åãç¦æ¢çªå转æ¢ã ææ´¾åå§åå¨å¯ç¨äºå°èåä½åå§åä¸ºå ¶é¦ä¸ªæåä¹å¤çç¶æãåªå¯ä»¥ä¸ºèå使ä¾ä¸ä¸ªåå§åå¨ã union u { int a; const char* b; }; u f = { .b = "asdf" }; // OKï¼èåä½çæ´»è·æå为 b u g = { .a = 1, .b = "asdf" }; // é误ï¼åªå¯æä¾ä¸ä¸ªåå§åå¨ å¯¹äºéèåä½çèåä½ä¸æªæä¾ææ´¾åå§åå¨çå ç´ ï¼æä¸è¿°é对åå§åå¨åå¥çæ°éå°äºæåæ°éæ¶çè§åè¿è¡åå§åï¼è¥æä¾é»è®¤æååå§åå¨å使ç¨å®ï¼å¦å为空å表åå§åï¼ï¼ struct A { string str; int n = 42; int m = -1; }; A{.m=21} // 以 {} åå§å mï¼è°ç¨é»è®¤æé 彿° // ç¶å以 = 42 åå§å n // ç¶å以 = 21 åå§å m è¥ä»¥ææ´¾åå§åå¨åå¥åå§åçèå使¥æä¸ä¸ªå¿åèå使åï¼å对åºçææ´¾åå§åå¨å¿ é¡»æå该å¿åèåä½çæåä¹ä¸ã 注æï¼ä¹±åºçææ´¾åå§åãåµå¥çææ´¾åå§åãææ´¾åå§åå¨ä¸å¸¸è§åå§åå¨çæ··åï¼ä»¥åæ°ç»çææ´¾åå§åå¨ C ç¼ç¨è¯è¨ä¸åæ¯æï¼ä½å¨ C++ ä¸å 许ã struct A { int x, y; }; struct B { struct A a; }; struct A a = {.y = 1, .x = 2}; // åæ³ Cï¼éæ³ C++ï¼ä¹±åºï¼ int arr[3] = {[1] = 5}; // åæ³ Cï¼éæ³ C++ï¼æ°ç»ï¼ struct B b = {.a.x = 0}; // åæ³ Cï¼éæ³ C++ï¼åµå¥ï¼ struct A a = {.x = 1, 2}; // åæ³ Cï¼éæ³ C++ï¼æ··åï¼ |
(C++20 èµ·) |
å符æ°ç»
å符类åï¼charãsigned charãunsigned charãchar8_tãchar16_tãchar32_tãwchar_tï¼çæ°ç»å¯ä»¥ä»éå½çå符串åé¢éåå§åï¼å¯éå°ä»¥è±æ¬å·ç¯ç»ãå符串åé¢éçç¸ç»§å符ï¼å
å«éå«çç©ºç»æ¢å符ï¼åå§ååæ°ç»å
ç´ ãè¥æå®äºæ°ç»å¤§å°ï¼ä¸å®å¤§äºå符串åé¢éä¸çå符æ°ï¼åå©ä½å符被é¶åå§åã
char a[] = "abc"; // çä»·äº char a[4] = {'a', 'b', 'c', '\0'};  // unsigned char b[3] = "abc"; // é误ï¼åå§åå¨åç¬¦ä¸²å¤ªé¿ unsigned char b[5]{"abc"}; // çä»·äº unsigned char b[5] = {'a', 'b', 'c', '\0', '\0'};  wchar_t c[] = {L"коÑка"}; // å¯éçè±æ¬å· // çä»·äº wchar_t c[6] = {L'к', L'о', L'Ñ', L'к', L'а', L'\0'};
注解
èåç±»ææ°ç»å¯ä»¥å å«éèåçå ¬å¼åºç±»ã (C++17 èµ·)æåæå ç´ ï¼å®ä»¬ä»¥ä¸è¿°æ¹å¼åå§åï¼ä¾å¦ä»å¯¹åºçåå§åå¨åå¥å¤å¶åå§åï¼
C++11 åï¼èååå§å䏿¾å 许çªå转æ¢ï¼ä½å®ä»¬ä¸åå¾å°å 许ï¼ä½ä» C++20 èµ·èååå§å使ç¨åæ¬å·æ¶å 许å®ä»¬ã
C++11 åï¼å ä¸ºè¯æ³éå¶ï¼èååå§åä¸è½ç¨äºæé 彿°åå§åå¨å表ã
C++14 åï¼ç´æ¥åå§åçå½¢å¼ T a {args..} ä¸å è®¸è±æ¬å·æ¶é¤ã
C ä¸ï¼é¿åº¦æ¯å符串åé¢éç大å°å°ä¸çå符æ°ç»å¯ä»¥ä»å符串åé¢éåå§åï¼äº§ççæ°ç»æ¯æ²¡æç©ºç»æ¢çãè¿å¨ C++ ä¸ä¸å 许ã
示ä¾
#include <string> #include <array> struct S { int x; struct Foo { int i; int j; int a[3]; } b; };  union U { int a; const char* b; };  int main() { S s1 = { 1, { 2, 3, {4, 5, 6} } }; S s2 = { 1, 2, 3, 4, 5, 6}; // ç¸åï¼ä½æè±æ¬å·æ¶é¤ S s3{1, {2, 3, {4, 5, 6} } }; // ç¸åï¼ä½¿ç¨ç´æ¥å表åå§åè¯æ³ S s4{1, 2, 3, 4, 5, 6}; // C++11 ä¸é误ï¼è±æ¬å·æ¶é¤ä» å 许ä¸çå·ä¸èµ·ä½¿ç¨ // C++14 ä¸ OK  int ar[] = {1,2,3}; // ar 为 int[3] int ab[] (1, 2, 3); // (C++20) ab 为 int[3] // char cr[3] = {'a', 'b', 'c', 'd'}; // è¿å¤åå§åå¨åå¥ char cr[3] = {'a'}; // æ°ç»åå§å为 {'a', '\0', '\0'}  int ar2d1[2][2] = {{1, 2}, {3, 4}}; // å®å ¨è±æ¬å·ç 2D æ°ç»ï¼ {1, 2} // {3, 4} int ar2d2[2][2] = {1, 2, 3, 4}; // è±æ¬å·æ¶é¤ï¼ {1, 2} // {3, 4} int ar2d3[2][2] = {{1}, {2}}; // ä» ç¬¬ä¸åï¼ {1, 0} // {2, 0}  std::array<int, 3> std_ar2{ {1,2,3} }; // std::array æ¯èåä½ std::array<int, 3> std_ar1 = {1, 2, 3}; // è±æ¬å·æ¶é¤ OK  int ai[] = { 1, 2.0 }; // ä» double å° int ççªå转æ¢ï¼ // C++11 ä¸é误ï¼C++03 ä¸ OK  std::string ars[] = {std::string("one"), // å¤å¶åå§å "two", // 转æ¢ï¼ç¶åå¤å¶åå§å {'t', 'h', 'r', 'e', 'e'} }; // å表åå§å  U u1 = {1}; // OKï¼èåä½é¦æå // U u2 = { 0, "asdf" }; // é误ï¼èåä½çè¿å¤åå§åå¨ // U u3 = { "asdf" }; // é误ï¼å° int çè½¬æ¢æ æ  }  // èåä½ struct base1 { int b1, b2 = 42; }; // éèåä½ struct base2 { base2() : b3(42) {} int b3; }; // C++17 ä¸ä¸ºèåä½ struct derived : base1, base2 { int d; }; derived d1{ {1, 2}, { }, 4}; // d1.b1 = 1, d1.b2 = 2, d1.b3 = 42, d1.d = 4 derived d2{ { }, { }, 4}; // d2.b1 = 0, d2.b2 = 42, d2.b3 = 42, d2.d = 4