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++ è¯è¨ > 类声æ
类声æ
ç±»ï¼classï¼ä¸ç»æä½ï¼structï¼æ¯ç¨æ·å®ä¹ç±»åï¼ä»¥ 类说æç¬¦ å®ä¹ï¼å®å¨å£°æè¯æ³ç 声æè¯´æç¬¦åºå ä¸åºç°ã类说æç¬¦æ¥æä¸åè¯æ³ï¼
ç±»å
³é®è¯ attr 类头å åºç±»åå¥ { æå说æ }
|
|||||||||
| ç±»å ³é®è¯ | - | class æ struct ä¹ä¸ãé¤äºé»è®¤æå访é®åé»è®¤åºç±»è®¿é®ä¹å¤ï¼ä¸¤ä¸ªå ³é®è¯æ¯çåçã |
| attr(C++11) | - | å¯éç任使°é屿§åºåï¼å¯å å« alignas æå®ç¬¦ |
| 类头å | - | æå®ä¹çç±»çååãå¯éå°æéå®ï¼å¯éå°åéå ³é®è¯ finalãååå¯ä»¥çç¥ï¼è¯¥æ åµä¸ç±»æ¯æ åçï¼æ³¨ææ åç±»ä¸è½ä¸º finalï¼ |
| åºç±»åå¥ | - | 䏿å¤ä¸ªç¶ç±»ä»¥ååèªæç¨çç»§æ¿æ¨¡åçå¯éå表ï¼è§æ´¾çç±»ï¼ |
| æå说æ | - | 访é®è¯´æç¬¦ãæå对象åæå彿°ç声æåå®ä¹çå表ï¼è§ä¸æï¼ |
è¯æ³ç»¼è¿°è§ç±»ãè¥ ç±»å
³é®è¯ 为 unionï¼å声æå¼å
¥ä¸ä¸ªèåä½ç±»åã
å置声æ
ä¸åå½¢å¼ç声æ
ç±»å
³é®è¯ attr æ è¯ç¬¦ ;
|
|||||||||
声æä¸ä¸ªå°ç¨å卿¤ä½ç¨åå®ä¹ç类类åãç´å°å®ä¹åºç°åï¼æ¤ç±»åå ·æä¸å®æ´ç±»åãè¿å 许类ä¹é´å½¼æ¤å¼ç¨ï¼
class Vector; // å置声æ class Matrix { // ... friend Vector operator*(const Matrix&, const Vector&); }; class Vector { // ... friend Vector operator*(const Matrix&, const Vector&); };
èä¸è¥ç¹å®çæºæä»¶ä» ä½¿ç¨å°è¯¥ç±»çæéåå¼ç¨ï¼è¿äº¦ä½¿å¾åå° #include ä¾èµæä¸ºå¯è½ï¼
// å¨ MyStruct.h ä¸ #include <iosfwd> // 嫿 std::ostream çå置声æ struct MyStruct { int value; friend std::ostream& operator<<(std::ostream& os, const S& s); // å ¶å®ä¹å¨ MyStruct.cpp æä»¶ä¸æä¾ï¼è¯¥æä»¶ä½¿ç¨ #include <ostream> };
è¥å置声æåºç°äºå±é¨ä½ç¨åï¼åå®éèå ¶å¤å´ä½ç¨åä¸å¯åºç°çå å声æçç¸åååçç±»ãåéã彿°ï¼ä»¥åææå ¶ä»å£°æï¼
struct s { int a; }; struct s; // ä¸åä»»ä½äºï¼s å·²å®ä¹äºæ¤ä½ç¨åï¼ void g() { struct s; // æ°çå±é¨ç±»âsâçå置声æ // å®éèå ¨å±ç struct s ç´è³æ¤åç»å°¾ s* p; // æåå±é¨ struct s çæé struct s { char* p; }; // å±é¨ struct s çå®ä¹ }
注æï¼éè¿ä½ä¸ºå ¶ä»å£°æä¸é¨åç详述类å说æç¬¦ï¼ä¹å¯ä»¥å¼å ¥æ°çç±»åï¼ä½ä» å½ååæ¥æ¾æ æ³æ¾å°å å声æçææ¤åçç±»æ¶æè¡ã
class U; namespace ns{ class Y f(class T p); // 声æå½æ° ns::f 并声æ ns::T ä¸ ns::Y class U f(); // U æä»£Â ::U Y* p; T* q; // å¯ä½¿ç¨å° T å Y çæéåå¼ç¨ }
æå说æ
æå说æï¼æç±»å®ä¹çä½ï¼æ¯è±æ¬å·ç¯ç»ç任使°éä¸åå项çåºåï¼
attr(å¯é) 声æè¯´æç¬¦åºå(å¯é) æå声æç¬¦å表(å¯é) ;
|
|||||||||
| attr(C++11) | - | å¯éç任使°é屿§åºå |
| 声æè¯´æç¬¦åºå | - | 说æç¬¦çåºåãå®åªå¨æé 彿°ï¼ææå½æ°ï¼ä»¥åç¨æ·å®ä¹è½¬æ¢å½æ°ä¸å¯éã |
| æå声æç¬¦å表 | - | ä¸ åå§å声æç¬¦å表ç¸åï¼ä½é¢å¤å
许ä½åå®ä¹ã纯说æç¬¦åè说æç¬¦ï¼ override æ finalï¼ (C++11 èµ·)ï¼å¹¶ä¸ä¸å
è®¸ç´æ¥éå表åå§åè¯æ³ã
|
è¿ç§å£°æå¯ä»¥å£°æéæåééæçæ°æ®æå䏿å彿°ãæå typedefãæåæä¸¾ä»¥ååµå¥ç±»ãå®äº¦å¯ä¸ºåå 声æã
class S { int d1; // ééææ°æ®æå int a[10] = {1,2}; // 带åå§åå¨çééææ°æ®æå (C++11) static const int d2 = 1; // 带åå§åå¨çéææ°æ®æå virtual void f1(int) = 0; // 纯èæå彿° std::string d3, *d4, f2(int); // ä¸¤ä¸ªæ°æ®æååä¸ä¸ªæå彿° enum {NORTH, SOUTH, EAST, WEST}; struct NestedS { std::string s; } d5, *d6; typedef NestedS value_type, *pointer_type; };
class M { std::size_t C; std::vector<int> data; public: M(std::size_t R, std::size_t C) : C(C), data(R*C) {} // æé 彿°å®ä¹ int operator()(size_t r, size_t c) const { // æå彿°å®ä¹ return data[r*C+c]; } int& operator()(size_t r, size_t c) { // å¦ä¸ä¸ªæå彿°å®ä¹ return data[r*C+c]; } };
public:ãprotected: å private:
class S { public: S(); // å ¬å¼æé 彿° S(const S&); // å ¬å¼å¤å¶æé 彿° virtual ~S(); // å ¬å¼èææå½æ° private: int* ptr; // ç§ææ°æ®æå };
class Base { protected: int d; }; class Derived : public Base { public: using Base::d; // 令 Base çåä¿æ¤æå d 为 Derived çå ¬å¼æå using Base::Base; // ç»§æ¿ç¶ç±»çå ¨é¨æé 彿° (C++11) };
template<typename T> struct Foo { static_assert(std::is_floating_point<T>::value, "Foo<T>: T must be floating point"); };
struct S { template<typename T> void f(T&& n); Â template<class CharT> struct NestedS { std::basic_string<CharT> s; }; };
|
8) æå类模æ¿çæ¨å¯¼æå¼ï¼
struct S { template<class CharT> struct NestedS { std::basic_string<CharT> s; }; Â template<class CharT> NestedS(std::basic_string<CharT>) -> NestedS<CharT>; }; |
(C++17 èµ·) |
å±é¨ç±»
类声æå¯åºç°äºå½æ°ä½å ï¼è¯¥æ åµä¸å®å®ä¹å±é¨ç±»ãè¿ç§ç±»çåååªåå¨äºå½æ°ä½ç¨åä¸ï¼ä¸æ æ³å¨å½æ°å¤è®¿é®ã
- å±é¨ç±»ä¸è½æ¥æéææ°æ®æå
- å±é¨ç±»çæå彿°æ è¿æ¥
- å±é¨ç±»çæå彿°å¿ é¡»å®å ¨å¨ç±»ä½å å®ä¹
- é¤éå ç±»å以å¤ç (C++14 èµ·)å±é¨ç±»ä¸è½æ¥ææå模æ¿
- å±é¨ç±»ä¸è½æ¥æåå æ¨¡æ¿
- å±é¨ç±»ä¸è½å¨ç±»å®ä¹å å®ä¹åå 彿°
- 彿°ï¼å æ¬æå彿°ï¼å çå±é¨ç±»å¯ä»¥è®¿é®å ¶å¤å´å½æ°è½è®¿é®çç¸åååã
|
(C++11 å) |
#include <vector> #include <algorithm> #include <iostream> Â int main() { std::vector<int> v{1,2,3}; struct Local { bool operator()(int n, int m) { return n > m; } }; std::sort(v.begin(), v.end(), Local()); // C++11 èµ· for(int n: v) std::cout << n << ' '; }
è¾åºï¼
3 2 1