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++ è¯è¨ > å¼ç¨å£°æ
å¼ç¨å£°æ
声æå ·ååé为å¼ç¨ï¼å³æ¢å对象æå½æ°çå«åã
è¯æ³
å¼ç¨åéå£°ææ¯å£°æç¬¦æ¥æä¸åå½¢å¼çç®å声æ
& attr(å¯é) 声æç¬¦
|
(1) | ||||||||
&& attr(å¯é) 声æç¬¦
|
(2) | (C++11 èµ·) | |||||||
D 声æä¸ºå° 声æè¯´æç¬¦åºå æç¡®å®çç±»å S çå·¦å¼å¼ç¨ãD 声æä¸ºå° 声æè¯´æç¬¦åºå æç¡®å®çç±»å S çå³å¼å¼ç¨ã| 声æç¬¦ | - | é¤å¼ç¨å£°æç¬¦ä¹å¤çä»»ä½å ¶ä»å£°æç¬¦ï¼ä¸åå¨å¼ç¨çå¼ç¨ï¼ |
| attr(C++11) | - | å¯éç屿§å表 |
å¼ç¨å¿ 须被åå§å为æä»£ä¸ä¸ªææç对象æå½æ°ï¼è§å¼ç¨åå§åã
ä¸åå¨ void çå¼ç¨ï¼ä¹ä¸åå¨å¼ç¨çå¼ç¨ã
å¼ç¨ç±»åæ æ³å¨é¡¶å±è¢« cv éå®ï¼å£°æä¸æ²¡æä¸ºæ¤è设çè¯æ³ï¼å¹¶ä¸éè¿ typedefãdecltype ææ¨¡æ¿ç±»åå®åæå¼å ¥çé宿§æ¯è¢«å¿½ç¥çã
å¼ç¨ä¸æ¯å¯¹è±¡ï¼å®ä»¬ä¸å¿ å ç¨åå¨ï¼å°½ç®¡è¥éè¦åé åå¨ä»¥å®ç°æéè¯ä¹ï¼ä¾å¦ï¼å¼ç¨ç±»åçééææ°æ®æåé常ä¼å¢å ç±»ç大å°ï¼é为åå¨å åå°åæéï¼ï¼åç¼è¯å¨ä¼è¿ä¹åã
å 为å¼ç¨ä¸æ¯å¯¹è±¡ï¼æ ä¸åå¨å¼ç¨çæ°ç»ï¼ä¸å卿åå¼ç¨çæéï¼ä¸åå¨å¼ç¨çå¼ç¨ï¼
int& a[3]; // é误 int&* p; // é误 int& &r; // é误
å¼ç¨å缩容许éè¿æ¨¡æ¿æ typedef ä¸çç±»åæä½ææå¼ç¨çå¼ç¨ï¼è¿ç§æ åµä¸éç¨å¼ç¨å缩ï¼reference coolapsingï¼è§åï¼å³å¼å¼ç¨çå³å¼å¼ç¨å缩æå³å¼å¼ç¨ï¼ææå ¶ä»ç»ååå缩æå·¦å¼å¼ç¨ï¼ typedef int& lref; typedef int&& rref; int n; lref& r1 = n; // r1 çç±»åæ¯ int& lref&& r2 = n; // r2 çç±»åæ¯ int& rref& r3 = n; // r3 çç±»åæ¯ int& rref&& r4 = 1; // r4 çç±»åæ¯ int&& ï¼è¿æ¡è§åï¼åå° |
(C++11 èµ·) |
å·¦å¼å¼ç¨
å·¦å¼å¼ç¨å¯ç¨äºå»ºç«æ¢å对象çå«åï¼å¯éå°æ¥æä¸åç cv éå®ï¼ï¼
#include <iostream> #include <string>  int main() { std::string s = "Ex"; std::string& r1 = s; const std::string& r2 = s;  r1 += "ample"; // ä¿®æ¹ s // r2 += "!"; // é误ï¼ä¸è½éè¿å° const çå¼ç¨ä¿®æ¹ std::cout << r2 << '\n'; // æå° sï¼ç°å¨ä¿æ "Example" }
å®ä»¬äº¦å¯ç¨äºå¨å½æ°è°ç¨ä¸å®ç°æå¼ç¨ä¼ éè¯ä¹ï¼
#include <iostream> #include <string>  void double_string(std::string& s) { s += s; // 's' ä¸ main() ç 'str' æ¯åä¸å¯¹è±¡ }  int main() { std::string str = "Test"; double_string(str); std::cout << str << '\n'; }
å½å½æ°çè¿å弿¯å·¦å¼å¼ç¨æ¶ï¼å½æ°è°ç¨è¡¨è¾¾å¼æä¸ºå·¦å¼è¡¨è¾¾å¼ï¼
#include <iostream> #include <string>  char& char_number(std::string& s, std::size_t n) { return s.at(n); // string::at() è¿å char çå¼ç¨ }  int main() { std::string str = "Test"; char_number(str, 1) = 'a'; // 彿°è°ç¨æ¯å·¦å¼ï¼å¯è¢«èµå¼ std::cout << str << '\n'; }
å³å¼å¼ç¨å³å¼å¼ç¨å¯ç¨äºä¸ºä¸´æ¶å¯¹è±¡å»¶é¿çåæï¼æ³¨æï¼å·¦å¼å¼ç¨äº¦è½å»¶é¿ä¸´æ¶å¯¹è±¡çåæï¼ä½ä¸è½éè¿å·¦å¼å¼ç¨ä¿®æ¹å®ä»¬ï¼ï¼ è¿è¡æ¤ä»£ç #include <iostream> #include <string>  int main() { std::string s1 = "Test"; // std::string&& r1 = s1; // é误ï¼ä¸è½ç»å®å°å·¦å¼  const std::string& r2 = s1 + s1; // okayï¼å° const çå·¦å¼å¼ç¨å»¶é¿çåæ // r2 += "Test"; // é误ï¼ä¸è½éè¿å° const çå¼ç¨ä¿®æ¹  std::string&& r3 = s1 + s1; // okayï¼å³å¼å¼ç¨å»¶é¿çåæ r3 += "Test"; // okayï¼è½éè¿å°é const çå¼ç¨ä¿®æ¹ std::cout << r3 << '\n'; }
æ´éè¦çæ¯ï¼å½å½æ°åæ¶å ·æå³å¼å¼ç¨åå·¦å¼å¼ç¨çéè½½æ¶ï¼å³å¼å¼ç¨éè½½ç»å®å°å³å¼ï¼å å«çº¯å³å¼å亡å¼ï¼ï¼èå·¦å¼å¼ç¨éè½½ç»å®å°å·¦å¼ï¼ è¿è¡æ¤ä»£ç #include <iostream> #include <utility>  void f(int& x) { std::cout << "lvalue reference overload f(" << x << ")\n"; }  void f(const int& x) { std::cout << "lvalue reference to const overload f(" << x << ")\n"; }  void f(int&& x) { std::cout << "rvalue reference overload f(" << x << ")\n"; }  int main() { int i = 1; const int ci = 2; f(i); // è°ç¨ f(int&) f(ci); // è°ç¨ f(const int&) f(3); // è°ç¨ f(int&&) // è¥ä¸æä¾ f(int&&) éè½½åä¼è°ç¨ f(const int&) f(std::move(i)); // è°ç¨ f(int&&)  // å³å¼å¼ç¨åéå¨ç¨äºè¡¨è¾¾å¼æ¶æ¯å·¦å¼ int&& x = 1; f(x); // è°ç¨ f(int& x) f(std::move(x)); // è°ç¨ f(int&& x) }
è¿å 许å¨é彿¶æºèªå¨éæ©ç§»å¨æé 彿°ãç§»å¨èµå¼è¿ç®ç¬¦åå ¶ä»å ·ç§»å¨è½åç彿°ï¼ä¾å¦ std::vector::push_back()ï¼ã å 为å³å¼å¼ç¨è½ç»å®å°äº¡å¼ï¼æ å®ä»¬è½æä»£é临æ¶å¯¹è±¡ï¼ int i2 = 42; int&& rri = std::move(i2); // ç´æ¥ç»å®å° i2 è¿ä½¿å¾å¯ä»¥å°ä½ç¨åä¸ä¸åéè¦ç对象移å¨åºå»ï¼ std::vector<int> v{1,2,3,4,5}; std::vector<int> v2(std::move(v)); // ç»å®å³å¼å¼ç¨å° v assert(v.empty()); |
(C++11 èµ·) |
转åå¼ç¨è½¬åå¼ç¨æ¯ä¸ç§ç¹æ®çå¼ç¨ï¼å®ä¿æå½æ°å®åçå¼ç±»å«ï¼ä½¿å¾è½å©ç¨ std::forward 转åå®åã转åå¼ç¨æ¯ä¸åä¹ä¸ï¼ 1) 彿°æ¨¡æ¿ç彿°å½¢åï¼å
¶è¢«å£°æä¸ºåä¸å½æ°æ¨¡æ¿çç±»åæ¨¡æ¿å½¢åçæ cv éå®çå³å¼å¼ç¨ï¼
template<class T> int f(T&& x) { // x æ¯è½¬åå¼ç¨ return g(std::forward<T>(x)); // ä»èè½è¢«è½¬å } int main() { int i; f(i); // å®åæ¯å·¦å¼ï¼è°ç¨ f<int&>(int&), std::forward<int&>(x) æ¯å·¦å¼ f(0); // å®åæ¯å³å¼ï¼è°ç¨ f<int>(int&&), std::forward<int>(x) æ¯å³å¼ }  template<class T> int g(const T&& x); // x 䏿¯è½¬åå¼ç¨ï¼const T 䏿¯æ cv éå®ç  template<class T> struct A { template<class U> A(T&& x, U&& y, int* p); // x 䏿¯è½¬åå¼ç¨ï¼T 䏿¯æé 彿°çç±»åæ¨¡æ¿å½¢å // ä½ y æ¯è½¬åå¼ç¨ }; 2) auto&&ï¼ä½å½å
¶ä»è±æ¬å·å
å´çåå§åå¨å表æ¨å¯¼æ¶å䏿¯ï¼
auto&& vec = foo(); // foo() å¯ä»¥æ¯å·¦å¼æå³å¼ï¼vec æ¯è½¬åå¼ç¨ auto i = std::begin(vec); // ä¹å¯ä»¥ (*i)++; // ä¹å¯ä»¥ g(std::forward<decltype(vec)>(vec)); // 转åï¼ä¿æå¼ç±»å«  for (auto&& x: f()) { // x æ¯è½¬åå¼ç¨ï¼è¿æ¯ä½¿ç¨èå´ for 循ç¯çæå®å ¨æ¹å¼ }  auto&& z = {1, 2, 3}; // *䏿¯*转åå¼ç¨ï¼åå§åå¨å表çç¹æ®æ å½¢ï¼ åé æ¨¡æ¿å®åæ¨å¯¼å std::forwardã |
(C++11 èµ·) |
æ¬åå¼ç¨
尽管å¼ç¨ä¸æ¦åå§åï¼å°±å§ç»æä»£ä¸ä¸ªææç对象æå½æ°ï¼ä½æå¯è½å建ä¸ä¸ªç¨åºï¼è¢«æä»£å¯¹è±¡ççåæç»æï¼ä½å¼ç¨ä»ä¿æå¯è®¿é®ï¼æ¬åï¼danglingï¼ï¼ã访é®è¿ç§å¼ç¨æ¯æªå®ä¹è¡ä¸ºã ä¸ä¸ªå¸¸è§ä¾åæ¯è¿åèªå¨åéçå¼ç¨ç彿°ï¼
std::string& f() { std::string s = "Example"; return s; // éåº s çä½ç¨å: // è°ç¨å ¶ææå½æ°å¹¶è§£åé å ¶åå¨ }  std::string& r = f(); // æ¬åå¼ç¨ std::cout << r; // æªå®ä¹è¡ä¸ºï¼ä»æ¬åå¼ç¨è¯»å std::string s = f(); // æªå®ä¹è¡ä¸ºï¼ä»æ¬åå¼ç¨å¤å¶åå§å
注æï¼å³å¼å¼ç¨åå° const çå·¦å¼å¼ç¨è½å»¶é¿ä¸´æ¶å¯¹è±¡ççåæï¼åé å¼ç¨åå§åä¸çè§ååä¾å¤æ åµï¼ã
è¥è¢«æä»£å¯¹è±¡è¢«éæ¯ï¼ä¾å¦éè¿æ¾å¼çææå½æ°è°ç¨ï¼ï¼ä½åå¨å°æªè¢«è§£åé ï¼åå°çåæå¤ç对象çå¼ç¨ä»è½ä»¥æéçæ¹å¼ä½¿ç¨ï¼ä¸å½å¨åä¸åå¨ä¸éæ°å建对象æ¶ä¹å¯ä»¥å为ææï¼ç»èè§å¨çåæä¹å¤è¿è¡è®¿é®ï¼ã