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++ ç¨åºå¯ä»¥å建ã鿝ãå¼ç¨ã访é®å¹¶æä½å¯¹è±¡ã
å¨ C++ ä¸ï¼ä¸ä¸ªå¯¹è±¡æ¯æ¥æè¿äºæ§è´¨ç䏿®µåå¨åºåï¼
- 大å°ï¼å¯ä»¥ä½¿ç¨ sizeof è·åï¼ï¼
- 对é½è¦æ±ï¼å¯ä»¥ä½¿ç¨ alignof è·åï¼ï¼
- å卿ï¼èªå¨ãéæã卿ã线ç¨å±é¨ï¼ï¼
- çåæï¼ä¸å卿ç»å®ï¼æä¸ºä¸´æ¶çï¼
- ç±»åï¼
- å¼ï¼å¯è½æ¯ä¸ç¡®å®çï¼ä¾å¦é»è®¤åå§åçé类类åï¼ï¼
- ååï¼å¯éï¼ã
以ä¸å®ä½é½ä¸æ¯å¯¹è±¡ï¼å¼ï¼å¼ç¨ï¼å½æ°ï¼æä¸¾é¡¹ï¼ç±»åï¼ç±»çééææåï¼ä½åï¼æ¨¡æ¿ï¼ç±»æå½æ°æ¨¡æ¿çç¹åï¼å½å空é´ï¼å½¢åå ï¼å thisã
å鿝ç±å£°ææå¼å ¥ç对象æä¸æ¯ééææ°æ®æåçå¼ç¨ã
对象æ¯ç±å®ä¹ï¼new 表达å¼ï¼throw 表达å¼ï¼æ¹åèåä½çæ´»è·æåï¼ä»¥åéè¦ä¸´æ¶å¯¹è±¡çæ¶åå建çã
对象表示ä¸å¼è¡¨ç¤º
对äºä¸ä¸ª T ç±»åç对象ï¼å
¶å¯¹è±¡è¡¨ç¤º (object representation) æ¯åå®å¼å§äºåä¸ä¸ªå°åï¼ä¸é¿åº¦ä¸º sizeof(T) ç䏿®µ unsigned char ç±»åç对象åºåã
对象çå¼è¡¨ç¤º (value representation)忝ç¨äºææå®çç±»å T çå¼çä½çéåã
对äºå¯å¹³å¡å¤å¶ (TriviallyCopyable) ç±»åï¼å ¶å¼è¡¨ç¤ºæ¯å¯¹è±¡è¡¨ç¤ºçä¸é¨åï¼è¿æå³çå¤å¶è¯¥å¯¹è±¡å¨åå¨ä¸æå æ®çåè就足以产çå¦ä¸ä¸ªå ·æç¸åå¼ç对象ï¼é¤éè¿ä¸ªå¼æ¯è¯¥ç±»åçä¸ä¸ªâé·é±è¡¨ç¤ºï¼trap representationï¼âï¼å°å®è¯»åå° CPU ä¸ä¼äº§çä¸ä¸ªç¡¬ä»¶å¼å¸¸ï¼å°±åæµ®ç¹å¼ç SNaNï¼âSignaling NaN åä¿¡éæ°âï¼ææ´æ°å¼ç NaTï¼âNot a Thing éäºç©âï¼ï¼ã
åè¿æ¥ä¸ä¸å®æ¯å¯¹çï¼å¯å¹³å¡å¤å¶ (TriviallyCopyable) ç±»åçä¸¤ä¸ªå ·æä¸å对象表示ç对象å¯è½è¡¨ç°åºç¸åçå¼ãä¾å¦ï¼æµ®ç¹æ°æå¤ç§ä½æ¨¡å¼é½è¡¨ç¤ºç¸åçç¹æ®å¼ NaN ãæ´å¸¸è§çæ¯ï¼å¯¹è±¡è¡¨ç¤ºçä¸äºä½å¯è½æ ¹æ¬ä¸åä¸å¼è¡¨ç¤ºï¼è¿äºä½å¯è½æ¯ä¸ºäºæ»¡è¶³å¯¹é½è¦æ±ï¼ä½åç大å°çå¾ä»¥æ»¡è¶³èå¡«å å ¶é´çã
#include <cassert> struct S { char c; // 1 åèå¼ // 3 åèå¡«å ï¼å设 alignof(float) == 4 ï¼ float f; // 4 åèå¼ï¼å设 sizeof(float) == 4 ï¼ bool operator==(const S& arg) const { // åºäºå¼çç¸ç return c == arg.c && f == arg.f; } };  void f() { static_assert(sizeof(S) == 8); S s1 = {'a', 3.14}; S s2 = s1; reinterpret_cast<unsigned char*>(&s1)[2] = 'b'; // æ´æ¹å¡«å ç第 2 åè assert(s1 == s2); // å¼å¹¶æªæ´æ¹ }
å¯¹äº charï¼signed charï¼å unsigned char ç±»åç对象ï¼é¤éå®ä»¬æ¯å¤§å°è¿å¤§çä½åï¼å¦åå ¶å¯¹è±¡è¡¨ç¤ºçæ¯ä¸ªä½é½åä¸å ¶å¼è¡¨ç¤ºï¼è䏿¯ä¸ç§ä½æ¨¡å¼é½è¡¨ç¤ºä¸ä¸ªç¬ç«çå¼ï¼æ²¡æå¡«å 使é·é±ä½ï¼ä¸å 许å¼çå¤ç§è¡¨ç¤ºï¼ã
å对象
ä¸ä¸ªå¯¹è±¡å¯ä»¥å å«å ¶ä»å¯¹è±¡ï¼å®ä»¬è¢«ç§°ä¸ºå对象ãå对象æï¼
- æå对象
- åºç±»å对象
- æ°ç»å ç´
䏿¯å ¶ä»ä»»ä½å¯¹è±¡çå对象çå¯¹è±¡ç§°ä¸ºå®æ´å¯¹è±¡ã
è¥å对象æ¯ä»¥ä¸ä¹ä¸ï¼å宿½å¨éå ï¼
- åºç±»åå¯¹è±¡ï¼æ
- 声ææ
[[no_unique_address]]屿§çééææ°æ®æåã
宿´å¯¹è±¡ãæåå¯¹è±¡åæ°ç»å
ç´ ä¹è¢«ç§°ä¸ºæç»æ´¾ç对象 (most derived object) ï¼ä»¥ä¾¿ååºç±»å对象åºåå¼ã䏿¯ä½å䏿ªè¢«æ 记为 [[no_unique_address]] (C++20 èµ·)çæç»æ´¾ç对象ç大å°ä¸è½ä¸ºé¶ï¼åºç±»å对象ç大å°å¯è½ä¸ºé¶ï¼å³ä½¿æ [[no_unique_address]] 乿¯å¦æ¤ (C++20 èµ·)ï¼åè§ç©ºåºç±»ä¼åï¼ã
ä»»ä½ä¸¤ä¸ªå ·æäº¤å ççåæçï¼éä½åï¼å¯¹è±¡å¿ ç¶æä¸åçå°åï¼é¤éå ¶ä¸ä¸ä¸ªæ¯å¦ä¸ä¸ªçå对象æä¸ºå¦ä¸ä¸ªå¯¹è±¡æä¾åå¨ï¼æè ä¸¤ä¸ªå¯¹è±¡é½æ¯åä¸ä¸ªå®æ´å¯¹è±¡ä¸çä¸åç±»åçå对象ï¼ä¸å ¶ä¸ä¸ä¸ªæ¯é¶å¤§å°çå对象ã
static const char c1 = 'x'; static const char c2 = 'x'; assert(&c1 != &c2); // å¼ç¸åï¼å°åä¸å
å¤æå¯¹è±¡
声ææç»§æ¿äºè³å°ä¸ä¸ªè彿°ç类类åç对象æ¯å¤æå¯¹è±¡ãæ¯ä¸ªå¤æå¯¹è±¡ä¸ï¼å®ç°é½ä¼å¨åé¢å¤çä¿¡æ¯ï¼å¨ææç°åçå®ç°ä¸ï¼å¦ææ²¡è¢«ç¼è¯å¨ä¼åæçè¯ï¼è¿å°±æ¯ä¸ä¸ªæéï¼ï¼å®è¢«ç¨äºè¿è¡è彿°çè°ç¨ï¼RTTI åè½ç¹æ§ï¼dynamic_cast å typeidï¼ä¹ç¨å®å¨è¿è¡æ¶ç¡®å®å¯¹è±¡åå»ºæ¶æç¨çç±»åï¼èä¸ç®¡ä½¿ç¨å®çè¡¨è¾¾å¼æ¯ä»ä¹ç±»åã
对äºéå¤æå¯¹è±¡ï¼å¼çè§£éæ¹å¼ç±ä½¿ç¨å¯¹è±¡çè¡¨è¾¾å¼æç¡®å®ï¼è¿å¨ç¼è¯æå°±å·²ç»å³å®äºã
#include <iostream> #include <typeinfo> struct Base1 { // å¤æç±»åï¼å£°æäºèæå virtual ~Base1() {} }; struct Derived1 : Base1 { // å¤æç±»åï¼ç»§æ¿äºèæå };  struct Base2 { // éå¤æç±»å }; struct Derived2 : Base2 { // éå¤æç±»å };  int main() { Derived1 obj1; // object1 å建为类å Derived1 Derived2 obj2; // object2 å建为类å Derived2  Base1& b1 = obj1; // b1 æä»£å¯¹è±¡ obj1 Base2& b2 = obj2; // b2 æä»£å¯¹è±¡ obj2  std::cout << "b1ç表达å¼ç±»å: " << typeid(decltype(b1)).name() << ' ' << "b2ç表达å¼ç±»å: " << typeid(decltype(b2)).name() << '\n' << "b1 ç对象类å: " << typeid(b1).name() << ' ' << "b2 ç对象类å: " << typeid(b2).name() << '\n' << "b1 ç大å°: " << sizeof b1 << ' ' << "b2 ç大å°: " << sizeof b2 << '\n'; }
å¯è½çè¾åºï¼
b1 ç表达å¼ç±»å: Base1 b2 ç表达å¼ç±»å: Base2 b1 ç对象类å: Derived1 b2 ç对象类å: Base2 b1 ç大å°: 8 b2 ç大å°: 1
ä¸¥æ ¼çå«å使ç¨
å¨å¾å¤æ åµä¸ï¼éè¿ç±»åä¸å¯¹è±¡çå建类åä¸åçè¡¨è¾¾å¼æ¥è®¿é®å¯¹è±¡é½æ¯æªå®ä¹è¡ä¸ºï¼å ¶ä¾ååä¾å¤è¯·åè reinterpret_castã
对é½
æ¯ä¸ªå¯¹è±¡ç±»åé½å ·æè¢«ç§°ä¸ºå¯¹é½è¦æ±ï¼alignment requirementï¼çæ§è´¨ï¼å®æ¯ä¸ä¸ªæ´æ°ï¼ç±»å为 std::size_tï¼æ»æ¯ 2 çå¹ï¼ï¼è¡¨ç¤ºè¿ä¸ªç±»åçä¸å对象æè½åé æ¾ç½®çè¿ç»ç¸é»å°åä¹é´çåèæ°ãå¯ä»¥ä½¿ç¨ alignof æ std::alignment_of æ¥æ¥è¯¢ç±»åç对é½è¦æ±ãå¯ä»¥ä½¿ç¨æé对é½å½æ° std::align æ¥è·åæä¸ªç¼å²åºä¸ç»è¿éå½å¯¹é½çæéï¼è¿å¯ä»¥ä½¿ç¨ std::aligned_storage æ¥è·åç»è¿éå½å¯¹é½çåå¨åºã
对象类åä¼å¼ºå¶è¯¥ç±»åçææå¯¹è±¡å®è¡è¿ä¸ªç±»åç对é½è¦æ±ï¼å¯ä»¥ä½¿ç¨ alignas æ¥è¦æ±æ´ä¸¥æ ¼ç对é½ï¼æ´å¤§ç对é½è¦æ±ï¼ã
为äºä½¿ç±»ä¸çææééææåé½ç¬¦å对é½è¦æ±ï¼ä¼å¨ä¸äºæååé¢æå ¥ä¸äºå¡«å ã
#include <iostream>  // S ç±»åç对象å¯ä»¥å¨ä»»ä½å°åä¸åé // å 为 S.a å S.b é½å¯ä»¥å¨ä»»ä½å°åä¸åé struct S { char a; // 大å°ï¼1ï¼å¯¹é½ï¼1 char b; // 大å°ï¼1ï¼å¯¹é½ï¼1 }; // 大å°ï¼2ï¼å¯¹é½ï¼1  // X ç±»åç对象åªè½å¨ 4 åèè¾¹çä¸åé // å 为 X.n å¿ é¡»å¨ 4 åèè¾¹çä¸åé // å 为 int ç对é½è¦æ±ï¼é常ï¼å°±æ¯ 4 struct X { int n; // 大å°ï¼4ï¼å¯¹é½ï¼4 char c; // 大å°ï¼1ï¼å¯¹é½ï¼1 // ä¸ä¸ªå¡«å åè }; // 大å°ï¼8ï¼å¯¹é½ï¼4  int main() { std::cout << "sizeof(S) = " << sizeof(S) << " alignof(S) = " << alignof(S) << '\n'; std::cout << "sizeof(X) = " << sizeof(X) << " alignof(X) = " << alignof(X) << '\n'; }
å¯è½çè¾åºï¼
sizeof(S) = 2 alignof(S) = 1 sizeof(X) = 8 alignof(X) = 4
æå¼±ç对é½ï¼æå°ç对é½è¦æ±ï¼æ¯ char ã signed char å unsigned char ç对é½ï¼çäº 1 ï¼ææç±»å䏿大çåºç¡å¯¹é½ï¼fundamental alignmentï¼æ¯ std::max_align_t ç对é½ãå½ä½¿ç¨ alignas 使æä¸ªç±»åç坹齿¯ std::max_align_t çæ´ä¸¥æ ¼ï¼æ´å¤§ï¼æ¶ï¼ç§°å ¶ä¸ºå ·ææ©å±å¯¹é½ï¼extended alignmentï¼è¦æ±çç±»åãå ·ææ©å±å¯¹é½çç±»åæå å«å ·ææ©å±å¯¹é½çééææåçç±»ï¼ç§°ä¸ºè¿å¯¹é½ï¼over-alignedï¼ç±»åã new 表达å¼ã std::allocator::allocate å std::get_temporary_buffer æ¯å¦æ¯æè¿å¯¹é½ç±»åæ¯ç±å®ç°å®ä¹çã以è¿å¯¹é½ç±»åå®ä¾åçåé å¨ (Allocator) ï¼å 许å¨ç¼è¯æåçå®ä¾å失败ï¼å¨è¿è¡æ¶æåº std::bad_alloc å¼å¸¸ï¼å®éå°å¿½ç¥ä¸æ¯æç对é½è¦æ±ï¼ä¹å 许æ£ç¡®çå¤çå®ä»¬ã