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++ è¿ç®ç¬¦ã
è¯æ³
éè½½çè¿ç®ç¬¦æ¯å ·æç¹æ®ç彿°åç彿°ï¼
operator op
|
(1) | ||||||||
operator ç±»å
|
(2) | ||||||||
operator new operator new []
|
(3) | ||||||||
operator delete operator delete []
|
(4) | ||||||||
operator "" åç¼æ è¯ç¬¦
|
(5) | (C++11 èµ·) | |||||||
operator co_await
|
(6) | (C++20 èµ·) | |||||||
| op | - | ä¸å 38 (C++20 å)39 (C++20 èµ·) 个è¿ç®ç¬¦ä¹ä¸ï¼ + - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= <=> (C++20 èµ·) && || ++ -- , ->* -> ( ) [ ] |
éè½½çè¿ç®ç¬¦
å½è¡¨è¾¾å¼ä¸åºç°æä¸ªè¿ç®ç¬¦ï¼ä¸å ¶è³å°ä¸ä¸ªæä½æ°æ¥æç±»ç±»åææä¸¾ç±»åæ¶ï¼ä½¿ç¨éè½½å³è®®å¨å ·æä¸ä»¥ä¸å项å¹é çç¾åç彿°ä¸ï¼ç¡®å®æè¦è°ç¨çç¨æ·å®ä¹å½æ°ï¼
| è¡¨è¾¾å¼ | ä½ä¸ºæå彿° | ä½ä¸ºéæå彿° | ç¤ºä¾ |
|---|---|---|---|
| @a | (a).operator@ ( ) | operator@ (a) | !std::cin è°ç¨ std::cin.operator!() |
| a@b | (a).operator@ (b) | operator@ (a, b) | std::cout << 42 è°ç¨ std::cout.operator<<(42) |
| a=b | (a).operator= (b) | ä¸è½æ¯éæå | std::string s; s = "abc"; è°ç¨ s.operator=("abc") |
| a(b...) | (a).operator()(b...) | ä¸è½æ¯éæå | std::random_device r; auto n = r(); è°ç¨ r.operator()() |
| a[b] | (a).operator[](b) | ä¸è½æ¯éæå | std::map<int, int> m; m[1] = 2; è°ç¨ m.operator[](1) |
| a-> | (a).operator-> ( ) | ä¸è½æ¯éæå | auto p = std::make_unique<S>(); p->bar() è°ç¨ p.operator->() |
| a@ | (a).operator@ (0) | operator@ (a, 0) | std::vector<int>::iterator i = v.begin(); i++ è°ç¨ i.operator++(0) |
|
æ¤è¡¨ä¸ï¼ | |||
|
å¦å¤ï¼å¯¹äºæ¯è¾è¿ç®ç¬¦ ==, !=, <, >, <=, >=, <=> ï¼éè½½å³è®®äº¦èèä» operator== æ operator<=> çæçéååéã |
(C++20 èµ·) |
注æï¼å¯¹äºéè½½ç co_await ã (C++20 èµ·)ç¨æ·å®ä¹è½¬æ¢å½æ°ãç¨æ·å®ä¹åé¢éãåé
ä¸è§£åé
ï¼å¯åå«è§å
¶ä¸é¢ã
éè½½çè¿ç®ç¬¦ï¼ä½éå 建è¿ç®ç¬¦ï¼å¯ç¨å½æ°è®°æ³è¿è¡è°ç¨ï¼
std::string str = "Hello, "; str.operator+=("world"); // å str += "world"; operator<<(operator<<(std::cout, str) , '\n'); // å std::cout << str << '\n'; // (C++17 èµ·) ä½å®åºä¸å
éå¶
- ä¸è½éè½½è¿ç®ç¬¦
::ï¼ä½ç¨åè§£æï¼ã.ï¼æå访é®ï¼ã.*ï¼éè¿æåæéçæå访é®ï¼å?:ï¼ä¸å æ¡ä»¶ï¼ã - ä¸è½å建æ°è¿ç®ç¬¦ï¼ä¾å¦
**ã<>æ&|ã - è¿ç®ç¬¦
&&ä¸||çé载失å»çè·¯æ±å¼ã - éè½½çè¿ç®ç¬¦
->å¿ é¡»è¦ä¹è¿å裸æéï¼è¦ä¹ï¼æå¼ç¨æå¼ï¼è¿ååæ ·éè½½äºè¿ç®ç¬¦->ç对象ã - ä¸å¯è½æ´æ¹è¿ç®ç¬¦çä¼å 级ãç»åæ¹åææä½æ°çæ°éã
|
(C++17 å) |
è§èå®ç°
é¤äºä¸è¿°éå¶å¤ï¼è¯è¨å¯¹éè½½è¿ç®ç¬¦çæä½æä¸ºæè¿åç±»åï¼å®ä¸åä¸éè½½å³è®®ï¼ä¸æ²¡æå ¶ä»ä»»ä½å¶çº¦ï¼ä½é常æå¾ éè½½çè¿ç®ç¬¦è¡¨ç°å°½å¯è½ä¸å 建è¿ç®ç¬¦ç¸ä¼¼ï¼æå¾ operator+ å¯¹å ¶å®åè¿è¡ç¸å èéç¸ä¹ï¼æå¾ operator= è¿è¡èµå¼ï¼å¦æ¤ççãæå¾ ç¸å ³çè¿ç®ç¬¦ä¹é´ç表ç°ä¹ç¸ä¼¼ï¼operator+ ä¸ operator+= ååä¸ç±»å æ³è¿ç®ï¼ãè¿åç±»å为æå¾ 使ç¨è¯¥è¿ç®ç¬¦çè¡¨è¾¾å¼æéå¶ï¼ä¾å¦ï¼ä»¤èµå¼è¿ç®ç¬¦æå¼ç¨è¿åï¼ä»¥ä½¿ååº a = b = c = d å¯è¡ï¼å 为å 建è¿ç®ç¬¦å è®¸è¿æ ·åã
常è§çéè½½è¿ç®ç¬¦æ¥æä¸åå ¸åãè§èå½¢å¼ï¼[1]
èµå¼è¿ç®ç¬¦
èµå¼è¿ç®ç¬¦ï¼operator=ï¼æç¹æ®æ§è´¨ï¼ç»èè§å¤å¶èµå¼ä¸ç§»å¨èµå¼ã
对è§èçå¤å¶èµå¼è¿ç®ç¬¦ï¼æå¾ å ¶å¨èªèµå¼æ¶ä¸è¿è¡æä½ï¼å¹¶æå¼ç¨è¿å lhsï¼
// åè®¾å¯¹è±¡ä¿æå¯éç¨åå¨ï¼ä¾å¦ä¸ä¸ªåé äºå çç¼å²åº mArray T& operator=(const T& other) // å¤å¶èµå¼ { if (this != &other) { // æå¾ æ£æ¥èªèµå¼ if (other.size != size) { // åå¨ä¸å¯å¤ç¨ delete[] mArray; // 鿝 this ä¸çåå¨ size = 0; mArray = nullptr; // å¨ä¸ä¸è¡æåºçæ åµä¸ç»´æä¸åå¼ mArray = new int[other.size]; // åé this ä¸çåå¨ size = other.size; } std::copy(other.mArray, other.mArray + other.size, mArray); } return *this; }
对è§èçç§»å¨èµå¼ï¼æå¾ å ¶ä»¤è¢«ç§»å¨å¯¹è±¡éçäºåæ³ç¶æï¼å³æå®å¥½ç±»ä¸åå¼çç¶æï¼ï¼ä¸å¨èªèµå¼æ¶è¦ä¹ä¸åä»»ä½äºï¼è¦ä¹è³å°éç对象äºåæ³ç¶æï¼å¹¶ä»¥é const å¼ç¨è¿å lhsï¼èä¸ä¸º noexceptï¼
T& operator=(T&& other) noexcept // ç§»å¨èµå¼ { if(this != &other) { // èªèµå¼æ¶æ æä½ï¼delete[]/size=0 亦 OKï¼ delete[] mArray; // å 餿¤åå¨ mArray = std::exchange(other.mArray, nullptr); // 令被移å¨å¯¹è±¡éçäºåæ³ç¶æ size = std::exchange(other.size, 0); } return *this; }
å¨å¤å¶èµå¼ä¸è½ä»èµæºå¤ç¨ä¸åççæ å½¢ä¸ï¼å®ä¸ç®¡çå åé æ°ç»ï¼ä¸æ è¿ä¹åçï¼å¯è½ä¼ éçï¼æåï¼ä¾å¦ std::vector æ std::string æåï¼ï¼æä¸ç§æµè¡çä¾¿æ·æ¹å¼ï¼å¤å¶å¹¶äº¤æ¢ï¼copy-and-swapï¼èµå¼è¿ç®ç¬¦ï¼å®æå¼æ¥æ¶å½¢åï¼ä»èæ ¹æ®å®åçå¼ç±»å«èåæ¶æ¯æå¤å¶åç§»å¨èµå¼ï¼ï¼äº¤æ¢å½¢åï¼å¹¶ä»¤ææå½æ°è¿è¡æ¸ çã
è¿ç§å½¢å¼èªå¨æä¾å¼ºå¼å¸¸ä¿è¯ï¼ä½ç¦æ¢èµæºå¤ç¨ã
æµçæåä¸æå ¥
æ¥å std::istream& æ std::ostream& ä½ä¸ºå·¦ä¾§å®åç operator>> ä¸ operator<< çéè½½ï¼è¢«ç§°ä¸ºæå
¥ä¸æåè¿ç®ç¬¦ãå 为å®ä»¬æ¥æ¶ç¨æ·å®ä¹ç±»å为å³å®åï¼a@b ä¸ç bï¼ï¼æä»¥å®ä»¬å¿
é¡»å®ç°ä¸ºéæåã
std::ostream& operator<<(std::ostream& os, const T& obj) { // åæµåå ¥ obj return os; } std::istream& operator>>(std::istream& is, T& obj) { // 仿µè¯»å obj if( /* ä¸è½æé T */ ) is.setstate(std::ios::failbit); return is; }
è¿äºè¿ç®ç¬¦ææ¶å®ç°ä¸ºåå 彿°ã
彿°è°ç¨è¿ç®ç¬¦
å½ç¨æ·å®ä¹çç±»éè½½äºå½æ°è°ç¨è¿ç®ç¬¦ operator() æ¶ï¼å®å°±æä¸ºå½æ°å¯¹è±¡ (FunctionObject) ç±»åãä» std::sort å° std::accumulate çè®¸å¤æ åç®æ³é½æ¥åè¿ç§ç±»åç对象以å®å¶å ¶è¡ä¸ºãoperator() 没æç¹å«å¼å¾æ³¨æçè§èå½¢å¼ï¼æ¤å¤æ¼ç¤ºå ¶ç¨æ³
struct Sum { int sum; Sum() : sum(0) { } void operator()(int n) { sum += n; } }; Sum s = std::for_each(v.begin(), v.end(), Sum());
èªå¢ä¸èªå
å½è¡¨è¾¾å¼ä¸åºç°åç¼èªå¢ä¸èªåæ¶ï¼ä»¥ä¸ä¸ªæ´æ°å®å 0 è°ç¨ç¨æ·å®ä¹å½æ°ï¼operator++ æ operator--ï¼ãå®å
¸åå°å®ç°ä¸º T operator++(int)ï¼å
¶ä¸åæ°è¢«å¿½ç¥ãåç¼èªå¢ä¸èªåè¿ç®ç¬¦é常以åç¼çæ¬å®ç°ï¼
struct X { X& operator++() { // actual increment takes place here return *this; } X operator++(int) { X tmp(*this); // copy operator++(); // pre-increment return tmp; // return old value } };
尽管åèªå¢/åèªåçè§è形弿¯è¿åå¼ç¨çï¼ä½åä»»ä½è¿ç®ç¬¦éè½½ä¸æ ·ï¼å ¶è¿åç±»åæ¯ç¨æ·å®ä¹çï¼ä¾å¦è¿äºè¿ç®ç¬¦å¯¹ std::atomic çé载以å¼è¿åã
äºå ç®æ¯è¿ç®ç¬¦
å
¸åæ
åµä¸ï¼äºå
è¿ç®ç¬¦é½è¢«å®ç°ä¸ºéæå以维æå¯¹ç§°æ§ï¼ä¾å¦ï¼å°å¤æ°ä¸æ´æ°ç¸å æ¶ï¼è¥ operator+ æ¯å¤æ°ç±»åçæå彿°ï¼å坿 complex+integer è½ç¼è¯ï¼è integer+complex ä¸è½ï¼ãå ä¸ºå¯¹äºæ¯ä¸ªäºå
ç®æ¯è¿ç®ç¬¦é½åå¨å¯¹åºçå¤åèµå¼è¿ç®ç¬¦ï¼æä»¥äºå
è¿ç®ç¬¦çè§è形弿¯åºäºå
¶å¯¹åºçå¤åèµå¼å®ç°çï¼
class X { public: X& operator+=(const X& rhs) // å¤åèµå¼ï¼ä¸å¿ ï¼ä½éå¸¸æ¯æå彿°ï¼ä»¥ä¿®æ¹ç§ææåï¼ { /* å° rhs å å° *this åçäºæ¤ */ return *this; // æå¼ç¨è¿åç»æ }  // å®ä¹äºç±»ä½å çåå æ¯ inline çï¼ä¸å¨é ADL æ¥æ¾ä¸è¢«éè friend X operator+(X lhs, // æå¼ä¼ é lhs æå©äºä¼åé¾ç¶ç a+b+c const X& rhs) // å¦åï¼ä¸¤ä¸ªå½¢å齿¯ const å¼ç¨ { lhs += rhs; // å¤ç¨å¤åèµå¼ return lhs; // æå¼è¿åç»æï¼ä½¿ç¨ç§»å¨æé 彿°ï¼ } };
å ³ç³»è¿ç®ç¬¦
æ åçç®æ³ï¼å¦ std::sortï¼å容å¨ï¼å¦ std::setï¼ï¼é»è®¤æ åµä¸æå¾ operator< 对äºç¨æ·æä¾çç±»åæå®ä¹ï¼å¹¶æå¾ å®å®ç°ä¸¥æ ¼å¼±åºï¼ä»è满足æ¯è¾ (Compare) è¦æ±ï¼ãä¸ç§ä¸ºç»æä½å®ç°ä¸¥æ ¼å¼±åºçæ¯ç¨æ¹å¼æ¯ä½¿ç¨ std::tie æä¾çåå ¸åºæ¯è¾ï¼
struct Record { std::string name; unsigned int floor; double weight; friend bool operator<(const Record& l, const Record& r) { return std::tie(l.name, l.floor, l.weight) < std::tie(r.name, r.floor, r.weight); // ä¿æç¸åé¡ºåº } };
å ¸åå°ï¼ä¸æ¦æä¾äº operator<ï¼å ¶ä»å ³ç³»è¿ç®ç¬¦å°±é½è½éè¿ operator< æ¥å®ç°ã
inline bool operator< (const X& lhs, const X& rhs){ /* åå®é æ¯è¾ */ } inline bool operator> (const X& lhs, const X& rhs){ return rhs < lhs; } inline bool operator<=(const X& lhs, const X& rhs){ return !(lhs > rhs); } inline bool operator>=(const X& lhs, const X& rhs){ return !(lhs < rhs); }
类似å°ï¼ä¸ç¸çè¿ç®ç¬¦å ¸åå°éè¿ operator== æ¥å®ç°ï¼
inline bool operator==(const X& lhs, const X& rhs){ /* åå®é æ¯è¾ */ } inline bool operator!=(const X& lhs, const X& rhs){ return !(lhs == rhs); }
彿ä¾äºä¸è·¯æ¯è¾ï¼å¦ std::memcmp æ std::string::compareï¼æ¶ï¼ææå ä¸ªå ³ç³»è¿ç®ç¬¦é½è½éè¿å®è¡¨è¾¾ï¼
inline bool operator==(const X& lhs, const X& rhs){ return cmp(lhs,rhs) == 0; } inline bool operator!=(const X& lhs, const X& rhs){ return cmp(lhs,rhs) != 0; } inline bool operator< (const X& lhs, const X& rhs){ return cmp(lhs,rhs) < 0; } inline bool operator> (const X& lhs, const X& rhs){ return cmp(lhs,rhs) > 0; } inline bool operator<=(const X& lhs, const X& rhs){ return cmp(lhs,rhs) <= 0; } inline bool operator>=(const X& lhs, const X& rhs){ return cmp(lhs,rhs) >= 0; }
|
è¥å®ä¹ operator== åç¼è¯å¨ä¼èªå¨çæä¸çè¿ç®ç¬¦ã类似å°ï¼è¥å®ä¹ä¸è·¯æ¯è¾è¿ç®ç¬¦ operator<=> åç¼è¯å¨ä¼èªå¨çæåä¸ªå ³ç³»è¿ç®ç¬¦ãè¥å®ä¹ operator<=> 为é¢ç½®ï¼åç¼è¯å¨ä¼çæ operator== ä¸ operator<=> ï¼ struct Record { std::string name; unsigned int floor; double weight; auto operator<=>(const Record&) = default; }; // ç°å¨è½ç¨ ==ã!=ã<ã<=ã> å >= æ¯è¾ Record ç»èè§é»è®¤æ¯è¾ã |
(C++20 èµ·) |
æ°ç»ä¸æ è¿ç®ç¬¦
æä¾æ°ç»å¼è®¿é®å¹¶åæ¶å 许读åçç¨æ·å®ä¹ç±»ï¼å ¸åå°ä¸º operator[] å®ä¹ä¸¤ä¸ªéè½½ï¼const åé const åä½ï¼
struct T { value_t& operator[](std::size_t idx) { return mVector[idx]; } const value_t& operator[](std::size_t idx) const { return mVector[idx]; } };
è¥å·²ç¥å¼ç±»åæ¯å 建类åï¼å const åä½åºå½æå¼è¿åã
å½ä¸å¸ææä¸å¯è½ç´æ¥è®¿é®å®¹å¨å ç´ ï¼æè è¦åºå«å·¦å¼ï¼c[i] = v;ï¼åå³å¼ï¼v = c[i];ï¼çä¸åç¨æ³æ¶ï¼operator[] å¯ä»¥è¿åä¸ä¸ªä»£çã示ä¾è§ std::bitset::operator[]ã
为æä¾å¤ç»´æ°ç»è®¿é®è¯ä¹ï¼ä¾å¦å®ç° 3D æ°ç»è®¿é® a[i][j][k] = x;ï¼operator[] å¿ é¡»è¿åå° 2D å¹³é¢çå¼ç¨ï¼å®å¿ é¡»æ¥æèªå·±ç operator[] å¹¶è¿åå° 1D è¡çå¼ç¨ï¼èè¡å¿ é¡»æ¥æè¿åå°å ç´ çå¼ç¨ç operator[]ã为é¿å è¿ç§å¤ææ§ï¼ä¸äºåºéæ©ä»£ä¹ä»¥éè½½ operator()ï¼ä½¿å¾ 3D 访é®è¡¨è¾¾å¼æ¥æ Fortran å¼çè¯æ³ a(i, j, k) = x;ã
éä½ç®æ¯è¿ç®ç¬¦
å®ç°ä½æ©ç ç±»å (BitmaskType) çè§å®çç¨æ·å®ä¹ç±»åæä¸¾ï¼è¦æ±éè½½éä½ç®æ¯è¿ç®ç¬¦ operator&ãoperator|ãoperator^ãoperator~ãoperator&=ãoperator|= å operator^=ï¼èä¸å¯éå°éè½½ä½ç§»è¿ç®ç¬¦ operator<<ãoperator>>ãoperator>>= å operator<<=ãè§èå®ç°é常éµå¾ªä¸è¿°çäºå ç®æ¯è¿ç®ç¬¦ã
å¸å°ååè¿ç®ç¬¦
|
è¿ç®ç¬¦ operator! 常为ææç¨äºå¸å°è¯å¢çç¨æ·å®ä¹ç±»æéè½½ãè¿ç§ç±»äº¦æä¾ç¨æ·å®ä¹è½¬æ¢å½æ° explicit operator bool()ï¼æ ååºæ ·ä¾è§ std::basic_iosï¼ï¼è operator! çåæå¾ è¡ä¸ºæ¯è¿å operator bool çååã |
(C++11 å) |
|
ç±äºå
建è¿ç®ç¬¦ ! è¿è¡æè¯å¢å° |
(C++11 èµ·) |
ç½æéè½½çè¿ç®ç¬¦
ä¸åè¿ç®ç¬¦ç½æéè½½ï¼
- ååè¿ç®ç¬¦ operator&ã妿坹ä¸å®æ´ç±»åçå·¦å¼åºç¨ä¸å &ï¼è宿´ç±»å声æäºéè½½ç operator&ï¼åè¡ä¸ºæªå®ä¹ (C++11 å)è¿ç®ç¬¦æ¥æå 建å«ä¹è¿æ¯è°ç¨è¿ç®ç¬¦å½æ°æ¯æªææç (C++11 èµ·)ãå 为æ¤è¿ç®ç¬¦å¯è½è¢«éè½½ï¼æä»¥æ³ååºé½ç¨ std::addressof åå¾ç¨æ·å®ä¹ç±»åç对象çå°åãæä¸ºäººçç¥çè§èéè½½ç operator& æ¯ Microsoft ç±» CComPtrãå¨ boost.spirit ä¸å¯ä»¥æ¾å°å®å¨ EDSL çä½¿ç¨æ¡ä¾ã
- å¸å°é»è¾è¿ç®ç¬¦ operator&& ä¸ operator||ãä¸åäºå å»ºçæ¬ï¼éè½½çæ¬æ æ³å®ç°çè·¯æ±å¼ãèä¸ä¸åäºå å»ºçæ¬ï¼å®ä»¬ä¹ä¸ä¼ä»¤å·¦æä½æ°çæ±å¼æé¡ºåºæ©äºå³æä½æ°ã (C++17 å)æ ååºä¸ï¼è¿äºè¿ç®ç¬¦ä» 为 std::valarray éè½½ã
- éå·è¿ç®ç¬¦ operator,ãä¸åäºå
å»ºçæ¬ï¼éè½½çæ¬ä¸ä¼ä»¤å·¦æä½æ°çæ±å¼æé¡ºåºæ©äºå³æä½æ°ã (C++17 å)å 为æ¤è¿ç®ç¬¦å¯è½è¢«éè½½ï¼æä»¥æ³ååºé½ç¨ a,void(),b è¿ç§è¡¨è¾¾å¼å代 a,bï¼ä»¥å¯¹ç¨æ·å®ä¹ç±»åçè¡¨è¾¾å¼æé¡ºåºæ±å¼ãboost åºå¨ boost.assignãboost.spirit åå 个å
¶ä»åºä¸ä½¿ç¨
operator,ãæ°æ®åºè®¿é®åº SOCI 亦éè½½operator,ã - éè¿æåæéçæåè®¿é® operator->*ãéè½½æ¤è¿ç®ç¬¦æ ç¹å«ç¼ºç¹ï¼ä½å®è·µä¸å°æä½¿ç¨ãæäººæ¨èè¿è½ä½ä¸ºæºè½æéæ¥å£çä¸é¨åï¼ä¸å®é ä¸å¨ boost.phoenix ä¸ç actor æå®é ç¨éãå®å¨å¦ cpp.react è¿æ ·ç EDSL 䏿´å¸¸è§ã
示ä¾
#include <iostream> Â class Fraction { int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } int n, d; public: Fraction(int n, int d = 1) : n(n/gcd(n, d)), d(d/gcd(n, d)) { } int num() const { return n; } int den() const { return d; } Fraction& operator*=(const Fraction& rhs) { int new_n = n * rhs.n/gcd(n * rhs.n, d * rhs.d); d = d * rhs.d/gcd(n * rhs.n, d * rhs.d); n = new_n; return *this; } }; std::ostream& operator<<(std::ostream& out, const Fraction& f) { return out << f.num() << '/' << f.den() ; } bool operator==(const Fraction& lhs, const Fraction& rhs) { return lhs.num() == rhs.num() && lhs.den() == rhs.den(); } bool operator!=(const Fraction& lhs, const Fraction& rhs) { return !(lhs == rhs); } Fraction operator*(Fraction lhs, const Fraction& rhs) { return lhs *= rhs; } Â int main() { Fraction f1(3, 8), f2(1, 2), f3(10, 2); std::cout << f1 << " * " << f2 << " = " << f1 * f2 << '\n' << f2 << " * " << f3 << " = " << f2 * f3 << '\n' << 2 << " * " << f1 << " = " << 2 * f1 << '\n'; }
è¾åºï¼
3/8 * 1/2 = 3/16 1/2 * 5/1 = 5/2 2 * 3/8 = 3/4
ç¼ºé·æ¥å
ä¸åæ´æ¹è¡ä¸ºçç¼ºé·æ¥å追溯å°åºç¨äºä»¥ååºçç C++ æ åã
| DR | åºç¨äº | åºçæ¶çè¡ä¸º | æ£ç¡®è¡ä¸º |
|---|---|---|---|
| CWG 1458 | C++11 | 对éè½½äºååè¿ç®ç¬¦çä¸å®æ´ç±»ååå°åæ¯æªå®ä¹è¡ä¸º | è¡ä¸ºåªæ¯æªææ |
åé
| 常è§è¿ç®ç¬¦ | ||||||
|---|---|---|---|---|---|---|
| èµå¼ | èªå¢ èªå |
ç®æ¯ | é»è¾ | æ¯è¾ | æåè®¿é® | å ¶ä» |
|
a = b |
++a |
+a |
!a |
a == b |
a[b] |
a(...) |
| ç¹æ®è¿ç®ç¬¦ | ||||||
|
static_cast 转æ¢ä¸ä¸ªç±»å为å¦ä¸ç¸å
³ç±»å | ||||||
å¼ç¨
- â StackOverflow C++ FAQ ä¸çè¿ç®ç¬¦éè½½