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++ è¯è¨ > ééææ°æ®æå
ééææ°æ®æå
ééææ°æ®æåæ¯å¨ç±»çæå说æä¸å£°æçã
class S { int n; // ééææ°æ®æå int& r; // å¼ç¨ç±»åçééææ°æ®æå int a[2] = {1, 2}; // 带é»è®¤æååå§åå¨çééææ°æ®æå (C++11) std::string s, *ps; // 两个ééææ°æ®æå struct NestedS { std::string s; } d5; // å ·æåµå¥ç±»åçééææ°æ®æå char bit : 2; // 2 ä½çä½å };
å 许任ä½ç®å声æï¼ä½
- ä¸å è®¸ä½¿ç¨ extern å register åå¨ç±»è¯´æç¬¦ï¼
- ä¸å è®¸ä½¿ç¨ thread_local åå¨ç±»è¯´æç¬¦ï¼ä½å 许 static æ°æ®æåï¼ï¼
- ä¸å
许ä¸å®æ´ç±»åãæ½è±¡ç±»ç±»ååå
¶æ°ç»ï¼é常ï¼ç±»
Cä¸è½æ¥æCç±»åçééææ°æ®æåï¼å°½ç®¡å®è½æ¥æC&ï¼C çå¼ç¨ï¼æC*ï¼C çæéï¼ç±»åçééææ°æ®æåï¼ - å½åå¨è³å°ä¸ä¸ªç¨æ·å®ä¹çæé 彿°æ¶ï¼ééææ°æ®æåä¸è½æ¥æä¸ç±»åç¸åçååï¼
- auto 说æç¬¦ä¸è½ç¨äºééææ°æ®æåç声æï¼å°½ç®¡å¯¹äºäºç±»å®ä¹ä¸åå§åçéææ°æ®æåæ¯å 许çï¼ã
å¦å¤ï¼å 许ä½å声æã
å¸å±
å½å建æä¸ªç±» C ç对象æ¶ï¼æ¯ä¸ªéå¼ç¨ç±»åçééææ°æ®æåé½è¢«åé
äº C ç对象表示çæä¸ªé¨åä¹ä¸ãå¼ç¨æ¯å¦å æ®ä»»ä½å卿¯ç±å®ç°å®ä¹çï¼ä½å
¶å卿ä¸ä»¥å®ä»¬ä½ä¸ºæåç对象ç¸åã
对äºéèåä½ç±»ç±»åï¼æ¥æç¸åæå访é®åéé¶å¤§å° (C++20 èµ·)çæåï¼å§ç»æç §è¾å声æçæåå¨ç±»å¯¹è±¡ä¸æ¥æè¾é«å°åçæ¹å¼åé ãæ¥æä¸åè®¿é®æ§å¶çæåä»¥æªææç顺åºåé ï¼ç¼è¯å¨å¯ä»¥å°å®ä»¬ç»åå¨ä¸èµ·ï¼ã对é½è¦æ±å¯è½éè¦å¨æåé´ï¼æå¨ç±»çæåæåä¹åè¿è¡å¡«å ã
æ åå¸å±
ææééææ°æ®æå忥æç¸åè®¿é®æ§å¶ï¼ä¸æ»¡è¶³å ¶ä»ç¹å®æ¡ä»¶çç±»è¢«ç§°ä½æ åå¸å±ï¼standard layoutï¼ç±»åï¼å¯¹å ¶è§å®çåè¡¨è§æ åå¸å±ç±»å (StandardLayoutType) ï¼ã
两个æ åå¸å±éèå类类åå¯ä»¥æ¥æééææ°æ®æååä½å (C++14 èµ·)çå
±åèµ·å§åºåï¼å
¶ä¸ºä¸æå¤ä¸ªèµ·å§æåï¼æå£°æé¡ºåºï¼çåºåï¼æ¡ä»¶æ¯è¿äºæåæ¥æå¸å±å
¼å®¹çç±»åï¼åå£°ææ [[no_unique_address]] 屿§ææ è¯¥å±æ§ (C++20 èµ·)ï¼ä¸å½å®ä»¬æ¯ä½åæ¶æ¥æç¸å宽度 (C++14 èµ·)ã
struct A { int a; char b; }; struct B { const int b1; volatile char b2; }; // A ä¸ B çå ±åèµ·å§åºåæ¯ A.a, A.b ä¸ B.b1, B.b2 struct C { int c; unsigned : 0; char b; }; // A ä¸ C çå ±åèµ·å§åºåæ¯ A.a ä¸ C.c struct D { int d; char b : 4; }; // A ä¸ D çå ±åèµ·å§åºåæ¯ A.a ä¸ D.d struct E { unsigned int e; char b; }; // A ä¸ E çå ±åèµ·å§åºå为空
è¥ä¸¤ä¸ªæ åå¸å±éèå类类åå
·æåä¸ç±»åï¼è¥åå¨ cv éå®ç¬¦å忽ç¥ï¼ (C++14 èµ·)ï¼ææ¯å¸å±å
¼å®¹çæä¸¾ï¼å³æ¥æç¸ååºå±ç±»åçæä¸¾ç±»åï¼ï¼æå
¶å
±åèµ·å§åºåç±å
¶ææééææ°æ®æååä½å (C++14 èµ·)ç»æï¼åç§°å®ä»¬å¸å±å
¼å®¹ï¼layout compatibleï¼ï¼ä¸ä¾ä¸ï¼A ä¸ B å¸å±å
¼å®¹ï¼
è¥ä¸¤ä¸ªæ åå¸å±èåä½ç±»åæ¥æç¸åæ°éçééææ°æ®æåï¼ä¸ï¼ä»¥ä»»ä½é¡ºåºï¼å¯¹åºçééææ°æ®æåæ¥æå¸å±å ¼å®¹çç±»åï¼åç§°å®ä»¬å¸å±å ¼å®¹ã
æ åå¸å±ç±»åæ¥æä»¥ä¸ç¹æ®æ§è´¨ï¼
|
(C++14 å) |
|
(C++14 èµ·) |
- æåæ åå¸å±ç±»ç±»åçæéå¯è¢«
reinterpret_castææåå ¶é¦ä¸ªééæéä½åæ°æ®æåçæéï¼è¥å®æ¥æééææ°æ®æåï¼ï¼ææåå ¶ä»»ä½åºç±»å对象çæéï¼è¥æåºç±»ï¼ï¼åä¹äº¦ç¶ãæ¢è¨ä¹ï¼ä¸å 许æ åå¸å±ç±»åçé¦ä¸ªæ°æ®æååæå¡«å ãæ³¨æä¸¥æ ¼å«ååè§åä»ç¶éç¨äºè¿ç§è½¬åçç»æã - å® offsetof å¯ç¨äºç¡®å®ä»»ä½æåè·æ åå¸å±ç±»èµ·å§çåç§»éã
- æåæ åå¸å±ç±»ç±»åçæéå¯è¢«
æååå§å
ééææ°æ®æåå¯ä»¥ç¨ä¸åä¸¤ç§æ¹å¼ä¹ä¸åå§åï¼
struct S { int n; std::string s; S() : n(7) // ç´æ¥åå§å n ï¼é»è®¤åå§å s { } };
|
2) éè¿é»è®¤æååå§åå¨ï¼å®æ¯å
å«äºæå声æä¸çè±æ¬å·æçå·åå§åå¨ï¼å¹¶å¨æååå§åå¨å表ä¸å¿½ç¥è¯¥æåçæ
åµä¸å¾å°ä½¿ç¨
struct S { int n = 7; std::string s{'a', 'b', 'c'}; S() // é»è®¤æååå§åå¨å°å¤å¶åå§å n ï¼å表åå§å s { } }; è¥æåæ¥æé»è®¤æååå§åå¨ï¼å¹¶ä¸äº¦åºç°äºæé 彿°çæååå§åå¨å表ä¸ï¼å对该æé 彿°å¿½ç¥é»è®¤æååå§åå¨ã è¿è¡æ¤ä»£ç #include <iostream>  int x = 0; struct S { int n = ++x; S() { } // 使ç¨é»è®¤æååå§åå¨ S(int arg) : n(arg) { } // ä½¿ç¨æååå§åå¨ };  int main() { std::cout << x << '\n'; // æå° 0 S s1; std::cout << x << '\n'; // æå° 1ï¼è¿è¡é»è®¤åå§åå¨ï¼ S s2(7); std::cout << x << '\n'; // æå° 1ï¼æªè¿è¡é»è®¤åå§åå¨ï¼ } è¾åºï¼ 0 1 1
æ°ç»ç±»åæåä¸è½ä»æååå§å卿¨å¯¼å ¶å¤§å°ï¼ struct X { int a[] = {1,2,3}; // é误 int b[3] = {1,2,3}; // OK }; é»è®¤æååå§åå¨ä¸å 许导è´å¤å´ç±»çé¢ç½®é»è®¤æé 彿°çéå¼å®ä¹ï¼æè¯¥æé 彿°çå¼å¸¸è¯´æ: struct node { node* p = new node; // é误ï¼ä½¿ç¨é弿é¢ç½®ç node::node() }; |
(C++11 èµ·) | ||
|
å¨é»è®¤æååå§åå¨ä¸ï¼å¼ç¨æåä¸è½ç»å®å°ä¸´æ¶éï¼æ³¨æï¼æååå§åå¨å表æåæ ·çè§åï¼ struct A { A() = default; // OK A(int v) : v(v) { } // OK const int& v = 42; // OK }; A a1; // é误ï¼ä¸´æ¶éå°å¼ç¨çéè¯æç»å® A a2(1); // OKï¼å¿½ç¥é»è®¤æååå§åå¨ï¼å 为 v åºç°äºæé 彿°ä¸ï¼ // ç¶è a2.v æ¯æ¬åå¼ç¨ è¥é»è®¤æååå§å卿¥æä¼æ§è¡èååå§åå¹¶ä¼ä½¿ç¨åä¸åå§åå¨çå表达å¼ï¼å产çéè¯¯ï¼ struct A; extern A a; struct A { const A& a1{ A{a, a} }; // OK const A& a2{ A{} }; // é误 }; A a{a, a}; // OK |
(C++14 èµ·) |
ç¨æ³
ééææ°æ®æåæééææå彿°çåååªè½åºç°å¨ä¸åä¸ç§æ å½¢ä¸ï¼
this-> æå访é®è¡¨è¾¾å¼ã
struct S { int m; int n; int x = m; // OKï¼å¨é»è®¤åå§åå¨ä¸å 许éå¼ç this-> (C++11) S(int i) : m(i), n(m) // OKï¼å¨æååå§åå¨å表ä¸å 许éå¼ç this-> { this->f(); // æ¾å¼çæå访é®è¡¨è¾¾å¼ f(); // 卿å彿°ä½å å 许éå¼ this-> } void f(); };
struct S { int m; void f(); }; int S::*p = &S::m; // OKï¼m ç¨äºæææåæé void (S::*fp)() = &S::f; // OKï¼f ç¨äºæææåæé
|
3) ï¼ä»
å¯¹æ°æ®æåï¼èéæå彿°ï¼å½å¨ä¸æ±å¼æä½æ°ä¸ä½¿ç¨æ¶ã
struct S { int m; static const std::size_t sz = sizeof m; // OKï¼ä¸æ±å¼æä½æ°ä¸ç m }; std::size_t j = sizeof(S::m + 42); // OKï¼å³ä¾¿æ²¡æ m ç "this" 对象 |
(C++03 èµ·) |
ç¼ºé·æ¥å
ä¸åæ´æ¹è¡ä¸ºçç¼ºé·æ¥å追溯å°åºç¨äºä»¥ååºçç C++ æ åã
| DR | åºç¨äº | åºçæ¶çè¡ä¸º | æ£ç¡®è¡ä¸º |
|---|---|---|---|
| CWG 613 | C++03 | ä¸å 许ééææ°æ®æåç䏿±å¼ä½¿ç¨ | å 许è¿ç§ä½¿ç¨ |
| CWG 1696 | C++14 | å¼ç¨æåè½åå§å为临æ¶éï¼å ¶çåæä¼å¨æé 彿°ç»ææ¶ç»æï¼ | è¿ç§åå§åéè¯æ |
| CWG 1397 | C++11 | å¨é»è®¤æååå§åå¨ä¸ç±»è¢«è§ä¸ºå®æ´ç | é»è®¤æååå§åä¸è½è§¦åé»è®¤æé 彿°çå®ä¹ |
| CWG 1719 | C++14 | cv é宿æä¸åçç±»åæ¾ç»ä¸æ¯å¸å±å ¼å®¹ç | å¿½ç¥ cv éå®ï¼æ¹è¿è§è |
| CWG 2254 | C++14 | æåæ æ°æ®æåçæ åå¸å±ç±»çæéè½ reinterpret_cast å°å ¶é¦ä¸ªåºç±» | è½ reinterpret_cast å°å ¶ä»»ä½åºç±» |