æ¤æµè§å¨ä¸å忝æã
请åçº§å° Microsoft Edge ä»¥ä½¿ç¨ææ°çåè½ãå®å ¨æ´æ°åææ¯æ¯æã
注æ
è®¿é®æ¤é¡µé¢éè¦ææã å¯ä»¥å°è¯ç»å½ææ´æ¹ç®å½ã
è®¿é®æ¤é¡µé¢éè¦ææã å¯ä»¥å°è¯æ´æ¹ç®å½ã
欢è¿åå° C++ - ç°ä»£ C++
èªå建以æ¥ï¼C++ å³å·²æä¸ºä¸ç䏿叏ç¨çç¼ç¨è¯è¨ä¹ä¸ã æ£ç¡®ç¼åç C++ ç¨åºå¿«éã髿ã è¿ç§è¯è¨æ¯å ¶ä»è¯è¨æ´çµæ´»ï¼å®æ¢å¯ä»¥å·¥ä½å¨æé«çæ½è±¡å±æ¬¡ï¼ä¹å¯ä»¥ç´è¾¾ç¡ å±é¢ã
C++ æä¾é«åº¦ä¼åçæ ååºã 宿¯æè®¿é®ä½çº§å«ç¡¬ä»¶åè½ï¼ä»èæå¤§éåº¦å°æé«é度并æå¤§ç¨åº¦å°éä½å åéæ±ã C++ å ä¹å¯ä»¥å建任ä½ç±»åçç¨åºï¼æ¸¸æã设å¤é©±å¨ç¨åºãHigh-Performance 计ç®ãäºãæ¡é¢ãåµå ¥å¼åç§»å¨åºç¨çã å³ä½¿æ¯å ¶ä»ç¼ç¨è¯è¨çåºåç¼è¯å¨ä¹ä»¥ C++ ç¼åã
C++ çåå§è¦æ±ä¹ä¸æ¯ä¸ C è¯è¨ååå ¼å®¹ã å æ¤ï¼C++ å 许使ç¨åå§æéãæ°ç»ã以 null ç»å°¾çå符串åå ¶ä»åè½è¿è¡ C æ ·å¼ç¼ç¨ã å®ä»¬å¯ä»¥å®ç°åºè²çæ§è½ï¼ä½ä¹ä¼äº§ç bug å夿æ§ã
C++ çæ¼å强è°äºå¤§å¹ åå°ä½¿ç¨ C æ ·å¼æè¯çéæ±çåè½ã 妿éè¦ï¼ä½ ä»å¯ä»¥ä½¿ç¨æ§ç C ç¼ç¨è®¾æ½ã 使¯ï¼å¨æ°å¼ C++ 代ç ä¸ï¼å¯¹ä¸è¿°è®¾æ½çéæ±ä¼è¶æ¥è¶å°ã ç°ä»£ C++ ä»£ç æ´å ç®åãå®å ¨ãç¾è§ï¼èä¸é度ä»å以å¾ä¸æ ·å¿«éã
ä¸é¢å 个é¨åæ¦è¿°äºç°ä»£ C++ ç主è¦åè½ã æ¤å¤ååºçåè½å¨ C++11 åæ´é«çæ¬ä¸å¯ç¨ï¼é¤éå¦æè¯´æã å¨ Microsoft C++ ç¼è¯å¨ä¸ï¼å¯ä»¥è®¾ç½® /std ç¼è¯å¨éé¡¹ï¼æå®è¦ç¨äºé¡¹ç®çæ åçæ¬ã
èµæºåæºè½æé
C æ ·å¼ç¼ç¨çä¸ä¸ªä¸»è¦ bug ç±»åæ¯å
åæ³æ¼ã æ³æ¼é常æ¯ç±äºæªå¯¹ä½¿ç¨ new åé
çå
åè°ç¨ delete è导è´çã ç°ä»£ C++ 强è°âèµæºè·åå³åå§åâ(RAII) ååã
å ¶ç念å¾ç®åã èµæºï¼å¦å å åãæä»¶å¥æå奿¥åï¼åºå½å¯¹è±¡ ææ ã 该对象å¨å ¶æé 彿°ä¸åå»ºææ¥æ¶æ°åé çèµæºï¼å¹¶å¨å ¶ææå½æ°ä¸å°æ¤èµæºå é¤ã RAII ååå¯ç¡®ä¿å½æå±å¯¹è±¡è¶ åºèå´æ¶ï¼ææèµæºé½è½æ£ç¡®è¿åå°æä½ç³»ç»ã
ä¸ºäºæ¯æè½»æ¾éç¨ RAII ååï¼C++ æ ååºæä¾äºä¸ç§æºè½æéç±»åï¼
æºè½æéå¤çå
¶æ¥æçå
åçåé
åå é¤ã ä¸é¢çç¤ºä¾æ¼ç¤ºäºä¸ä¸ªç±»ï¼å
¶ä¸å
å«ä¸ä¸ªæ°ç»æåï¼è¯¥æåæ¯å¨è°ç¨ make_unique() æ¶å¨å ä¸åé
çã ç±» unique_ptr å°è£
对 new å delete. çè°ç¨ã
widgetå½å¯¹è±¡è¶
åºèå´æ¶ï¼unique_ptrå°è°ç¨ææå½æ°ï¼å¹¶éæ¾ä¸ºæ°ç»åé
çå
åã
#include <memory>
class widget
{
private:
std::unique_ptr<int[]> data;
public:
widget(const int size) { data = std::make_unique<int[]>(size); }
void do_something() {}
};
void functionUsingWidget() {
widget w(1000000); // lifetime automatically tied to enclosing scope
// constructs w, including the w.data gadget member
// ...
w.do_something();
// ...
} // automatic destruction and deallocation for w and w.data
请尽å¯è½å°ä½¿ç¨æºè½æé管çå å
åã 妿å¿
é¡»æ¾å¼ä½¿ç¨ new å delete è¿ç®ç¬¦ï¼è¯·éµå¾ª RAII ååã æå
³è¯¦ç»ä¿¡æ¯ï¼è¯·åé
对象çåæåèµæºç®¡ç (RAII)ã
std::string å std::string_view
C æ ·å¼åç¬¦ä¸²æ¯ bug çå¦ä¸ä¸ªä¸»è¦æ¥æºã éè¿ä½¿ç¨ std::string å std::wstringï¼å ä¹å¯ä»¥æ¶é¤ä¸ C æ ·å¼å符串å
³èçææé误ã ä½ è¿å¯ä»¥äº«ææå彿°å¸¦æ¥ç便å©ï¼ä¾å¦æç´¢ã追å ãå置追å çã 两è
é½å¯¹é度è¿è¡äºé«åº¦ä¼åã å°åç¬¦ä¸²ä¼ éå°ä»
éè¦åªè¯»è®¿é®æéç彿°æ¶ï¼å¨ C++17 ä¸ï¼å¯ä»¥ä½¿ç¨ std::string_viewï¼ä»¥ä¾¿æé«æ§è½ã
std::vector åå
¶ä»æ ååºå®¹å¨
æ ååºå®¹å¨é½éµå¾ª RAII ååã å®ä»¬ä¸ºå®å
¨éåå
ç´ æä¾è¿ä»£å¨ã å®ä»¬é对æ§è½è¿è¡äºé«åº¦ä¼åï¼å¹¶ç»è¿äºå
¨é¢æµè¯ï¼ä»¥ç¡®ä¿å
¶æ£ç¡®æ§ã éè¿ä½¿ç¨è¿äºå®¹å¨ï¼å¯ä»¥æ¶é¤èªå®ä¹æ°æ®ç»æä¸å¯è½å¼å
¥ç bug æä½æé®é¢ã ä½¿ç¨ vector æ¿ä»£åå§æ°ç»ï¼æ¥ä½ä¸º C++ ä¸çåºå容å¨ã
vector<string> apples;
apples.push_back("Granny Smith");
ä½¿ç¨ mapï¼è䏿¯ unordered_mapï¼ï¼ä½ä¸ºé»è®¤å
³è容å¨ã 对äºéåå夿¡ä¾ï¼ä½¿ç¨ setãmultimap å multisetã
map<string, string> apple_color;
// ...
apple_color["Granny Smith"] = "Green";
éè¦æ§è½ä¼åæ¶ï¼è¯·èè使ç¨ï¼
- ä½¿ç¨æ åºçå
³è容å¨ï¼ä¾å¦
unordered_mapã è¿äºå®¹å¨çå个å ç´ å¼éæ´ä½ï¼å¹¶ä¸æ¯æå¸¸éæ¶é´æ¥æ¾ï¼ä½è¦æ£ç¡®ä¸é«æå°ä½¿ç¨å®ä»¬ï¼é¾åº¦ä¹æ´å¤§ã - å·²æåº
vectorã æå ³è¯¦ç»ä¿¡æ¯ï¼è¯·åé ç®æ³ã
请å¿ä½¿ç¨ C æ ·å¼æ°ç»ã 对äºéè¦ç´æ¥è®¿é®æ°æ®çæ§ APIï¼è¯·æ¹ç¨ f(vec.data(), vec.size()); ç访é®å¨æ¹æ³ã æå
³å®¹å¨ç详ç»ä¿¡æ¯ï¼è¯·åé
C++ æ ååºå®¹å¨ã
æ ååºç®æ³
å¨å设éè¦ä¸ºç¨åºç¼åèªå®ä¹ç®æ³ä¹åï¼è¯·æ¥ç C++ æ ååº ç®æ³ã æ ååºå å«è®¸å¤å¸¸è§æä½ï¼å¦æç´¢ãæåºãçéåéæºåï¼çç®æ³åç±»ï¼è¿äºåç±»å¨ä¸æå¢é¿ã æ°å¦åºçå 容å¾å¹¿æ³ã å¨ C++17 åæ´é«çæ¬ä¸ï¼æä¾äºè®¸å¤ç®æ³çå¹¶è¡çæ¬ã
以䏿¯ä¸äºéè¦ç¤ºä¾ï¼
-
for_eachï¼é»è®¤éåç®æ³ä»¥ååºäºforèå´ç循ç¯ã -
transformï¼ç¨äºéåä½ä¿®æ¹å®¹å¨å ç´ ã -
find_ifï¼é»è®¤æç´¢ç®æ³ã -
sortãlower_boundåå ¶ä»é»è®¤çæåºåæç´¢ç®æ³ã
è¥è¦ç¼åæ¯è¾è¿ç®ç¬¦ï¼è¯·ä½¿ç¨ä¸¥æ ¼ç <ï¼å¹¶å°½å¯è½ä½¿ç¨å½å lambdaã
auto comp = [](const widget& w1, const widget& w2)
{ return w1.weight() < w2.weight(); }
sort( v.begin(), v.end(), comp );
auto i = lower_bound( v.begin(), v.end(), widget{0}, comp );
ç¨ auto æ¿ä»£æ¾å¼ç±»ååç§°
C++11 å¼å
¥äº auto å
³é®åï¼ä»¥ä¾¿å¯å°å
¶ç¨äºåéã彿°å模æ¿å£°æä¸ã
auto ä¼æç¤ºç¼è¯å¨æ¨å¯¼å¯¹è±¡çç±»åï¼è¿æ ·ä½ å°±æ éæ¾å¼é®å
¥ç±»åã 彿¨å¯¼åºçç±»åæ¯åµå¥æ¨¡æ¿æ¶ï¼auto å°¤å
¶æç¨ï¼
map<int,list<string>>::iterator i = m.begin(); // C-style
auto i = m.begin(); // modern C++
åºäºèå´ç for 循ç¯
对æ°ç»å容å¨ç C æ ·å¼è¿ä»£å®¹æå¼åç´¢å¼é误ï¼èä¸é®å
¥è¿ç¨åè°ä¹å³ã è¥è¦æ¶é¤è¿äºé误ï¼å¹¶æé«ä»£ç çå¯è¯»æ§ï¼å¯ä½¿ç¨åºäºèå´ç for 循ç¯ï¼æ¤å¾ªç¯å
嫿 ååºå®¹å¨ååå§æ°ç»ã æå
³è¯¦ç»ä¿¡æ¯ï¼è¯·åé
åºäºèå´ç for è¯å¥ã
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v {1,2,3};
// C-style
for(int i = 0; i < v.size(); ++i)
{
std::cout << v[i];
}
// Modern C++:
for(auto& num : v)
{
std::cout << num;
}
}
ç¨ constexpr è¡¨è¾¾å¼æ¿ä»£å®
C å C++ ä¸ç宿¯æç¼è¯ä¹åç±é¢å¤çå¨å¤ççæ è®°ã å¨ç¼è¯æä»¶ä¹åï¼å®æ è®°çæ¯ä¸ªå®ä¾é½å°æ¿æ¢ä¸ºå
¶å®ä¹çå¼æè¡¨è¾¾å¼ã C æ ·å¼ç¼ç¨é常使ç¨å®æ¥å®ä¹ç¼è¯æ¶å¸¸éå¼ã ä½å®å®¹æåºéä¸é¾ä»¥è°è¯ã å¨ç°ä»£ C++ ä¸ï¼åºä¼å
ä½¿ç¨ constexpr åéå®ä¹ç¼è¯æ¶å¸¸éï¼
#define SIZE 10 // C-style
constexpr int size = 10; // modern C++
ç»ä¸åå§å
å¨ç°ä»£ C++ ä¸ï¼å¯ä»¥ä½¿ç¨ä»»ä½ç±»åçæ¬å·åå§åã å¨åå§åæ°ç»ãç¢éæå
¶ä»å®¹å¨æ¶ï¼è¿ç§åå§åå½¢å¼ä¼é常æ¹ä¾¿ã å¨ä¸é¢ç示ä¾ä¸ï¼v2 使ç¨ä¸ä¸ª S å®ä¾è¿è¡åå§åã
v3 使ç¨ä¸ä¸ª S å®ä¾è¿è¡åå§åï¼èè¿ä¸ä¸ªå®ä¾æ¬èº«ä¹æ¯ä½¿ç¨å¤§æ¬å·åå§åçã ç¼è¯å¨åºäº v3 声æçç±»åæ¨ææ¯ä¸ªå
ç´ çç±»åã
#include <vector>
struct S
{
std::string name;
float num;
S(std::string s, float f) : name(s), num(f) {}
};
int main()
{
// C-style initialization
std::vector<S> v;
S s1("Norah", 2.7);
S s2("Frank", 3.5);
S s3("Jeri", 85.9);
v.push_back(s1);
v.push_back(s2);
v.push_back(s3);
// Modern C++:
std::vector<S> v2 {s1, s2, s3};
// or...
std::vector<S> v3{ {"Norah", 2.7}, {"Frank", 3.5}, {"Jeri", 85.9} };
}
è¥è¦äºè§£è¯¦ç»ä¿¡æ¯ï¼è¯·åé æ¬å·åå§åã
ç§»å¨è¯ä¹
ç°ä»£ C++ æä¾äºç§»å¨è¯ä¹ï¼æ¤åè½å¯ä»¥é¿å è¿è¡ä¸å¿ è¦çå åå¤å¶ã 卿¤è¯è¨çæ©æçæ¬ä¸ï¼å¨æäºæ åµä¸æ æ³é¿å å¤å¶ã ç§»å¨æä½ä¼å°èµæºçæææä»ä¸ä¸ªå¯¹è±¡è½¬ç§»å°ä¸ä¸ä¸ªå¯¹è±¡ï¼èä¸å¿ åè¿è¡å¤å¶ã ä¸äºç±»æ¥æå å åãæä»¶å¥æçèµæºã
å®ç°æ¥æèµæºçç±»æ¶ï¼å¯ä»¥ä¸ºå ¶å®ä¹ç§»å¨æé 彿°åç§»å¨èµå¼è¿ç®ç¬¦ã å¨è§£æéè½½æé´ï¼å¦æä¸éè¦è¿è¡å¤å¶ï¼ç¼è¯å¨ä¼éæ©è¿äºç¹æ®æåã 妿å®ä¹äºç§»å¨æé 彿°ï¼åæ ååºå®¹å¨ç±»åä¼å¨å¯¹è±¡ä¸è°ç¨æ¤å½æ°ã æå ³è¯¦ç»ä¿¡æ¯ï¼è¯·åé ç§»å¨æé 彿°åç§»å¨èµå¼è¿ç®ç¬¦ (C++)ã
Lambda 表达å¼
å¨ C æ ·å¼ç¼ç¨ä¸ï¼å¯ä»¥éè¿ä½¿ç¨å½æ°æéå°å½æ°ä¼ éå°å¦ä¸ä¸ªå½æ°ã 彿°æéä¸ä¾¿äºç»´æ¤åçè§£ã å®ä»¬å¼ç¨ç彿°å¯è½å¨æºä»£ç ä¸çå ¶ä»ä½ç½®å®ä¹ï¼è¿ç¦»è°ç¨å®çç¹ã æ¤å¤ï¼å®ä»¬ä¸å ·å¤ç±»åå®å ¨æ§ã
ç°ä»£ C++ æä¾äºå½æ°å¯¹è±¡ï¼å³éè½½äº operator() è¿ç®ç¬¦çç±»ï¼å æ¤å¯ä»¥å彿°ä¸æ ·è¢«è°ç¨ã åå»ºå½æ°å¯¹è±¡çæç®ä¾¿æ¹æ³æ¯ä½¿ç¨å
è lambda 表达å¼ã 以ä¸ç¤ºä¾æ¼ç¤ºå¦ä½ä½¿ç¨ lambda 表达å¼ä¼ é彿°å¯¹è±¡ï¼è¯¥ find_if 彿°å¨åéä¸çæ¯ä¸ªå
ç´ ä¸è°ç¨è¯¥å¯¹è±¡ï¼
std::vector<int> v {1,2,3,4,5};
int x = 2;
int y = 4;
auto result = find_if(begin(v), end(v), [=](int i) { return i > x && i < y; });
å¯ä»¥å° lambda è¡¨è¾¾å¼ [=](int i) { return i > x && i < y; } ç解为âéç¨ç±»å int çåä¸ªåæ°å¹¶è¿åä¸ä¸ªå¸å°å¼æ¥è¡¨ç¤ºæ¤åæ°æ¯å¦å¤§äº x å¹¶ä¸å°äº y ç彿°âã请注æï¼å¯å¨ lambda ä¸ä½¿ç¨æ¥èªå¨å´ä¸ä¸æç x å y åéã
[=] æå®è¿äºåéæå¼ æè·ã æ¢å¥è¯è¯´ï¼lambda 表达å¼å
·æå
¶èªå·±çè¿äºå¼å¯æ¬ã
å¼å¸¸
ä¸é误代ç ç¸æ¯ï¼æ°å¼ C++ æ´æ³¨éå¼å¸¸ï¼å°å ¶ä½ä¸ºæ¥ååå¤çé误æ¡ä»¶çæä½³æ¹æ³ã æå ³è¯¦ç»ä¿¡æ¯ï¼è¯·åé ç°ä»£ C++ å¤çå¼å¸¸åé误çæä½³åæ³ã
std::atomic
对线ç¨é´éä¿¡æºå¶ä½¿ç¨ C++ æ ååº std::atomic ç»æåç¸å
³ç±»åã
std::variant ï¼C++17ï¼
å¨ C 飿 ¼ç¼ç¨ä¸ï¼èåä½é常ç¨äºéè¿ä½¿ä¸åç±»åçæåå
±äº«åä¸å
åä½ç½®æ¥èçå
åã èå䏿¯ç±»åå®å
¨çï¼å¹¶ä¸å®¹æåºç°ç¼ç¨é误ã C++17 å¼å
¥äºæ´å å®å
¨å¯é ç std::variant ç±»ï¼æ¥ä½ä¸ºå¹¶éçæ¿ä»£é¡¹ã å¯ä»¥ä½¿ç¨ std::visit 彿°ä»¥ç±»åå®å
¨çæ¹å¼è®¿é® variant ç±»åçæåã
