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++ è¯è¨ > æ éå®çå忥æ¾
æ éå®çå忥æ¾
æ éå®åï¼å³å¹¶éåºç°å¨ä½ç¨åè§£æè¿ç®ç¬¦ :: å³è¾¹çååï¼å
¶ååæ¥æ¾æä¸ææè¿°æ£æ¥å个ä½ç¨åï¼ç´å°æ¾å°ä»»ä½ç§ç±»çè³å°ä¸ä¸ªå£°ææ¶å°±åæ¢æ¥æ¾ï¼å³ä¸åç»§ç»æ£æ¥å«çä½ç¨åãï¼æ³¨æï¼å¨æäºè¯å¢ä¸æè¿è¡çæ¥æ¾ä¼å¿½ç¥æä¸äºå£°æï¼ä¾å¦ï¼å¯¹ç¨å¨ :: 左边çååçæ¥æ¾å°å¿½ç¥å½æ°ãåéåæä¸¾é¡¹ç声æï¼è对ç¨ä½åºç±»è¯´æç¬¦çååçæ¥æ¾åä¼å¿½ç¥ææçéç±»åç声æãï¼
为äºè¿è¡æ éå®çå忥æ¾ï¼æ¥èª using æä»¤ææåçå½å空é´ä¸çææå£°æï¼é½è¢«å½æå¦åå¤äºåæ¶ç´æ¥æé´æ¥å å«è¿æ¡ using æä»¤åææåçå½å空é´çæå å±çå¤å´å½å空é´ä¹ä¸ã
坹彿°è°ç¨è¿ç®ç¬¦å·¦è¾¹æä½¿ç¨çååï¼çä»·å°ä¹å æ¬è¡¨è¾¾å¼ä¸çè¿ç®ç¬¦ï¼æè¿è¡çæ éå®çå忥æ¾ï¼å¨å®åä¾èµæ¥æ¾ä¸è¯´æã
æä»¶ä½ç¨å
对äºå¨å ¨å±ï¼é¡¶å±å½å空é´ï¼ä½ç¨åä¸ï¼å¨ä»»ä½å½æ°ãç±»æç¨æ·å£°æçå½å空é´ä¹å¤æä½¿ç¨çååï¼æ£æ¥å ¨å±ä½ç¨åä¸è¿æ¬¡ååç使ç¨ä¹åçé¨åï¼
int n = 1; // n ç声æ int x = n + 1; // OKï¼æ¾å°äºÂ ::n  int z = y - 1; // éè¯¯ï¼æ¥æ¾å¤±è´¥ int y = 2; // y ç声æ
å½å空é´ä½ç¨å
对äºå¨ç¨æ·å£°æçå½å空é´ä¸ï¼å¨ä»»ä½å½æ°æç±»ä¹å¤æä½¿ç¨çååï¼å¨è¿ä¸ªå½å空é´ä¸è¿æ¬¡ååç使ç¨ä¹åçé¨å䏿¥æ¾ï¼ç¶ååå¨å å«è¿ä¸ªå½å空é´çå½å空é´ä¸è¿ä¸ªå½å空é´ç声æä¹åçé¨å䏿¥æ¾ï¼ç´å°å°è¾¾å ¨å±å½å空é´ã
int n = 1; // 声æ namespace N { int m = 2; namespace Y { int x = n; // OKï¼æ¥æ¾Â ::n int y = m; // OKï¼æ¥æ¾Â ::N::m int z = k; // éè¯¯ï¼æ¥æ¾å¤±è´¥ } int k = 3; }
å¨å½å空é´å¤è¿è¡å®ä¹
对äºå½åç©ºé´æååéï¼å¨å ¶å½å空é´ä¹å¤çå®ä¹ä¸æä½¿ç¨çååï¼è¦ä»¥å¨å½å空é´ä¹å 使ç¨çååç¸åçæ¹å¼è¿è¡æ¥æ¾ï¼
namespace X { extern int x; // 声æï¼ä¸æ¯å®ä¹ int n = 1; // æ¾å°ç¬¬ä¸ä¸ª }; int n = 2; // æ¾å°ç¬¬äºä¸ª int X::x = n; // æ¾å°äº X::nï¼è®¾ç½® X::x 为 1
éæå彿°çå®ä¹
对äºå¨å½æ°ä¸ï¼æ 论æ¯å ¶å½æ°ä½è¿æ¯ä½ä¸ºé»è®¤å®åçä¸é¨åè使ç¨çååï¼å½è¿ä¸ªå½æ°æ¯æä¸ªç¨æ·å£°æçæè å ¨å±çå½å空é´çæåæ¶ï¼è¦å¨å å«è¿æ¬¡åå使ç¨çåä¹ä¸ï¼è¿æ¬¡ä½¿ç¨ä¹åçé¨å䏿¥æ¾ï¼ç¶åæ¥æ¾å ¶å¤å´åä¸è¿ä¸ªåå¼å§åçé¨åï¼ççï¼ç´å°å°è¾¾å½æ°ä½çå为æ¢ãç¶ååå¨å£°æäºè¿ä¸ªå½æ°çå½å空é´ä¸ï¼ç´å°ä½¿ç¨äºè¿ä¸ªååç彿°å®ä¹ï¼å¹¶ä¸æ¯å ¶å£°æï¼ä¹åçé¨åä¸è¿è¡æ¥æ¾ï¼ç¶åæ¥æ¾å ¶å¤å´å½å空é´ï¼ççã
namespace A { namespace N { void f(); int i=3; // æ¾å°ç¬¬ä¸ä¸ªï¼å¦æç¬¬äºä¸ªæ²¡æ¾å°ï¼ } int i=4; // æ¾å°ç¬¬å个ï¼å¦æç¬¬ä¸ä¸ªæ²¡æ¾å°ï¼ }  int i=5; // æ¾å°ç¬¬äºä¸ªï¼å¦æç¬¬å个没æ¾å°ï¼  void A::N::f() { int i = 2; // æ¾å°ç¬¬äºä¸ªï¼å¦æç¬¬ä¸ä¸ªæ²¡æ¾å°ï¼ while(true) { int i = 1; // æ¾å°ç¬¬ä¸ä¸ªï¼æ¥æ¾ç»æ std::cout << i; } }  // int i; // æ¾ä¸å°è¿ä¸ª  namespace A { namespace N { // int i; // æ¾ä¸å°è¿ä¸ª } }
ç±»çå®ä¹
对äºå¨ç±»çå®ä¹ä¸æä½¿ç¨çååï¼å æ¬åºç±»è¯´æç¬¦ååµå¥ç±»å®ä¹ï¼ï¼å½åºç°äºæå彿°ä½ãæå彿°çé»è®¤å®åãæå彿°çå¼å¸¸è§å®ãé»è®¤æååå§åå¨ï¼å ¶ä¸è¯¥æåå¯è½å±äºå®ä¹å¨å¤å´ç±»ä½å çåµå¥ç±»ï¼ä»¥å¤çä»»ä½ä½ç½®æ¶ï¼è¦å¨ä¸åä½ç¨å䏿¥æ¾ï¼
namespace M { // const int i = 1; // æ¾ä¸å°è¿ä¸ª class B { // static const int i = 3; // æ¾å°äºç¬¬ä¸ä¸ªï¼ä½ä¹åä¼è¢«è®¿é®æ£æ¥ææç»ï¼ }; } // const int i = 5; // æ¾å°äºç¬¬äºä¸ª namespace N { // const int i = 4; // æ¾å°äºç¬¬å个 class Y : public M::B { // static const int i = 2; // æ¾å°äºç¬¬äºä¸ª class X { // static const int i = 1; // æ¾å°äºç¬¬ä¸ä¸ª int a[i]; // i çä½¿ç¨ // static const int i = 1; // æ¾ä¸å°è¿ä¸ª }; // static const int i = 2; // æ¾ä¸å°è¿ä¸ª }; // const int i = 4; // æ¾ä¸å°è¿ä¸ª } // const int i = 5; // æ¾ä¸å°è¿ä¸ª
æ³¨å ¥ç±»å
对äºå¨ç±»æç±»æ¨¡æ¿æå ¶æ´¾çç±»æç±»æ¨¡æ¿ä¸æä½¿ç¨çè¿ä¸ªç±»æç±»æ¨¡æ¿çååï¼æ éå®å忥æ¾å°ä¼æ¾å°å½åè¿è¡å®ä¹çç±»ï¼å¦åå ¶ååæ¯ç±æå声æï¼ä»¥å ¬å¼æå访é®ï¼çæ¹å¼æå¼å ¥ç䏿 ·ãæ´å¤ç»èè§æ³¨å ¥ç±»åã
æå彿°çå®ä¹
对äºå¨æå彿°ä½ãæå彿°çé»è®¤å®åãæå彿°çå¼å¸¸è¯´ææé»è®¤æååå§åå¨ä¸æä½¿ç¨çååï¼è¿è¡æ¥æ¾çå个ä½ç¨ååç±»çå®ä¹ä¸çç¸åï¼ä½è¦èèè¿ä¸ªç±»çæ´ä¸ªä½ç¨åï¼èä¸ä» æ¯ä½¿ç¨äºè¿ä¸ªååç声æä¹åçé¨åã对äºåµå¥ç±»æ¥è¯´ï¼å ¶å¤å´ç±»çæ´ä¸ªç±»ä½é½è¦è¿è¡æ¥æ¾ã
class B { // int i; // æ¾å°ç¬¬ä¸ä¸ª }; namespace M { // int i; // æ¾å°ç¬¬äºä¸ª namespace N { // int i; // æ¾å°ç¬¬å个 class X : public B { // int i; // æ¾å°ç¬¬äºä¸ª void f(); // int i; // 乿¾å°ç¬¬äºä¸ª }; // int i; // æ¾å°ç¬¬å个 } } // int i; // æ¾å°ç¬¬å 个 void M::N::X::f() { // int i; // æ¾å°ç¬¬ä¸ä¸ª i = 16; // int i; // æ¾ä¸å°è¿ä¸ª } namespace M { namespace N { // int i; // æ¾ä¸å°è¿ä¸ª } }
- æ 论åªç§æ¹å¼ï¼å½æ£æ¥æ´¾çç±»çåºç±»æ¶ï¼éè¦éµå®ä¸åè§åï¼å®ä»¬ææ¶è¢«ç§°ä¸ºèç»§æ¿ä¸çä¼å æ§ï¼
å½å对象 A æ¯å对象 B çåºç±»å对象æ¶ï¼å对象 B 䏿¾å°çæåçååå°éèæå对象 A ä¸ç¸åçæååãï¼ä½è¦æ³¨æè¿å¹¶ä¸ä¼éèç»§æ¿æ¶æ ¼ä¸å¹¶é B çåºç±»çä»»ä½å
¶ä»ç A çéè坿¬ãè¿æ¡è§åä»
å½èç»§æ¿æ¶æææãï¼ç± using 声ææå¼å
¥çååï¼è¢«å½ææ¯å
å«è¿ä¸ªå£°æçç±»ä¸çå忥å¤çãæ£æ¥äºå个åºç±»ä¹åï¼å
¶ç»æéåå¿
é¡»è¦ä¹å
嫿¥èªåä¸ä¸ªç±»åçå对象çéææåç声æï¼è¦ä¹å
嫿¥èªåä¸ä¸ªå对象çééææåç声æã |
(C++11 å) |
æé ä¸ä¸ªæ¥æ¾éåï¼å®ç±ä¸äºå£°æåå¨å
¶ä¸æ¾å°äºè¿äºå£°æçåå¯¹è±¡æææãå° using å£°ææ¿æ¢ä¸ºå®ä»¬æä»£è¡¨çæåï¼å°ç±»åç声æï¼å
æ¬æ³¨å
¥ç±»åï¼æ¿æ¢ä¸ºå®ä»¬æä»£è¡¨çç±»åãè¥ C 为å¨å
¶ä½ç¨åä¸ä½¿ç¨äºè¿ä¸ªååçç±»ï¼åé¦å
æ£æ¥ Cãè¥ C ä¸ç声æå表为空ï¼å对å
¶åä¸ªç´æ¥åºç±» Bi åèªæé å
¶æ¥æ¾éåï¼å½ Bi èªèº«ä¹æåºç±»æ¶ï¼éå½å°åºç¨è¿æ¡è§åï¼ãæé 宿åï¼å°åç´æ¥åºç±»çæ¥æ¾éåæ ¹æ®ä»¥ä¸è§åå并为 C çæ¥æ¾éåï¼
|
(C++11 èµ·) |
struct X { void f(); }; struct B1: virtual X { void f(); }; struct B2: virtual X {}; struct D : B1, B2 { void foo() { X::f(); // OKï¼è°ç¨äº X::fï¼æé宿¥æ¾ï¼ f(); // OKï¼è°ç¨äº B1::fï¼æ é宿¥æ¾ï¼ // C++98 è§åï¼B1::f éè X::fï¼å æ¤å³ä¾¿ä» D éè¿ B2 å¯ä»¥è®¿é®å° X::fï¼ // å®ä¹ä¸è½ä» D ä¸çååæ¥æ¾ææ¾å°ã // C++11 è§åï¼å¨ D ä¸å¯¹ f çæ¥æ¾éåå¹¶æªæ¾å°ä»»ä½ä¸è¥¿ï¼ç»§ç»å¤çå ¶åºç±» // å¨ B1 ä¸å¯¹ f çæ¥æ¾éåæ¾å°äº B1::fï¼å¹¶ä¸å®ææ¥æ¾ // åå¹¶æ¶æ¿æ¢äºç©ºéï¼æ¤æ¶å¨ C ä¸ å¯¹ f çæ¥æ¾éåå å« B1 ä¸ç B1::f // å¨ B2 ä¸å¯¹ f çæ¥æ¾éåå¹¶æªæ¾å°ä»»ä½ä¸è¥¿ï¼ç»§ç»å¤çå ¶åºç±» // å¨ X ä¸å¯¹ f çæ¥æ¾æ¾å°äº X::f // åå¹¶æ¶æ¿æ¢äºç©ºéï¼æ¤æ¶å¨ B2 ä¸å¯¹ f çæ¥æ¾éåå å« X ä¸ç X::f // å½å C ä¸åå¹¶æ¶åç°å¨ B2 çæ¥æ¾éåä¸çæ¯ä¸ªå对象ï¼Xï¼é½æ¯ // å·²ç»åå¹¶çå个å对象ï¼B1ï¼çåºç±»ï¼å æ¤ B2 çéåè¢«ä¸¢å¼ // C å©ä¸æ¥çå°±æ¯å¨ B1 䏿æ¾å°ç B1::f // (å¦æä½¿ç¨ struct D : B2, B1ï¼åæåçåå¹¶å°ä¼*æ¿æ¢æ* // C æ¤æ¶å·²ç»åå¹¶ç X ä¸ç X::fï¼å 为已ç»å å ¥å° C ä¸çæ¯ä¸ªå对象ï¼å°±æ¯ Xï¼ // 齿¯æ°éåï¼B1ï¼ä¸çè³å°ä¸ä¸ªå对象çåºç±»ï¼ // å ¶æç»ç»ææ¯ä¸æ ·çï¼C çæ¥æ¾éååªå å«å¨ B1 䏿¾å°ç B1::fï¼ } };
- 妿æ éå®çååæ¥æ¾æ¾å°äº
Bçéææåï¼Bçåµå¥ç±»åï¼å¨Bä¸å£°æçæä¸¾é¡¹ï¼åå³ä¾¿å¨ææ£æ¥çç±»çç»§æ¿æ 䏿å¤ä¸ªBç±»åçéèåºç±»å对象ï¼å®ä¹æ¯æ æ§ä¹çï¼
struct V { int v; }; struct A { int a; static int s; enum { e }; }; struct B : A, virtual V { }; struct C : A, virtual V { }; struct D : B, C { };  void f(D& pd) { ++pd.v; // OKï¼åªæä¸ä¸ª vï¼å ä¸ºåªæä¸ä¸ªèåºç±»å对象 ++pd.s; // OKï¼åªæä¸ä¸ªéæç A::sï¼å³ä¾¿å¨ B å C ä¸é½æ¾å°äºå® int i = pd.e; // OKï¼åªæä¸ä¸ªæä¸¾ç¬¦ A::eï¼å³ä¾¿å¨ B å C ä¸é½æ¾å°äºå® ++pd.a; // éè¯¯ï¼ææ§ä¹ï¼B ä¸ç A::a å C ä¸ç A::a }
åå 彿°çå®ä¹
对äºå¨æäºåå å ³ç³»çç±»ä½ä¹ä¸çåå 彿°çå®ä¹ä¸æä½¿ç¨çååï¼æ éå®çååæ¥æ¾æç §ä¸æå彿°ç¸åçæ¹å¼è¿è¡ã对äºå®ä¹äºç±»ä½ä¹å¤çåå 彿°ä¸æä½¿ç¨çååï¼æ éå®çååæ¥æ¾æç §ä¸å½å空é´ä¸ç彿°ç¸åçæ¹å¼è¿è¡ã
int i = 3; // f1 æ¾å°ç第ä¸ä¸ªï¼f2 æ¾å°ç第äºä¸ª struct X { static const int i = 2; // f1 æ¾å°ç第äºä¸ªï¼f2 æ¾ä¸å°è¿ä¸ª friend void f1(int x) { // int i; // æ¾å°ç¬¬ä¸ä¸ª i = x; // æ¾å°å¹¶æ¹å¨ X::i } friend int f2(); // static const int i = 2; // f1 å¨ç±»ä½ç¨åä¸çä»»ä½å°æ¹æ¾å°ç¬¬äºä¸ª }; void f2(int x) { // int i; // æ¾å°ç¬¬ä¸ä¸ª i = x; // æ¾å°å¹¶æ¹å¨Â ::i }
åå 彿°ç声æ
对äºå¨ä½¿æ¥èªå ¶ä»ç±»çæå彿°ä¸ºåå çåå 彿°å£°æç声æç¬¦ä¸æä½¿ç¨çååï¼å¦æè¯¥åå䏿¯ä»»ä½æ¨¡æ¿å®åçä¸é¨åï¼åæ éå®çæ¥æ¾é¦å æ£æ¥æå彿°æå¨ç±»çæ´ä¸ªä½ç¨åã妿æªè½å¨è¿ä¸ªä½ç¨å䏿¾å°ï¼æè 妿è¿ä¸ªååæ¯æ¨¡æ¿å®åçä¸é¨åï¼ï¼åç»§ç»ä»¥å¦å对æäºåå å ³ç³»çç±»çæå彿°è¿è¡æ¥æ¾çæ¹å¼ç»§ç»æ¥æ¾ã
// è¿ä¸ªç±»çæå彿°è¢«ä½ä¸ºåå struct A { typedef int AT; void f1(AT); void f2(float); template <class T> void f3(); };  // è¿ä¸ªç±»æäºåå å ³ç³» struct B { typedef char AT; typedef float BT; friend void A::f1(AT); // 对 AT çæ¥æ¾æ¾å°çæ¯ A::AT friend void A::f2(BT); // 对 BT çæ¥æ¾æ¾å°çæ¯ B::BT friend void A::f3<AT>(); // 对 AT çæ¥æ¾æ¾å°çæ¯ B::AT };
é»è®¤å®å
对äºå¨å½æ°å£°æçé»è®¤å®åä¸æä½¿ç¨çååï¼æè 卿é 彿°çæååå§åå¨ç è¡¨è¾¾å¼ é¨åæä½¿ç¨çååï¼å¨æ£æ¥å ¶å¤å´çåãç±»æå½å空é´ä½ç¨åä¹åï¼é¦å 伿¾å°å½æ°å½¢åçååï¼
class X { int a, b, i, j; public: const int& r; X(int i): r(a), // å° X::r åå§å为æä»£ X::a b(i), // å° X::b åå§å为形å i çå¼ i(i), // å° X::i åå§å为形å i çå¼ j(this->i) // å° X::j åå§å为 X::i çå¼ { } }  int a; int f(int a, int b = a); // é误ï¼å¯¹ a çæ¥æ¾æ¾å°äºå½¢å aï¼è䏿¯Â ::a // ä½å¨é»è®¤å®åä¸ä¸å 许使ç¨å½¢å
éææ°æ®æåçå®ä¹
对äºå¨éææ°æ®æåçå®ä¹ä¸æä½¿ç¨çååï¼å ¶æ¥æ¾æç §ä¸å¯¹æå彿°çå®ä¹ä¸æä½¿ç¨çååç¸åçæ¹å¼è¿è¡ã
struct X { static int x; static const int n = 1; // æ¾å°ç¬¬ä¸ä¸ª }; int n = 2; // æ¾å°ç¬¬äºä¸ª int X::x = n; // æ¾å°äº X::nï¼å° X::x 设置为 1 è䏿¯ 2
æä¸¾é¡¹ç声æ
对äºå¨æä¸¾é¡¹ç声æçåå§åå¨é¨åä¸æä½¿ç¨çååï¼å¨æ éå®çå忥æ¾å¤çå ¶å¤å´çåãç±»æå½å空é´ä½ç¨åä¹åï¼ä¼é¦å æ¾å°åä¸ä¸ªæä¸¾ä¸ä¹åæå£°æçæä¸¾é¡¹ã
const int RED = 7; enum class color { RED, GREEN = RED+2, // RED æ¾å°äº color::RED ï¼è䏿¯Â ::RED ï¼å æ¤ GREEN = 2 BLUE = ::RED+4 // æé宿¥æ¾æ¾å°Â ::RED ï¼ BLUE = 11 };
彿° try åç catch åå¥
对äºå¨å½æ° try åç catch åå¥ä¸æä½¿ç¨çååï¼å ¶æ¥æ¾æç §å¦å对å¨å½æ°ä½çæå¤å±åçæå¼å§å¤ä½¿ç¨çåå䏿 ·è¿è¡ï¼ç¹å«æ¯ï¼å½æ°å½¢åæ¯å¯è§çï¼ä½è¿ä¸ªæå¤å±åä¸å£°æçåååä¸å¯è§ï¼ã
int n = 3; // æ¾å°ç¬¬ä¸ä¸ª int f(int n = 2) // æ¾å°ç¬¬äºä¸ª try { int n = -1; // æ¾ä¸å°è¿ä¸ª } catch(...) { // int n = 1; // æ¾å°ç¬¬ä¸ä¸ª assert(n == 2); // 对 n çæ¥æ¾æ¾å°äºå½æ°å½¢å f throw; }
éè½½çè¿ç®ç¬¦
对äºå¨è¡¨è¾¾å¼ä¸æä½¿ç¨çè¿ç®ç¬¦ï¼æ¯å¦å¨ a+b ä¸ä½¿ç¨ç operator+ï¼ï¼å
¶æ¥æ¾è§åå对å¨å¦ operator+(a,b) è¿æ ·çæ¾å¼å½æ°è°ç¨è¡¨è¾¾å¼ä¸æä½¿ç¨çè¿ç®ç¬¦æ¯ææä¸åçï¼å½å¤çè¡¨è¾¾å¼æ¶è¦åå«è¿è¡ä¸¤æ¬¡æ¥æ¾ï¼å¯¹éæåçè¿ç®ç¬¦éè½½ï¼ä¹å¯¹æåè¿ç®ç¬¦éè½½ï¼å¯¹äºåæ¶å
许两ç§å½¢å¼çè¿ç®ç¬¦ï¼ãç¶åæé载解ææè¿°å°è¿ä¸¤ä¸ªéåä¸å
建çè¿ç®ç¬¦é载以平ççæ¹å¼åå¹¶å°ä¸èµ·ãèå½ä½¿ç¨æ¾å¼å½æ°è°ç¨è¯æ³æ¶ï¼åè¿è¡å¸¸è§çæ éå®å忥æ¾ï¼
struct A {}; void operator+(A, A); // ç¨æ·å®ä¹çéæå operator+  struct B { void operator+(B); // ç¨æ·å®ä¹çæå operator+ void f (); };  A a;  void B::f() // B çæå彿°å®ä¹ { operator+(a,a); // é误ï¼å¨æå彿°ä¸ç常è§ååæ¥æ¾ // æ¾å°äº B çä½ç¨åä¸ç operator+ ç声æ // å¹¶äºæ¤åä¸ï¼èä¸ä¼è¾¾å°å ¨å±ä½ç¨å a + a; // OKï¼æåæ¥æ¾æ¾å°äº B::operator+ï¼éæåæ¥æ¾ // æ¾å°äºÂ ::operator+(A,A)ï¼éè½½å³è®®éä¸äºÂ ::operator+(A,A) }
模æ¿çå®ä¹
对äºå¨æ¨¡æ¿çå®ä¹ä¸æä½¿ç¨çéå¾ å³åï¼å½æ£æ¥è¯¥æ¨¡æ¿çå®ä¹æ¶å°è¿è¡æ éå®çå忥æ¾ãå¨è¿ä¸ªä½ç½®ä¸å£°æä¹é´çç»å®å¹¶ä¸ä¼åå°å¨å®ä¾åç¹å¯è§ç声æçå½±åãè对äºå¨æ¨¡æ¿å®ä¹ä¸æä½¿ç¨çå¾ å³åï¼å ¶æ¥æ¾åæ¨è¿å°å¾ç¥å ¶æ¨¡æ¿å®å乿¶ãæ¤æ¶ï¼ADL å°åæ¶å¨æ¨¡æ¿çå®ä¹è¯å¢å卿¨¡æ¿çå®ä¾åè¯å¢ä¸æ£æ¥å¯è§çå ·æå¤é¨è¿æ¥ç (C++11 å)彿°å£°æï¼èé ADL çæ¥æ¾ååªæ£æ¥å¨æ¨¡æ¿çå®ä¹è¯å¢ä¸å¯è§çå ·æå¤é¨è¿æ¥ç (C++11 å)彿°å£°æãï¼æ¢å¥è¯è¯´ï¼å¨æ¨¡æ¿å®ä¹ä¹åæ·»å æ°ç彿°å£°æï¼é¤ééè¿ ADL å¦å仿¯ä¸å¯è§çãï¼å¦æå¨ ADL æ¥æ¾ææ£æ¥çå½å空é´ä¸ï¼å¨æä¸ªå«çç¿»è¯åå ä¸å£°æäºä¸ä¸ªå ·æå¤é¨è¿æ¥çæ´å¥½çå¹é 声æï¼æè 妿å½åæ ·æ£æ¥è¿äºç¿»è¯åå æ¶å ¶æ¥æ¾ä¼å¯¼è´æ§ä¹ï¼åå ¶è¡ä¸ºæ¯æªå®ä¹çãæ è®ºåªç§æ åµï¼å¦ææä¸ªåºç±»åå³äºæä¸ªæ¨¡æ¿å½¢åï¼åæ éå®å忥æ¾ä¸ä¼æ£æ¥å®çä½ç¨åï¼å¨å®ä¹ç¹åå®ä¾åç¹é½ä¸ä¼ï¼ã
void f(char); // f ç第ä¸ä¸ªå£°æ  template<class T> void g(T t) { f(1); // éå¾ å³åï¼ååæ¥æ¾æ¾å°äºÂ ::f(char) å¹¶äºæ¤æ¶ç»å® f(T(1)); // å¾ å³åï¼æ¥æ¾æ¨è¿ f(t); // å¾ å³åï¼æ¥æ¾æ¨è¿ // dd++; // éå¾ å³åï¼ååæ¥æ¾æªæ¾å°å£°æ }  enum E { e }; void f(E); // f ç第äºä¸ªå£°æ void f(int); // f ç第ä¸ä¸ªå£°æ double dd;  void h() { g(e); // å®ä¾å g<E>ï¼æ¤å¤ // 对 'f' çç¬¬äºæ¬¡åç¬¬ä¸æ¬¡ä½¿ç¨ // è¿è¡æ¥æ¾å¹¶æ¾å°äºÂ ::f(char)ï¼å¸¸è§æ¥æ¾ï¼å ::f(E)ï¼ADLï¼ // ç¶åé载解æéæ©äºÂ ::f(E)ã // è¿è°ç¨äº f(char)ï¼ç¶å两次è°ç¨ f(E) g(32); // å®ä¾å g<int>ï¼æ¤å¤ // 对 'f' çç¬¬äºæ¬¡åç¬¬ä¸æ¬¡ä½¿ç¨ // è¿è¡äºæ¥æ¾ä» æ¾å°äºÂ ::f(char) // ç¶åé载解æéæ©äºÂ ::f(char) // è¿ä¸æ¬¡è°ç¨äº f(char) }  typedef double A; template<class T> class B { typedef int A; }; template<class T> struct X : B<T> { A a; // 对 A çæ¥æ¾æ¾å°äºÂ ::A (double)ï¼è䏿¯ B<T>::A };
注ï¼å ³äºè¿æ¡è§åçç¸å ³ç¼ç±åå ¶å½±åï¼è¯·åè§å¾ å³åçæ¥æ¾è§åã
模æ¿å
| æ¬èæªå®æ åå ï¼æ¨¡æ¿ååç -> å . çåä½ç¨åæ¥æ¾ |
模æ¿å¤çç±»æ¨¡æ¿æå
| æ¬èæªå®æ |
å¼ç¨
- C++11 standard (ISO/IEC 14882:2011):
- 3.4 Name lookup [basic.lookup]
- 10.2 Member name lookup [class.member.lookup]
- 14.6 Name resolution [temp.res]
- C++98 standard (ISO/IEC 14882:1998):
- 3.4 Name lookup [basic.lookup]
- 10.2 Member name lookup [class.member.lookup]
- 14.6 Name resolution [temp.res]