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++ è¯è¨ > cvï¼const ä¸ volatileï¼ç±»åéå®ç¬¦
cvï¼const ä¸ volatileï¼ç±»åéå®ç¬¦
å¯åºç°äºä»»ä½ç±»å说æç¬¦ï¼å æ¬å£°æææ³ç 声æè¯´æç¬¦åºåï¼ä¸ï¼ä»¥æå®è¢«å£°æå¯¹è±¡æè¢«å½åç±»åç叏鿧ï¼constnessï¼ææåæ§ï¼volatilityï¼ã
constââå®ä¹ç±»å为常éãvolatileââå®ä¹ç±»å为æåã
è§£é
对äºé¤äºå½æ°ç±»åæå¼ç¨ç±»å以å¤çä»»ä½ç±»å Tï¼å
æ¬ä¸å®æ´ç±»åï¼ï¼C++ ç±»åç³»ç»ä¸æå¦å¤ä¸ä¸ªç¬ç«çç±»åï¼const-éå®ç Tãvolatile-éå®ç T å const-volatile-éå®ç Tã
- 注æï¼æ°ç»ç±»å被å½åä¸å ¶å ç´ ç±»åæç¸åç cv éå®ã
å½å¯¹è±¡æå被å建æ¶ï¼æç¨ç cv éå®ç¬¦ï¼å¯ä»¥æ¯å£°æä¸ç 声æè¯´æç¬¦åºå æ 声æç¬¦ çä¸é¨åï¼æè æ¯ new 表达å¼ä¸ç ç±»åæ è¯ çä¸é¨åï¼å³å®å¯¹è±¡ç叏鿧ææåæ§ï¼å¦ä¸æç¤ºï¼
- const 对象ââç±»å为 const-éå®ç å¯¹è±¡ï¼æ const 对象çé mutable å对象ãè¿ç§å¯¹è±¡ä¸è½ä¿®æ¹ï¼å°è¯ç´æ¥è¿ä¹åæ¯ç¼è¯æ¶é误ï¼èå°è¯é´æ¥è¿ä¹åï¼ä¾å¦éè¿å°é const ç±»åçå¼ç¨ææéä¿®æ¹ const 对象ï¼å¯¼è´æªå®ä¹è¡ä¸ºã
- volatile 对象ââç±»å为 volatile-éå®ç å¯¹è±¡ï¼æ volatile 对象çåå¯¹è±¡ï¼æ const volatile 对象ç mutable å对象ãéè¿ volatile éå®çç±»åçæ³å·¦å¼è¡¨è¾¾å¼çæ¯æ¬¡è®¿é®ï¼è¯»æåæä½ãæå彿°è°ç¨çï¼ï¼é½è¢«å½ä½å¯¹äºä¼åèè¨æ¯å¯è§çå¯ä½ç¨ï¼å³å¨å个æ§è¡çº¿ç¨å ï¼volatile 访é®ä¸è½è¢«ä¼åæï¼æè ä¸å¦ä¸æé¡ºåºæ©äºææé¡ºåºæäºè¯¥ volatile 访é®çå¯è§å¯ä½ç¨è¿è¡éæåºãè¿ä½¿å¾ volatile 对象éç¨äºä¸ä¿¡å·å¤ç彿°ä¹é´ç交æµï¼ä½ä¸éäºä¸å¦ä¸æ§è¡çº¿ç¨äº¤æµï¼åé std::memory_orderï¼ãè¯å¾éè¿é volatile æ³å·¦å¼æ¶æ volatile 对象ï¼ä¾å¦ï¼éè¿å°é volatile ç±»åçå¼ç¨ææéï¼ä¼å¯¼è´æªå®ä¹è¡ä¸ºã
- const volatile 对象ââç±»å为 const-volatile-éå®ç 对象ï¼const volatile 对象çé mutable å对象ï¼volatile 对象ç const åå¯¹è±¡ï¼æ const 对象çé mutable volatile å对象ãåæ¶è¡¨ç°ä¸º const å¯¹è±¡ä¸ volatile 对象ã
| æ¬èæªå®æ åå ï¼åºå½è¿ä¸æ¥è®¨è®º cv éå®å¯¹è±¡ä¸ cv éå®è¡¨è¾¾å¼çåºå« |
mutable 说æç¬¦
mutable- 容许å¨å³ä¾¿å å«å®ç对象被声æä¸º const æ¶ä»å¯ä¿®æ¹å£°æä¸º mutable çç±»æåã
å¯åºç°äºéå¼ç¨é const ç±»åçééææ°æ®æåç声æä¸ï¼
class X { mutable const int* p; // OK mutable int* const q; // éè¯æ };
mutable ç¨äºæå®ä¸å½±åç±»çå¤é¨å¯è§å¯ç¶æçæåï¼é常ç¨äºäºæ¥ä½ãè®°å¿ç¼åãæ°æ§æ±å¼åè®¿é®æä»¤çï¼ã
class ThreadsafeCounter { mutable std::mutex m; // âM&M è§åâï¼mutable ä¸ mutex ä¸å¹¶åºåº int data = 0; public: int get() const { std::lock_guard<std::mutex> lk(m); return data; } void inc() { std::lock_guard<std::mutex> lk(m); ++data; } };
转æ¢
åå¨ä¸ç§åºäºéå¶æ§çå¢é¿é¡ºåºç cv éå®ç¬¦çååºãä»èå¯ä»¥ç§°ç±»åå ·ææ´å¤ææ´å°ç cv éå®ï¼
- æ éå® <
const - æ éå® <
volatile - æ éå® <
const volatile -
const<const volatile -
volatile<const volatile
- æ éå® <
å° cv éå®ç±»åçå¼ç¨åæéè½è¢«éå¼è½¬æ¢å°æ´å¤ cv éå®çç±»åçå¼ç¨åæéãç¹å«æ¯å 许ä¸å转æ¢ï¼
- å°ééå®ç±»åçå¼ç¨/æéè½è¢«è½¬æ¢æå°
constçå¼ç¨/æé - å°ééå®ç±»åçå¼ç¨/æéè½è¢«è½¬æ¢æå°
volatileçå¼ç¨/æé - å°ééå®ç±»åçå¼ç¨/æéè½è¢«è½¬æ¢æå°
const volatileçå¼ç¨/æé - å°
constç±»åçå¼ç¨/æéè½è¢«è½¬æ¢æå°const volatileçå¼ç¨/æé - å°
volatileç±»åçå¼ç¨/æéè½è¢«è½¬æ¢æå°const volatileçå¼ç¨/æé
- å°ééå®ç±»åçå¼ç¨/æéè½è¢«è½¬æ¢æå°
- 注æï¼å¤çº§æéå¦æå ¶ä»éå¶ã
欲å°å° cv éå®ç±»åçå¼ç¨ææé转æ¢ä¸ºå°æ´å° cv éå®ç±»åçå¼ç¨ææéï¼å¿ é¡»ä½¿ç¨ const_castã
å ³é®è¯
注解
卿ªå£°æä¸º extern çéå±é¨é volatile 鿍¡æ¿ (C++14 èµ·)é inline (C++17 èµ·)åé声æä¸ä½¿ç¨ const éå®ç¬¦ï¼ä¼ç»äºè¯¥åéå
é¨è¿æ¥ãè¿æå«äº Cï¼å
¶ä¸ const æä»¶ä½ç¨åå¯¹è±¡æ¥æå¤é¨è¿æ¥ã
C++ è¯è¨ææ³æ mutable å½ååå¨ç±»è¯´æç¬¦èéç±»åéå®ç¬¦ï¼ä½å®ä¸å½±ååå¨ç±»æè¿æ¥ã
|
volatile çä¸äºç¨æ³è¢«å¼ç¨ï¼
|
(C++20 èµ·) |
示ä¾
int main() { int n1 = 0; // é const 对象 const int n2 = 0; // const 对象 int const n3 = 0; // const 对象ï¼å n2ï¼ volatile int n4 = 0; // volatile 对象 const struct { int n1; mutable int n2; } x = {0, 0}; // 带 mutable æåç const 对象  n1 = 1; // okï¼å¯ä¿®æ¹å¯¹è±¡ // n2 = 2; // é误ï¼ä¸å¯ä¿®æ¹å¯¹è±¡ n4 = 3; // okï¼å½åå¯æåº // x.n1 = 4; // é误ï¼const 对象çæå为 const x.n2 = 4; // okï¼const 对象ç mutable æå䏿¯ const  const int& r1 = n1; // ç»å®å°é const 对象ç const å¼ç¨ // r1 = 2; // é误ï¼è¯å¾éè¿å° const çå¼ç¨ä¿®æ¹ const_cast<int&>(r1) = 2; // okï¼ä¿®æ¹é const 对象 n1  const int& r2 = n2; // ç»å®å° const 对象ç const å¼ç¨ // r2 = 2; // é误ï¼è¯å¾éè¿å° const çå¼ç¨ä¿®æ¹ // const_cast<int&>(r2) = 2; // æªå®ä¹è¡ä¸ºï¼è¯å¾ä¿®æ¹ const 对象 n2 }
è¾åºï¼
# x86_64 å¹³å°ä¸çæçå
¸åæºå¨ç
# ï¼åªè¾åºè´¡ç®å¯è§æµå¯æåºç代ç ï¼
main:
movl $0, -4(%rsp) # volatile int n4 = 0;
movl $3, -4(%rsp) # n4 = 3;
xorl  %eax, %eax # return 0 ï¼éå¼ï¼
ret