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 T T T |
(1) | ||||||||
|
T T T T |
(2) | (C++11 èµ·) | |||||||
ç»å® R fn ( T & arg ); æ R fn ( T && arg );
fn fn |
(3) | ||||||||
T & fn () æ T && fn () å
|
(4) | ||||||||
ç»å® Class å
ç T & ref ; æ T && ref ;
Class |
(5) | ||||||||
è§£é
è½ä»¥ T ç±»åç对象ãT ç±»åç彿°æå¯éå¼è½¬æ¢å° T ç对象ï¼åå§å T çå¼ç¨ã䏿¦åå§åï¼åä¸è½æ´æ¹å¼ç¨ä½¿ä¹å¼ç¨å¦ä¸å¯¹è±¡ã
å¨ä¸åæ å½¢åå§åå¼ç¨ï¼
å¼ç¨åå§åçæææ¯ï¼
- è¥åå§å卿¯è±æ¬å·åå§åå¨å表
{arg1, arg2, ...}ï¼åéµå¾ªå表åå§åã
- å¦åï¼è¥å¼ç¨æ¯å·¦å¼å¼ç¨ï¼
- è¥ object æ¯å·¦å¼è¡¨è¾¾å¼ï¼ä¸å
¶ç±»å为
Tææ´¾çäºTï¼è䏿ç¸çææ´å°ç cv éå®ï¼åå¼ç¨è¢«ç»å®å°å·¦å¼è¡¨è¾¾å¼ææ è¯ç对象æå ¶åºç±»å对象ã
- è¥ object æ¯å·¦å¼è¡¨è¾¾å¼ï¼ä¸å
¶ç±»å为
double d = 2.0; double& rd = d; // rd å¼ç¨ d const double& rcd = d; // rcd å¼ç¨ d struct A {}; struct B : A {} b; A& ra = b; // ra å¼ç¨ b ä¸ç A å对象 const A& rca = b; // rca å¼ç¨ b ä¸ç A å对象
- å¦åï¼è¥ object çç±»åä¸
Tä¸ç¸åä¸ä¸ä»å®æ´¾çï¼è object æ¥æå°å·¦å¼ç转æ¢å½æ°ï¼å ¶ç±»å为Tææ´¾çäºTå¹¶æç¸çææ´å°ç cv éå®ï¼åç»å®å¼ç¨å°è½¬æ¢å½æ°æè¿åç左弿æ è¯çå¯¹è±¡ï¼æå°å ¶åºç±»å对象ï¼ã
- å¦åï¼è¥ object çç±»åä¸
struct A {}; struct B : A { operator int&(); }; int& ir = B(); // ir æä»£ B::operator int& çç»æ
- å¦åï¼è¥å¼ç¨æ¯ const çå·¦å¼å¼ç¨æå³å¼å¼ç¨ (C++11 èµ·)ï¼
- è¥ object æ¯éä½åå³å¼æå½æ°å·¦å¼ï¼ä¸å
¶ç±»åæ¯
Tææ´¾çäºTï¼æ¥æç¸çææ´å° cv éå®ï¼åç»å®å¼ç¨å°åå§åå¨è¡¨è¾¾å¼çå¼æå ¶åºç±»å对象ï¼ç»å®è´¨å临æ¶éä¹åï¼è¥éè¦ï¼ (C++17 èµ·)ã
- è¥ object æ¯éä½åå³å¼æå½æ°å·¦å¼ï¼ä¸å
¶ç±»åæ¯
struct A {}; struct B : A {}; extern B f(); const A& rca2 = f(); // å° B å³å¼ç A å对象ã A&& rra = f(); // åä¸ Â int i2 = 42; int&& rri = static_cast<int&&>(i2); // ç´æ¥ç»å®å° i2
- å¦åï¼è¥ object çç±»åä¸åäº
Tä¸ä¸ä»å®æ´¾çï¼è object æ¥æå°å³å¼æå½æ°å·¦å¼ç转æ¢å½æ°ï¼å ¶ç±»å为Tæä»Tæ´¾çï¼ä¸æ¥ææç¸çææ´å°ç cv éå®ï¼åç»å®å¼ç¨å°è½¬æ¢å½æ°çç»ææå°å ¶åºç±»å对象ï¼å¨å®è´¨å临æ¶éåï¼è¥éè¦ï¼ (C++17 èµ·)ã
- å¦åï¼è¥ object çç±»åä¸åäº
struct A {}; struct B : A {}; struct X { operator B(); } x; const A& r = x; // ç»å®å°è½¬æ¢ç»æç A å对象 B&& rrb = x; // ç´æ¥ç»å®å°è½¬æ¢çç»æ
- å¦åï¼å° object éå¼è½¬æ¢ä¸º
Tãç»å®å¼ç¨å°è½¬æ¢ï¼å¨å®è´¨å临æ¶éåï¼ (C++17 èµ·)çç»æãè¥ objectï¼æè¥ç±ç¨æ·å®ä¹è½¬æ¢å½æ°è¿è¡è½¬æ¢ï¼å为转æ¢å½æ°çç»æï¼ç±»å为Tææ´¾çäºTï¼åå®å¿ é¡»æ¥æçäºæå°äºTç cv éå®ï¼èè¥å¼ç¨ä¸ºå³å¼å¼ç¨ï¼åå®å¿ 须䏿¯å·¦å¼ (C++11 èµ·)ã
- å¦åï¼å° object éå¼è½¬æ¢ä¸º
struct A { operator volatile int&(); } a; struct B { operator int&(); } b; const int& r = a; // é误ï¼ä¸è½ä»è½¬æ¢ç»æç´æ¥åå§å r ï¼ // å 为转æ¢ç»ææ¥æç±»å "volatile int&" int&& r2 = b; // é误ï¼è½¬æ¢ç»ææ¥æç±»å "int&"  const std::string& rs = "abc"; // rs æä»£ä»å符æ°ç»å¤å¶åå§åç临æ¶é const double& rcd2 = 2; // rcd2 æä»£å¼ä¸º 2.0 ç临æ¶é int i3 = 2; double&& rrd3 = i3; // rrd3 æä»£å¼ä¸º 2.0 ç临æ¶é
临æ¶éçåæ
䏿¦å¼ç¨è¢«ç»å®å°ä¸´æ¶éæå ¶å对象ï¼ä¸´æ¶éççåæå°±è¢«å»¶ç»ä»¥å¹é å¼ç¨ççåæï¼ä½æä¸åä¾å¤ï¼
- return è¯å¥ä¸ç»å®å°å½æ°è¿åå¼ç临æ¶éä¸è¢«å»¶ç»ï¼å®ç«å³äºè¿å表达å¼çæ«å°¾éæ¯ãè¿ç§å½æ°å§ç»è¿åæ¬åå¼ç¨ã
|
(C++14 å) |
- å¨å½æ°è°ç¨ä¸ç»å®å°å½æ°å½¢åç临æ¶éï¼åå¨å°å«è¿æ¬¡å½æ°è°ç¨çå ¨è¡¨è¾¾å¼ç»å°¾ä¸ºæ¢ï¼è¥å½æ°è¿åä¸ä¸ªå¼ç¨ï¼èå ¶çå½é¿äºå ¨è¡¨è¾¾å¼ï¼åå®å°æä¸ºæ¬åå¼ç¨ã
- ç»å®å° new 表达å¼ä¸æç¨çåå§åå¨ä¸çå¼ç¨ç临æ¶éï¼åå¨å°å«è¯¥ new 表达å¼çå ¨è¡¨è¾¾å¼ç»å°¾ä¸ºæ¢ï¼èé被åå§å对象çå卿é´ãè¥è¢«åå§å对象ç声æé¿äºå ¨è¡¨è¾¾å¼ï¼åå ¶å¼ç¨æåå°æä¸ºæ¬åå¼ç¨ã
struct A { int&& r; }; A a1{7}; // OKï¼å»¶ç»çåæ A a2(7); // è¯æï¼ä½ææ¬åå¼ç¨ |
(C++20 èµ·) |
æ»èè¨ä¹ï¼ä¸´æ¶éççåæä¸è½ä»¥è¿ä¸æ¥âä¼ éâæ¥å»¶ç»ï¼ä»ç»å®äºè¯¥ä¸´æ¶éçå¼ç¨åå§åç第äºå¼ç¨ä¸å½±å临æ¶éççåæã
注解
ä»
å¨å½æ°å½¢å声æï¼å½æ°è¿åç±»å声æï¼ç±»æå声æï¼ä»¥å带 extern 说æç¬¦æ¶ï¼å¼ç¨å¯ä»¥ä¸ä¸åå§åå¨ä¸ååºç°ã
示ä¾
#include <utility> #include <sstream> struct S { int mi; const std::pair<int,int>& mp; // å¼ç¨æå };  void foo(int) {}  struct A {}; struct B : A { int n; operator int&() { return n; }; };  B bar() {return B(); }  //int& bad_r; // éè¯¯ï¼æ åå§åå¨ extern int& ext_r; // OK  int main(){ // å·¦å¼ int n = 1; int& r1 = n; // å°å¯¹è±¡ n çå·¦å¼å¼ç¨ const int& cr(n); // å¼ç¨å¯ä»¥ææ´å¤ cv éå® volatile int& cv{n}; // å¯ä½¿ç¨ä»»ä½åå§åå¨è¯æ³ int& r2 = r1; // å¦ä¸å°å¯¹è±¡ n çå·¦å¼å¼ç¨ // int& bad = cr; // éè¯¯ï¼æ´å° cv éå® int& r3 = const_cast<int&>(cr); // éè¦ const_cast  void (&rf)(int) = foo; // å°å½æ°çå·¦å¼å¼ç¨ int ar[3]; int (&ra)[3] = ar; // å°æ°ç»çå·¦å¼å¼ç¨  B b; A& base_ref = b; // å°åºç±»å对象çå·¦å¼å¼ç¨ int& converted_ref = b; // å°è½¬æ¢ç»æçå·¦å¼å¼ç¨  // å³å¼ // int& bad = 1; // é误ï¼ä¸è½ç»å®å·¦å¼å¼ç¨å°å³å¼ const int& cref = 1; // ç»å®å°å³å¼ int&& rref = 1; // ç»å®å°å³å¼  const A& cref2 = bar(); // å° B 临æ¶éç A å对象çå¼ç¨ A&& rref2 = bar(); // ç¸å  int&& xref = static_cast<int&&>(n); // ç´æ¥ç»å®å° n // int&& copy_ref = n; // é误ï¼ä¸è½ç»å®å°å·¦å¼ double&& copy_ref = n; // ç»å®å°å¼ä¸º 1.0 çå³å¼ä¸´æ¶é  // 临æ¶éçåæä¸çéå¶ std::ostream& buf_ref = std::ostringstream() << 'a'; // ostringstream 临æ¶é // 被ç»å®å° operator<< çå·¦è¿ç®æ°ï¼ä½å ¶çåæå¨åå·ç»æï¼ // æ buf_ref 为æ¬åå¼ç¨ã  S a { 1, {2, 3} }; // ç»å®ä¸´æ¶é pair {2,3} å°å¼ç¨æå a.mp å¹¶å»¶é¿å ¶çåæä»¥å¹é a S* p = new S{ 1, {2, 3} }; // ç»å®ä¸´æ¶é pair {2,3} å°å¼ç¨æå p->mp ï¼ // ä½å ¶çåæå¨åå·ç»æ // p->mp æ¯æ¬åå¼ç¨ delete p; }