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++ è¯è¨ > ä½ç¨å
ä½ç¨å
C++ ç¨åºä¸åºç°çæ¯ä¸ªååï¼åªå¨æäºå¯è½ä¸è¿ç»çæºç é¨å䏿æï¼è¿äºé¨åè¢«ç§°ä¸ºå ¶ä½ç¨åã
å¨ä½ç¨åå ï¼è½ç¨æ éå®å忥æ¾å°ååä¸å ¶å£°æå ³èèµ·æ¥ã
åä½ç¨å
åï¼å¤åè¯å¥ï¼ä¸ç声ææå¼å ¥çåéçæ½å¨ä½ç¨åï¼å¼å§äºå ¶å£°æç¹å¹¶ç»æ¢äºè¯¥åæ«å°¾ãå®é ä½ç¨å䏿½å¨ä½ç¨åç¸åï¼é¤éæå åµå带æå¼å ¥äºç¸åååç声æï¼è¿ç§æ åµä¸ï¼ä»å¤å±å£°æçä½ç¨å䏿餿åµå¥å£°æçæ´ä¸ªæ½å¨ä½ç¨åï¼ã
int main() { int a = 0; // 第ä¸ä¸ª 'a' çä½ç¨åå¼å§ ++a; // åå 'a' å¨ä½ç¨åä¸å¹¶æä»£ç¬¬ä¸ä¸ª 'a' { int a = 1; // 第äºä¸ª 'a' çä½ç¨åå¼å§ // 第ä¸ä¸ª 'a' çä½ç¨åé´æ a = 42; // 'a' å¨ä½ç¨åä¸å¹¶æä»£ç¬¬äºä¸ª 'a' } // åç»æï¼ç¬¬äºä¸ª 'a' çä½ç¨åç»æ // 第ä¸ä¸ª 'a' çä½ç¨åæ¢å¤ } // åç»æï¼ç¬¬ä¸ä¸ª 'a' çä½ç¨åç»æ int b = a; // é误ï¼åå 'a' ä¸å¨ä½ç¨åä¸
声æäºå¼å¸¸å¤çåä¸çååçæ½å¨ä½ç¨åå¼å§äºå ¶å£°æç¹ï¼å¹¶å¨è¯¥å¼å¸¸å¤çåç»ææ¶ç»æï¼èä¸å¨å ¶ä»å¼å¸¸å¤çåæå¤å´åä¸ä¸å¨ä½ç¨åä¸ã
try { f(); } catch(const std::runtime_error& re) { // re çä½ç¨åå¼å§ int n = 1; // n çä½ç¨å¼å§ std::cout << re.what(); // re å¨ä½ç¨åä¸ } // re çä½ç¨åç»æï¼ n çä½ç¨åç»æ catch(std::exception& e) { std::cout << re.what(); // éè¯¯ï¼ re ä¸å¨ä½ç¨åä¸ ++n; // éè¯¯ï¼ n ä¸å¨ä½ç¨åä¸ }
å¨ for 循ç¯çåå§åè¯å¥ä¸ï¼å¨ for 循ç¯çæ¡ä»¶ä¸ï¼å¨èå´ for 循ç¯çèå´å£°æä¸ï¼å¨ if è¯å¥æ switch è¯å¥çåå§åè¯å¥ä¸ï¼ (C++17 èµ·)å¨ if è¯å¥ãwhile å¾ªç¯æ switch è¯å¥çæ¡ä»¶ä¸ï¼å£°æçååçæ½å¨ä½ç¨åï¼å¼å§äºå ¶å£°æç¹ï¼å¹¶ç»æäºæ§å¶è¯å¥çæ«å°¾ã
Base* bp = new Derived; if(Derived* dp = dynamic_cast<Derived*>(bp)) { dp->f(); // dp å¨ä½ç¨åä¸ } // dp çä½ç¨åç»æ  for(int n = 0; // n çä½ç¨åå¼å§ n < 10; // n å¨ä½ç¨åä¸ ++n) // n å¨ä½ç¨åä¸ { std::cout << n << ' '; // n å¨ä½ç¨åä¸ } // n çä½ç¨åç»æ
彿°å½¢åä½ç¨å
彿°å½¢åï¼å æ¬ lambda 表达å¼çå½¢åï¼æå½æ°å±é¨é¢å®ä¹åéçæ½å¨ä½ç¨åå¼å§äºå ¶å£°æç¹ã
- è¥æå å±çå¤å´å½æ°å£°æç¬¦ä¸æ¯å½æ°å®ä¹ç声æç¬¦ï¼åå ¶æ½å¨ä½ç¨åç»æ¢äºè¯¥å½æ°å£°æç¬¦çç»å°¾ã
- å¦åï¼å ¶æ½å¨ä½ç¨åç»æ¢äºå½æ° try åçæåå¼å¸¸å¤çåçæ«å°¾ï¼æè¥ä¸ä½¿ç¨å½æ° try ååä¸ºå½æ°ä½çæ«å°¾ã
const int n = 3;  int f1(int n, // å ¨å± 'n' çä½ç¨åé´æ // åæ° 'n' çä½ç¨åå¼å§ int y = n); // é误ï¼é»è®¤å®åæ¶æäºå½¢å  int (*(*f2)(int n))[n]; // OK ï¼å½æ°å½¢å 'n' çä½ç¨åç»æ¢äºå ¶å½æ°å£°æç¬¦çæ«å°¾ // æ°ç»å£°æç¬¦ä¸ï¼å ¨å± n å¨ä½ç¨åä¸ // ï¼è¿å£°æäºè¿å int ç 3 å ç´ æ°ç»çæéç彿°çæéï¼ Â // ç¸å auto (*f3)(int n)->int (*)[n]; // é误ï¼ä»¥åæ° 'n' 为æ°ç»è¾¹ç   int f(int n = 2) // 'n' çä½ç¨åå¼å§ try // 彿° try å { // 彿°ä½å¼å§ ++n; // 'n' å¨ä½ç¨åä¸å¹¶æä»£å½æ°å½¢å { int n = 2; // å±é¨åé 'n' çä½ç¨åå¼å§ // 彿°åæ° 'n' çä½ç¨å䏿 ++n; // 'n' 卿¤å䏿代å±é¨åé } // å±é¨åé 'n' çä½ç¨åç»æ // 彿°åæ° 'n' çä½ç¨åæ¢å¤ } catch(...) { ++n; // n å¨ä½ç¨åä¸å¹¶æä»£å½æ°å½¢å throw; } // æåå¼å¸¸å¤çåç»æï¼å½æ°å½¢å 'n' çä½ç¨åç»æ int a = n; // OK ï¼åç§° 'n' å¨ä½ç¨åä¸
彿°ä½ç¨å
声æäºå½æ°å çæ å·ï¼ä¸åªææ å·ï¼ï¼å¨è¯¥å½æ°åå ¶ææå åµä»£ç åçä»»ä½ä½ç½®é½å¨ä½ç¨åä¸ï¼æ 论å¨å ¶èªèº«å£°æçååã
void f() { { goto label; // label å¨ä½ç¨åä¸ï¼å°½ç®¡ä¹åæå£°æ label:; } goto label; // label 忽ç¥åä½ç¨å }  void g() { goto label; // éè¯¯ï¼ g() ä¸ label ä¸å¨ä½ç¨åä¸ }
å½å空é´ä½ç¨å
å½å空é´ä¸å£°æçä»»ä½å®ä½çæ½å¨ä½ç¨ååå¼å§äºå ¶å£°æï¼å¹¶ç±å ¶åçåä¸å½å空é´åçææå½å空é´å®ä¹æ¼åèµ·æ¥ï¼åå ä¸å¯¹äºå°è¿ä¸ªååæå ¶æ´ä¸ªå½å空é´å¼å ¥å°å ¶ä»ä½ç¨åçæ¯ä¸ª using æä»¤æ¥è¯´ï¼å æ¬è¿ä¸ªä½ç¨åçå©ä½é¨åã
ç¿»è¯åå çé¡¶å±ä½ç¨åï¼âæä»¶ä½ç¨åâæâå ¨å±ä½ç¨åâï¼äº¦ä¸ºå½å空é´ï¼è被æ£å¼ç§°ä½âå ¨å±å½å空é´ä½ç¨åâãä»»ä½å£°æäºå ¨å±å½å空é´ä½ç¨åçå®ä½çæ½å¨ä½ç¨ååå¼å§äºå ¶å£°æï¼å¹¶æç»å°ç¿»è¯åå çç»å°¾ã
声æäºæ åå½åç©ºé´æå èå½å空é´çå®ä½çä½ç¨åå æ¬å¤å´å½å空é´ï¼
namespace N { // N çä½ç¨åå¼å§ï¼ä½ä¸ºå ¨å±å½å空é´çæåï¼ int i; // i çä½ç¨åå¼å§ int g(int a) { return a; } // g çä½ç¨åå¼å§ int j(); // j çä½ç¨åå¼å§ void q(); // q çä½ç¨åå¼å§ namespace { int x; // x çä½ç¨åå¼å§ } // x çä½ç¨åä¸ç»æ inline namespace inl { // inl çä½ç¨åå¼å§ int y; // y çä½ç¨åå¼å§ } // y çä½ç¨åä¸ç»æ } // i ã g ã j ã q ã inl ã x ã y çä½ç¨åé´æ  namespace { int l=1; // l çä½ç¨åå¼å§ } // l çä½ç¨åä¸ç»æï¼å®æ¯æ åå½å空é´çæåï¼ Â namespace N { // i ã g ã j ã q ã inl ã x ã y çä½ç¨åæç» int g(char a) { // éè½½ N::g(int) return l+a; // æ¥èªæ åå½å空é´ç l å¨ä½ç¨åä¸ } // int i; // é误ï¼éå¤å®ä¹ï¼ i å·²å¨ä½ç¨åä¸ï¼ int j(); // OK ï¼å 许éå¤ç彿°å£°æ int j() { // OK ï¼å å声æç N::j() çå®ä¹ return g(i); // è°ç¨ N::g(int) } int q(); // éè¯¯ï¼ q å·²å¨ä½ç¨åä¸å¹¶æä¸åçè¿åç±»å } // i ã g ã j ã q ã inl ã x ã y çä½ç¨åé´æ  int main() { using namespace N; // i ã g ã j ã q ã inl ã x ã y çä½ç¨åæ¢å¤ i = 1; // N::i å¨ä½ç¨åä¸ x = 1; // N::(å¿å)::x å¨ä½ç¨åä¸ y = 1; // N::inl::y å¨ä½ç¨åä¸ inl::y = 2; // N::inl 亦å¨ä½ç¨åä¸ } // i ã g ã j ã q ã inl ã x ã y çä½ç¨åé´æ
ç±»ä½ç¨å
ç±»ä¸å£°æçååçæ½å¨ä½ç¨åå¼å§äºå ¶å£°æç¹ï¼å¹¶å å«ç±»ä½çå©ä½é¨å忿彿°ä½ï¼æ 论æ¯å¦å®ä¹äºç±»å®ä¹å¤æå¨è¯¥ååç声æä¹åï¼ãé»è®¤å®åãå¼å¸¸è§å®ãç±»å è±æ¬å·æçå·åå§åå¨ï¼è¿ï¼éå½å°ï¼å æ¬åµå¥ç±»ä¸çææè¿äºå 容ã
class X { int f(int a = n) { // X::n å¨é»è®¤å®åä¸å¨ä½ç¨å return a*n; // X::n å¨å½æ°ä½å å¨ä½ç¨åä¸ } using r = int; r g(); int i = n*2; // X::n å¨åå§åå¨å å¨ä½ç¨åä¸ Â // int x[n]; // éè¯¯ï¼ n å¨ç±»ä½å ä¸å¨ä½ç¨åä¸ static const int n = 1; int x[n]; // OK ï¼ n ç°å¨å¨ç±»ä½å å¨ä½ç¨åä¸ };  //r X::g() { // éè¯¯ï¼ r å¨ç±»å¤æå彿°çä½ç¨åå¤ auto X::g()->r { // OK ï¼å°¾éè¿åç±»å X::r å¨ä½ç¨åä¸ return n; // X::n å¨ç±»å¤æå彿°ä½çä½ç¨åä¸ }
è¥å¨å£°ææä¸ªååä¹åå°±å¨ç±»ä½ä¸ä½¿ç¨ï¼èæè¯¥ååçå¦ä¸å£°æå¨ä½ç¨åä¸ï¼åç¨åºéè¯æï¼ä¸è¦æ±è¯æã
typedef int c; // ::c enum { i = 1 }; // ::i class X { char v[i]; // éè¯¯ï¼æ¤å¤ i æä»£Â ::i ï¼ä½äº¦æ X::i int f() { return sizeof(c); // OK ï¼æå彿°ä½å å¨ä½ç¨åä¸çæ¯ X::c èé ::c } char c; // X::c enum { i = 2 }; // X::i };  typedef char* T; struct Y { T a; // éè¯¯ï¼æ¤å¤ï¼T æä»£Â ::T ï¼ä½äº¦æ Y::T typedef long T; T b; };
ä»»ä½ç±»æåååªè½ç¨äºåç§è¯å¢ä¸ï¼
- å¨å ¶èªèº«çç±»ä½ç¨åæå¨æ´¾çç±»çç±»ä½ç¨åä¹ä¸
- å¨å¯¹å
¶ç±»æå
¶æ´¾çç±»çç±»åç表达å¼è¿ç¨
.è¿ç®ç¬¦ä¹å - å¨å¯¹å
¶ç±»æå
¶æ´¾ççç±»çæéç±»åç表达å¼è¿ç¨
->è¿ç®ç¬¦ä¹å - å¨å¯¹å
¶ç±»æå
¶æ´¾çç±»çååè¿ç¨
::è¿ç®ç¬¦ä¹å
æä¸¾ä½ç¨å
æä½ç¨åæä¸¾ä¸å¼å ¥çæä¸¾é¡¹çååçä½ç¨åå¼å§äºå ¶å£°æç¹ï¼å¹¶ç»æ¢äº enum 说æç¬¦çæ«å°¾ï¼ä¸ä¹ç¸åï¼æ ä½ç¨åæä¸¾é¡¹çä½ç¨åå¨ enum 说æç¬¦çç»å°¾åä»å¨ä½ç¨åä¸ï¼ï¼
enum e1_t { // æ ä½ç¨åæä¸¾ A, B = A*2 }; // A ä¸ B çä½ç¨åä¸ç»æ  enum class e2_t { // æä½ç¨åæä¸¾ SA, SB = SA*2 // SA å¨ä½ç¨åä¸ }; // SA ä¸ SB çä½ç¨åç»æ  e1_t e1 = B; // OK ï¼ B å¨ä½ç¨åä¸ // e2_t e2 = SB; // éè¯¯ï¼ SB ä¸å¨ä½ç¨åä¸ e2_t e2 = e2_t::SB; // OK
模æ¿å½¢åä½ç¨å
模æ¿å½¢ååçæ½å¨ä½ç¨åç´æ¥å¼å§äºå ¶å£°æç¹ï¼å¹¶æç»å°äºå ¶ä¸å¼å ¥äºå®çæå°æ¨¡æ¿å£°æçæ«å°¾ãå ·ä½èè¨ï¼æ¨¡æ¿å½¢åè½ç¨äºå ¶åçæ¨¡æ¿å½¢åç声æï¼ååºç±»çæå®ï¼ä½ä¸è½ç¨äºå ¶åçæ¨¡æ¿å½¢åç声æã
template< typename T, // T çä½ç¨åå¼å§ T* p, // T è½ç¨ç¨äºéç±»åå½¢å class U = T // T è½ç¨ä½é»è®¤ç±»å > class X : public Array<T> // T è½ç¨äºåºç±»å { // T è¿è½å¨ä½å ä½¿ç¨ }; // T ä¸ U çä½ç¨åç»æï¼ X çä½ç¨åæç»
æ¨¡æ¿æ¨¡æ¿å½¢åçå½¢ååçæ½å¨ä½ç¨åï¼æ¯è¯¥åååºç°äºå ¶ä¸çæå°æ¨¡æ¿å½¢åå表
template< template< // æ¨¡æ¿æ¨¡æ¿å½¢å typename Y, // Y çä½ç¨åå¼å§ typename G = Y // Y å¨ä½ç¨åä¸ > // Y ä¸ G çä½ç¨åç»æ class T, // typename U = Y // éè¯¯ï¼ Y ä¸å¨ä½ç¨åä¸ typename U > class X { }; // T ä¸ U çä½ç¨åç»æ
ä¸å ¶ä»åµå¥ä½ç¨åç±»ä¼¼ï¼æ¨¡æ¿å½¢ååå¨å ¶èªèº«çæç»æé´éèæ¥èªå¤å±ä½ç¨åçç¸åååï¼
typedef int N; template< N X, // int ç±»åçéç±»åæ¨¡æ¿å½¢å typename N, // æ¤ N çä½ç¨åå¼å§ï¼ææÂ ::N çä½ç¨å template<N Y> class T // æ¤å¤ç N æ¯æ¨¡æ¿å½¢åï¼é int > struct A;
声æç¹
ä½ç¨åå§äºå£°æç¹ï¼å®å®ä½å¦ä¸ï¼
对äºç®å声ææå¼å ¥çåéåå ¶ä»ååï¼å£°æç¹ç´§é该ååç声æç¬¦ä¹åï¼ä¸å¨å ¶åå§åå¨ä¹åï¼è¥å ¶åå¨ï¼ï¼
unsigned char x = 32; // 第ä¸ä¸ª 'x' çä½ç¨åå¼å§ { unsigned char x = x; // 第äºä¸ª 'x' çä½ç¨åå¨åå§åå¨ (= x) åå¼å§ // è¿ä¸ä»¥å¼ 32 åå§å第äºä¸ª 'x' ï¼ // è¿ä»¥å ¶èªèº«çä¸ç¡®å®å¼åå§å第äºä¸ª 'x' } std::function<int(int)> f = [&](int n){return n>1 ? n*f(n-1) : n;}; // 彿°å¯¹è±¡å 'f' å¨ lambda ä¸å¨ä½ç¨åä¸ï¼ // èä¸è½æ£ç¡®å°è¢«æå¼ç¨ä¿è·ï¼ç»åºéå½å½æ°
const int x = 2; // é¦ä¸ª 'x' çä½ç¨åå¼å§ { int x[x] = {}; // 第äºä¸ª x çä½ç¨åå¨åå§åå¨ (= {}) åå¼å§ï¼ä½å¨å£°æå¨ (x[x]) åã // å¨å£°æå¨å ï¼å¤å± 'x' ä»å¨ä½ç¨åä¸ï¼è¿å£°æ 2 个 int çæ°ç»ã }
ç±»æç±»æ¨¡æ¿ç声æç¹ï¼ç´§éå ¶ç±»å¤´ä¸æåºç°çå½åç±»åçæ è¯ç¬¦ï¼ææå模æ¿ç¹åç template-idï¼æ¨¡æ¿æ è¯ï¼ï¼ä¹åï¼å¹¶ä¸å¨åºç±»å表ä¸å·²å¤äºä½ç¨åä¸ï¼
// åç§° 'S' å¨å ¶åºç°åç«å³å¤äºä½ç¨åä¸ï¼ // æ å®è½ç¨äºåºç±»å表 struct S: std::enable_shared_from_this<S> { };
æä¸¾ç声æç¹ï¼ç´§é enum 说æç¬¦æç¬¼ç»æä¸¾å£°æï¼åå³äºä½è 为å ï¼ä¸æåºç°çå½åå®çæ è¯ç¬¦ä¹åï¼
enum E : int { // E å·²å¨ä½ç¨åä¸ A = sizeof(E) };
ç±»åå«åæå«å模æ¿ç声æç¹ç´§é该å«åæä»£è¡¨çç±»åæ è¯ï¼type-idï¼ä¹åï¼
using T = int; // T ç声æç¹å¨åå·å¤ using T = T; // å T = int
æä¸¾é¡¹ç声æç¹ç´§éå ¶å®ä¹ä¹åï¼èéå¨åå§åå¨ä¹åï¼è¿ç¹ä¸åäºåéï¼ï¼
const int x = 12; { enum { x = x + 1, // 声æç¹å¨éå·å¤ï¼åå§å x 为 13 y = x + 1 // æä¸¾é¡¹ x å¨ä½ç¨åä¸ï¼åå§å y 为 14 }; }
䏿åæé 彿°çusing 声æä¸ç声æç¬¦ç声æç¹ç´§é声æç¬¦ä¹åï¼
template<int N> class base { protected: static const int next = N + 1; static const int value = N; };  struct derived : base<0>, base<1>, base<2> { using base<0>::next, // next ç°å¨å¨ä½ç¨åä¸ base<next>::value; // derived::value 为 1 };
æ³¨å ¥ç±»å ç声æç¹ç´§éå ¶ç±»ï¼æç±»æ¨¡æ¿ï¼å®ä¹çå¼è±æ¬å·ä¹å
template<typename T> struct Array // : std::enable_shared_from_this<Array> // éè¯¯ï¼æ³¨å ¥ç±»åä¸å¨ä½ç¨åä¸ : std::enable_shared_from_this< Array<T> > // OK ï¼æ¨¡æ¿å Array å¨ä½ç¨åä¸ { // æ³¨å ¥ç±»å Array ç°å¨å¨ä½ç¨åä¸ï¼å¦åä¸ºå ¬å¼æåå Array* p; // æå Array<T> çæé };
|
彿°å±é¨åé __func__ ç声æç¹ç«å³ä½äºå½æ°å®ä¹ç彿°ä½ä¹åã |
(C++11 èµ·) |
|
ç»æåç»å®ç声æç¹ç´§éè¯¥ç»æåç»å®å£°æç æ è¯ç¬¦å表 ä¹åï¼ä½ç¦æ¢ç»æåç»å®çåå§å卿åå ¶æå¼å ¥çä»»ä½ååã |
(C++17 èµ·) |
|
声æäºåºäºèå´ç for è¯å¥ç èå´å£°æ çåéæç»æåç»å® (C++17 èµ·)ç声æç¹ç´§é èå´è¡¨è¾¾å¼ ä¹åï¼ std::vector<int> x;  for (auto x : x) { // OK ï¼ç¬¬äºä¸ª x æä»£ std::vector<int> // 循ç¯ä½ä¸ x æä»£å¾ªç¯åé } |
(C++11 èµ·) |
模æ¿å½¢åç声æç¹ç´§éå ¶å®æ´æ¨¡æ¿å½¢åï¼å æ¬å¯éçé»è®¤å®åï¼ä¹åï¼
typedef unsigned char T; template<class T = T // æ¥æ¾æ¾å° unsigned char ç typedef å , T // æ¥æ¾æ¾å°æ¨¡æ¿å½¢å N = 0> struct A { };
| æ¬èæªå®æ åå ï¼[basic.scope.pdecl] çå©ä½å 容 |
å¼ç¨
- C++17 standard (ISO/IEC 14882:2017):
- 6.3 Scope [basic.scope]
- C++14 standard (ISO/IEC 14882:2014):
- 3.3 Scope [basic.scope]
- C++11 standard (ISO/IEC 14882:2011):
- 3.3 Scope [basic.scope]
- C++98 standard (ISO/IEC 14882:1998):
- 3.3 Declarative regions and scopes [basic.scope]