# C++ é¢è¯é¢
C++è®ç»è¥ (opens new window)ï¼é对对é¢è¯æ±èç C++ å¼åç¹è®ï¼å¤§å导å¸å ¨ç¨å¸¦ç»ï¼å¸®å©å¦åä»è¯æ³åºç¡å°é¡¹ç®å®æï¼å²å»é«èªoffer
å¤§å®¶å¥½ï¼ææ¯å°æã
说å®è¯ï¼C++ çé¢è¯æ¯ææè¯è¨éæè§å¾æé¾åå¤çï¼å 为å®èçä¸è¥¿å®å¨å¤ªæäºãä½ ä»¥ä¸ºæè¯æ³èçå°±å¤äºï¼ç»æé¢è¯å®ä¸æ¥å°±é®ä½ è彿°è¡¨çå
åå¸å±ãæºè½æéçå¼ç¨è®¡æ°å®ç°ï¼æè
ç´æ¥è®©ä½ æåä¸ä¸ª shared_ptrã
è¿ç¯æç« æ C++ é¢è¯ä¸é«é¢åºç°çé®é¢é½æ´ç䏿¥äºï¼åºæ¬ä¸è¦çäºä»åºç¡è¯æ³å°å å管çãä»é¢åå¯¹è±¡å° STLãåå° C++11 æ°ç¹æ§è¿ä¸æ´æ¡çº¿ãå 容ä¸ç®å°ï¼ä½æå°½éææ¯ä¸ªç¥è¯ç¹é½è®²æ¸ æ¥ï¼ä¸åªæ¯ç»ä½ ä¸ä¸ªç»è®ºï¼èæ¯æèåçåçä¹è¯´æç½ï¼å 为å¾å¤é¢è¯å®å°±æ¯å欢追çé®"为ä»ä¹"ã
è¿é颿å åå 容ç¹å«å¼å¾éç¹å ³æ³¨ï¼
- æéåå å管çï¼è¿æ¯ C++ çæ ¸å¿ï¼æ¬ç©ºæéãéæéãmalloc/new çåºå«ãå å对é½ï¼é¢è¯å ä¹å¿ é®ã
- è彿°å夿ï¼è彿°è¡¨çç»æã纯è彿°ã为ä»ä¹ææå½æ°è¦åæè彿°ï¼è¿äºæ¯é¢å对象é¨åçéç¹ã
- STL 容å¨ï¼åç§å®¹å¨çåºå±å®ç°ãè¿ä»£å¨å¤±æçåºæ¯ï¼
mapåunordered_mapçåºå«ï¼å«åªä¼ç¨ï¼è¦ç¥éåçã - æºè½æéï¼
shared_ptrãunique_ptrãweak_ptrç使ç¨å循ç¯å¼ç¨é®é¢ï¼ç°å¨å 乿¯æ é èç¹ã - C++11 æ°ç¹æ§ï¼å³å¼å¼ç¨ãç§»å¨è¯ä¹ãlambda 表达å¼ã
autoæ¨å¯¼ï¼è¿äºå¨å¤§åé¢è¯éé®å¾è¶æ¥è¶å¤ã
å¦æä½ æ¯åå¼å§åå¤ï¼å»ºè®®å æ C++ åºç¡åé¢å对象çé¨åæéï¼åå»ç STL åæ°ç¹æ§ãéå°ä¸çè§£çå°æ¹å¤ç»å代ç å»çï¼å é èæ¯å¾é¾çæ£ææ¡çã
# C++åºç¡
# ä»ä¹æ¯æéï¼æéç大å°åç¨æ³ï¼
æéï¼ æåå¦å¤ä¸ç§ç±»åçå¤åç±»åã æéç大å°ï¼ å¨ 64 ä½è®¡ç®æºä¸ï¼æéå 8 个åè空é´ã
#include<iostream>
using namespace std;
int main(){
int *p = nullptr;
cout << sizeof(p) << endl; // 8
char *p1 = nullptr;
cout << sizeof(p1) << endl; // 8
return 0;
}
æéçç¨æ³ï¼
æåæ®é对象çæé:
#include <iostream>
using namespace std;
class A
{
};
int main()
{
A *p = new A();
return 0;
}
æå常é对象çæéï¼å¸¸éæé
#include <iostream>
using namespace std;
int main(void)
{
const int c_var = 10;
const int * p = &c_var;
cout << *p << endl;
return 0;
}
æå彿°çæéï¼å½æ°æé
#include <iostream>
using namespace std;
int add(int a, int b){
return a + b;
}
int main(void)
{
int (*fun_p)(int, int);
fun_p = add;
cout << fun_p(1, 6) << endl;
return 0;
}
æå对象æåçæéï¼å æ¬æå对象æå彿°çæéåæå对象æååéçæéã ç¹å«æ³¨æï¼å®ä¹æåæå彿°çæéæ¶ï¼è¦æ ææéæå±çç±»ã
#include <iostream>
using namespace std;
class A
{
public:
int var1, var2;
int add(){
return var1 + var2;
}
};
int main()
{
A ex;
ex.var1 = 3;
ex.var2 = 4;
int *p = &ex.var1; // æå对象æååé
cout << *p << endl;
int (A::*fun_p)(); // æå彿°æé
fun_p = &A::add; // å¿
é¡»å &
cout << (ex.*fun_p)() << endl; // è°ç¨æå彿°
return 0;
}
this æéï¼æåç±»çå½å对象çæé常éã
#include <iostream>
#include <cstring>
using namespace std;
class A
{
public:
void set_name(string tmp)
{
this->name = tmp;
}
void set_age(int tmp)
{
this->age = age;
}
void set_sex(int tmp)
{
this->sex = tmp;
}
void show()
{
cout << "Name: " << this->name << endl;
cout << "Age: " << this->age << endl;
cout << "Sex: " << this->sex << endl;
}
private:
string name;
int age;
int sex;
};
int main()
{
A *p = new A();
p->set_name("Alice");
p->set_age(16);
p->set_sex(1);
p->show();
return 0;
}
# ä»ä¹æ¯éæéåæ¬ç©ºæéï¼
æ¬ç©ºæéï¼ è¥æéæåä¸åå å空é´ï¼å½è¿åå å空é´è¢«éæ¾åï¼è¯¥æéä¾ç¶æåè¿åå å空é´ï¼æ¤æ¶ï¼ç§°è¯¥æéä¸ºâæ¬ç©ºæéâã
void *p = malloc(size);
free(p);
// æ¤æ¶ï¼p æåçå
å空é´å·²éæ¾ï¼ p å°±æ¯æ¬ç©ºæéã
âéæéâæ¯æä¸ç¡®å®å ¶æåçæéï¼æªåå§åçæé为âéæéâã
void *p;
// æ¤æ¶ p æ¯âéæéâã
# æéåå¼ç¨çåºå«æ¯ä»ä¹ï¼
- æéææåçå å空é´å¨ç¨åºè¿è¡è¿ç¨ä¸å¯ä»¥æ¹åï¼èå¼ç¨æç»å®çå¯¹è±¡ä¸æ¦ç»å®å°±ä¸è½æ¹åãï¼æ¯å¦å¯åï¼
- æéæ¬èº«å¨å åä¸å æå å空é´ï¼å¼ç¨ç¸å½äºåéçå«åï¼å¨å åä¸ä¸å å å空é´ãï¼æ¯å¦å å åï¼
- æéå¯ä»¥ä¸ºç©ºï¼ä½æ¯å¼ç¨å¿ é¡»ç»å®å¯¹è±¡ãï¼æ¯å¦å¯ä¸ºç©ºï¼
- æéå¯ä»¥æå¤çº§ï¼ä½æ¯å¼ç¨åªè½ä¸çº§ãï¼æ¯å¦è½ä¸ºå¤çº§ï¼
# 常éæéåæé常éçåºå«æ¯ä»ä¹ï¼
常éæéï¼å¸¸éæéæ¬è´¨ä¸æ¯ä¸ªæéï¼åªä¸è¿è¿ä¸ªæéæåç对象æ¯å¸¸éãä¹å°±æ¯è¯´ï¼ä¸å¯ä»¥éè¿å¯¹æéè§£å¼ç¨ä¿®æ¹æéæåçå 容ï¼èå¯ä»¥ä¿®æ¹æéçæåã
ç¹ç¹ï¼const çä½ç½®å¨æé声æè¿ç®ç¬¦ *ç左侧ãåªè¦ const ä½äº* çå·¦ä¾§ï¼æ 论å®å¨ç±»ååç左边æå³è¾¹ï¼é½è¡¨ç¤ºæå常éçæéãï¼å¯ä»¥è¿æ ·çè§£ï¼* 左侧表示æéæåç对象ï¼è¯¥å¯¹è±¡ä¸ºå¸¸éï¼é£ä¹è¯¥æé为常éæéãï¼
const int * p;
int const * p;
注æ 1ï¼æéæåç对象ä¸è½éè¿è¿ä¸ªæéæ¥ä¿®æ¹ï¼ä¹å°±æ¯è¯´å¸¸éæéå¯ä»¥è¢«èµå¼ä¸ºåéçå°åï¼ä¹æä»¥å«å常éæéï¼æ¯éå¶äºéè¿è¿ä¸ªæéä¿®æ¹åéçå¼ã
#include <iostream>
using namespace std;
int main()
{
const int c_var = 8;
const int *p = &c_var;
*p = 6; // error: assignment of read-only location '* p'
return 0;
}
注æ 2ï¼è½ç¶å¸¸éæéæåç对象ä¸è½ååï¼å¯æ¯å 为常éæéæ¬èº«æ¯ä¸ä¸ªåéï¼å æ¤ï¼å¯ä»¥è¢«éæ°èµå¼ãä¾å¦ï¼
#include <iostream>
using namespace std;
int main()
{
const int c_var1 = 8;
const int c_var2 = 8;
const int *p = &c_var1;
p = &c_var2;
return 0;
}
æé常éçæ¬è´¨ä¸æ¯ä¸ªå¸¸éï¼åªä¸è¿è¿ä¸ªå¸¸éç弿¯ä¸ä¸ªæéï¼åä¸é¢é£ä¸ªæ°æ°ç¸åï¼ä¸å¯ä»¥ä¿®æ¹æéçæåï¼ä½å¯ä»¥éè¿å¯¹æéè§£å¼ç¨ä¿®æ¹æéæåçå 容ã
ç¹ç¹ï¼const ä½äºæé声ææä½ç¬¦å³ä¾§ï¼è¡¨æè¯¥å¯¹è±¡æ¬èº«æ¯ä¸ä¸ªå¸¸éï¼ å·¦ä¾§è¡¨ç¤ºè¯¥æéæåçç±»åï¼å³ä»¥ 为åç线ï¼å ¶å·¦ä¾§è¡¨ç¤ºæéæåçç±»åï¼å³ä¾§è¡¨ç¤ºæéæ¬èº«çæ§è´¨ã
const int var;
int * const c_p = &var;
注æ 1ï¼æé常éç弿¯æéï¼è¿ä¸ªå¼å 为æ¯å¸¸éï¼æä»¥æéæ¬èº«ä¸è½æ¹åã
#include <iostream>
using namespace std;
int main()
{
int var, var1;
int * const c_p = &var;
c_p = &var1; // error: assignment of read-only variable 'c_p'
return 0;
}
注æ 2ï¼æéçå 容å¯ä»¥æ¹åã
#include <iostream>
using namespace std;
int main()
{
int var = 3;
int * const c_p = &var;
*c_p = 12;
return 0;
}
# 彿°æéåæé彿°çåºå«æ¯ä»ä¹ï¼
æé彿°æ¬è´¨æ¯ä¸ä¸ªå½æ°ï¼åªä¸è¿è¯¥å½æ°çè¿å弿¯ä¸ä¸ªæéãç¸å¯¹äºæ®é彿°èè¨ï¼åªæ¯è¿å弿¯æéã
#include <iostream>
using namespace std;
struct Type
{
int var1;
int var2;
};
Type * fun(int tmp1, int tmp2){
Type * t = new Type();
t->var1 = tmp1;
t->var2 = tmp2;
return t;
}
int main()
{
Type *p = fun(5, 6);
return 0;
}
彿°æéæ¬è´¨æ¯ä¸ä¸ªæéåéï¼åªä¸è¿è¿ä¸ªæéæåä¸ä¸ªå½æ°ã彿°æé峿å彿°çæéã举ä¾ï¼
#include <iostream>
using namespace std;
int fun1(int tmp1, int tmp2)
{
return tmp1 * tmp2;
}
int fun2(int tmp1, int tmp2)
{
return tmp1 / tmp2;
}
int main()
{
int (*fun)(int x, int y);
fun = fun1;
cout << fun(15, 5) << endl;
fun = fun2;
cout << fun(15, 5) << endl;
return 0;
}
/*
è¿è¡ç»æï¼
75
3
两è åºå«ï¼
- 彿°æéæ¯ä¸ªæéï¼ä¸é¨æå彿°çæéåéï¼æ¯å¦è½åæä¸ªå½æ°çå°åï¼éè¿å®è½è°ç¨å¯¹åºç彿°ã
- æé彿°åæ¯ä¸ªå½æ°ï¼åªæ¯è¿ä¸ªå½æ°çè¿å弿¯æéç±»åï¼è°ç¨åä¼å¾å°ä¸ä¸ªæéç»æã
å ³é®çååæåä¿©åï¼â彿°æéâ æ ¸å¿æ¯æéï¼ç¨æ¥æå彿°ï¼âæé彿°â æ ¸å¿æ¯å½æ°ï¼ç¹ç¹æ¯è¿åæéãå«è¢«åå顺åºè¿·æï¼éç¹å¨ç»å°¾ï¼ä¸ä¸ªæ¯æéï¼ä¸ä¸ªæ¯å½æ°ï¼è¿å°±æ¯ä¸¤è ææ ¹æ¬çä¸åã
# æéåå¼ç¨å¼ä¼ éçåºå«æ¯ä»ä¹ï¼
- å¼ä¼ 鿝æå°åæ°çå¼å¤å¶ä¸ä»½ï¼ä¼ éç»å½æ°ææ¹æ³è¿è¡æä½ãå¨å¼ä¼ éä¸ï¼å½æ°ææ¹æ³å¯¹åæ°è¿è¡ä¿®æ¹ä¸ä¼å½±åå°åå§çåéå¼ã
- æéå¼ç¨æ¯æå°åæ°çå åå°åä¼ éç»å½æ°ææ¹æ³ï¼ä½¿å¾å½æ°ææ¹æ³å¯ä»¥ç´æ¥è®¿é®åä¿®æ¹åå§åéçå¼ã卿éå¼ç¨ä¸ï¼å½æ°ææ¹æ³å¯¹åæ°çä¿®æ¹ä¼ç´æ¥åæ å¨åå§åéä¸ã
# 彿°ä¼ åç¨å¼ç¨çä½ç¨æ¯ä»ä¹ï¼
å¯ä»¥é¿å é¿å æ·è´ï¼ä½¿ç¨å¼ç¨ä¼ åå¯ä»¥é¿å 对大å对象è¿è¡å¤å¶ãå¦æä¼ éä¸ä¸ªå¯¹è±¡ä½ä¸ºå¼åæ°ï¼ä¼è§¦åå¯¹è±¡çæ·è´æé 彿°ï¼é æé¢å¤çå¼éãè使ç¨å¼ç¨ä¼ åï¼å¯ä»¥ç´æ¥å¨å½æ°ä¸æä½åå§å¯¹è±¡ï¼é¿å äºæ·è´æä½ã
# åæ°ä¼ éæ¶ï¼å¼ä¼ éãå¼ç¨ä¼ éãæéä¼ éçåºå«ï¼
åæ°ä¼ éçä¸ç§æ¹å¼ï¼
- å¼ä¼ éï¼å½¢åæ¯å®åçæ·è´ï¼å½æ°å¯¹å½¢åçæææä½ä¸ä¼å½±åå®åã
- æéä¼ éï¼æ¬è´¨ä¸æ¯å¼ä¼ éï¼åªä¸è¿æ·è´çæ¯æéçå¼ï¼æ·è´ä¹åï¼å®åå形忝ä¸åçæéï¼éè¿æéå¯ä»¥é´æ¥çè®¿é®æéææåç对象ï¼ä»èå¯ä»¥ä¿®æ¹å®ææå¯¹è±¡çå¼ã
- å¼ç¨ä¼ éï¼å½å½¢åæ¯å¼ç¨ç±»åæ¶ï¼æä»¬è¯´å®å¯¹åºçå®å被å¼ç¨ä¼ éã
#include <iostream>
using namespace std;
void fun1(int tmp){ // å¼ä¼ é
cout << &tmp << endl;
}
void fun2(int * tmp){ // æéä¼ é
cout << tmp << endl;
}
void fun3(int &tmp){ // å¼ç¨ä¼ é
cout << &tmp << endl;
}
int main()
{
int var = 5;
cout << "var å¨ä¸»å½æ°ä¸çå°åï¼" << &var << endl;
cout << "var å¼ä¼ éæ¶çå°åï¼";
fun1(var);
cout << "var æéä¼ éæ¶çå°åï¼";
fun2(&var);
cout << "var å¼ç¨ä¼ éæ¶çå°åï¼";
fun3(var);
return 0;
}
/*
è¿è¡ç»æï¼
var å¨ä¸»å½æ°ä¸çå°åï¼0x23fe4c
var å¼ä¼ éæ¶çå°åï¼0x23fe20
var æéä¼ éæ¶çå°åï¼0x23fe4c
var å¼ç¨ä¼ éæ¶çå°åï¼0x23fe4c
*/
说æï¼ä»ä¸è¿°ä»£ç çè¿è¡ç»æå¯ä»¥çåºï¼åªæå¨å¼ä¼ éæ¶ï¼å½¢ååå®åçå°åä¸ä¸æ ·ï¼å¨å½æ°ä½å æä½ç䏿¯åéæ¬èº«ãå¼ç¨ä¼ éåæéä¼ éï¼å¨å½æ°ä½å æä½çæ¯åéæ¬èº«ã
# C++å ¨å±åéãå±é¨åéãéæå ¨å±åéãéæå±é¨åéçåºå«ï¼
C++ åéæ ¹æ®å®ä¹çä½ç½®çä¸åççå½å¨æï¼å ·æä¸åçä½ç¨åï¼ä½ç¨åå¯å为 6 ç§ï¼å ¨å±ä½ç¨åï¼å±é¨ä½ç¨åï¼è¯å¥ä½ç¨åï¼ç±»ä½ç¨åï¼å½å空é´ä½ç¨ååæä»¶ä½ç¨åã
ä»ä½ç¨åçï¼
- å ¨å±åéï¼å ·æå ¨å±ä½ç¨åãå ¨å±åéåªéå¨ä¸ä¸ªæºæä»¶ä¸å®ä¹ï¼å°±å¯ä»¥ä½ç¨äºææçæºæä»¶ãå½ç¶ï¼å ¶ä»ä¸å å«å ¨å±åéå®ä¹çæºæä»¶éè¦ç¨extern å ³é®å忬¡å£°æè¿ä¸ªå ¨å±åéã
- éæå ¨å±åéï¼å ·ææä»¶ä½ç¨åãå®ä¸å ¨å±åéçåºå«å¨äºå¦æç¨åºå å«å¤ä¸ªæä»¶çè¯ï¼å®ä½ç¨äºå®ä¹å®çæä»¶éï¼ä¸è½ä½ç¨å°å ¶å®æä»¶éï¼å³è¢«static å ³é®å修饰è¿çåéå ·ææä»¶ä½ç¨åãè¿æ ·å³ä½¿ä¸¤ä¸ªä¸åçæºæä»¶é½å®ä¹äºç¸åååçéæå ¨å±åéï¼å®ä»¬ä¹æ¯ä¸åçåéã
- å±é¨åéï¼å ·æå±é¨ä½ç¨åã宿¯èªå¨å¯¹è±¡ï¼autoï¼ï¼å¨ç¨åºè¿è¡æé´ä¸æ¯ä¸ç´åå¨ï¼èæ¯åªå¨å½æ°æ§è¡æé´åå¨ï¼å½æ°ç䏿¬¡è°ç¨æ§è¡ç»æåï¼åé被æ¤éï¼å ¶æå ç¨çå åä¹è¢«æ¶åã
- éæå±é¨åéï¼å ·æå±é¨ä½ç¨åãå®åªè¢«åå§å䏿¬¡ï¼èªä»ç¬¬ä¸æ¬¡è¢«åå§åç´å°ç¨åºè¿è¡ç»æé½ä¸ç´åå¨ï¼å®åå ¨å±åéçåºå«å¨äºå ¨å±åé对ææç彿°é½æ¯å¯è§çï¼èéæå±é¨åéåªå¯¹å®ä¹èªå·±ç彿°ä½å§ç»å¯è§ã
ä»åé å å空é´çï¼
- éæåå¨åºï¼å ¨å±åéï¼éæå±é¨åéï¼éæå ¨å±åéã
- æ ï¼å±é¨åéã
# å ¨å±åéå®ä¹å¨å¤´æä»¶ä¸æä»ä¹é®é¢ï¼
妿å¨å¤´æä»¶ä¸å®ä¹å ¨å±åéï¼å½è¯¥å¤´æä»¶è¢«å¤ä¸ªæä»¶ include æ¶ï¼è¯¥å¤´æä»¶ä¸çå ¨å±åéå°±ä¼è¢«å®ä¹å¤æ¬¡ï¼å¯¼è´éå¤å®ä¹ï¼å æ¤ä¸è½å头æä»¶ä¸å®ä¹å ¨å±åéã
# extern C çä½ç¨æ¯ä»ä¹ï¼
å½ C++ ç¨åº éè¦è°ç¨ C è¯è¨ç¼åç彿°ï¼C++ 使ç¨é¾æ¥æç¤ºï¼å³ extern âCâ æåºä»»æé C++ 彿°æç¨çè¯è¨ã 举ä¾ï¼
// å¯è½åºç°å¨ C++ 头æä»¶<cstring>ä¸ç龿¥æç¤º
extern "C"{
int strcmp(const char*, const char*);
}
# sizeof(1==1) å¨ C å C++ ä¸å嫿¯ä»ä¹ç»æï¼
C è¯è¨ä»£ç ï¼
#include<stdio.h>
void main(){
printf("%d\n", sizeof(1==1));
}
/*
è¿è¡ç»æï¼
4
*/
C++ 代ç ï¼
#include <iostream>
using namespace std;
int main() {
cout << sizeof(1==1) << endl;
return 0;
}
/*
1
*/
# C å C++ struct çåºå«ï¼
- å¨ C è¯è¨ä¸ struct æ¯ç¨æ·èªå®ä¹æ°æ®ç±»åï¼å¨ C++ ä¸ struct æ¯æ½è±¡æ°æ®ç±»åï¼æ¯ææå彿°çå®ä¹ã
- C è¯è¨ä¸ struct 没æè®¿é®æéçè®¾ç½®ï¼æ¯ä¸äºåéçéåä½ï¼ä¸è½å®ä¹æå彿°ï¼C++ ä¸ struct å¯ä»¥åç±»ä¸æ ·ï¼æè®¿é®æéï¼å¹¶å¯ä»¥å®ä¹æå彿°ã
- C è¯è¨ä¸ struct å®ä¹çèªå®ä¹æ°æ®ç±»åï¼å¨å®ä¹è¯¥ç±»åçåéæ¶ï¼éè¦å ä¸ struct å ³é®åï¼ä¾å¦ï¼struct A var;ï¼å®ä¹ A ç±»åçåéï¼è C++ ä¸ï¼ä¸ç¨å è¯¥å ³é®åï¼ä¾å¦ï¼A var;
# C++ ä¸ structåClassåºå«æ¯ä»ä¹ï¼
å¨ C++ ä¸ï¼struct å class æ¯ä¸¤ç§ç¨äºå®ä¹èªå®ä¹æ°æ®ç±»åçå
³é®åï¼å®ä»¬çæ ¸å¿åè½ç¸ä¼¼ï¼é½è½å
嫿ååéåæå彿°ï¼ï¼ä½åå¨ä¸äºå
³é®åºå«ï¼ä¸»è¦ä½ç°å¨é»è®¤è®¿é®æéåé»è®¤ç»§æ¿æ¹å¼ä¸ï¼
- é»è®¤è®¿é®æéä¸åï¼
structé»è®¤è®¿é®æé为publicï¼classé»è®¤è®¿é®æé为privateãæ¯å¦ï¼
struct A {
int x; // é»è®¤ publicï¼å¤é¨å¯ç´æ¥è®¿é®
void f() {} // é»è®¤ publicï¼å¤é¨å¯è°ç¨
};
class B {
int y; // é»è®¤ privateï¼å¤é¨æ æ³ç´æ¥è®¿é®
void g() {} // é»è®¤ privateï¼å¤é¨æ æ³ç´æ¥è°ç¨
};
int main() {
A a;
a.x = 10; // åæ³ï¼struct æåé»è®¤ publicï¼
a.f(); // åæ³
B b;
b.y = 20; // ç¼è¯é误ï¼class æåé»è®¤ privateï¼
b.g(); // ç¼è¯é误
return 0;
}
- é»è®¤ç»§æ¿æ¹å¼ä¸åï¼å½ä½¿ç¨ç»§æ¿æ¶ï¼ä¸¤è
çé»è®¤ç»§æ¿æéä¹ä¸åï¼
structé»è®¤ç»§æ¿æ¹å¼ä¸ºpublicç»§æ¿ï¼classé»è®¤ç»§æ¿æ¹å¼ä¸ºprivateç»§æ¿ãæ¯å¦ï¼
struct Base {
int x;
};
// struct é»è®¤ public ç»§æ¿ï¼Base ç public æåå¨ Derived1 ä¸ä»ä¸º public
struct Derived1 : Base {
// å¯ç´æ¥è®¿é® Base::xï¼å¤é¨ä¹å¯éè¿ Derived1 å¯¹è±¡è®¿é® x
};
// class é»è®¤ private ç»§æ¿ï¼Base ç public æåå¨ Derived2 ä¸å为 private
class Derived2 : Base {
// å¯ç´æ¥è®¿é® Base::xï¼ä½å¤é¨æ æ³éè¿ Derived2 å¯¹è±¡è®¿é® x
};
int main() {
Derived1 d1;
d1.x = 10; // åæ³ï¼public ç»§æ¿ï¼
Derived2 d2;
d2.x = 20; // ç¼è¯é误ï¼private ç»§æ¿ï¼
return 0;
}
# 为ä»ä¹æäº class è¿ä¿ç structï¼
C++ æ¯å¨ C è¯è¨çåºç¡ä¸åå±èµ·æ¥çï¼ä¸ºäºä¸ C è¯è¨å ¼å®¹ï¼C++ ä¸ä¿çäº structã
# struct å union çåºå«æ¯ä»ä¹ï¼
说æï¼union æ¯èåä½ï¼struct æ¯ç»æä½ã
åºå«ï¼
- èåä½åç»æä½é½æ¯ç±è¥å¹²ä¸ªæ°æ®ç±»åä¸åçæ°æ®æåç»æãä½¿ç¨æ¶ï¼èåä½åªæä¸ä¸ªææçæåï¼èç»æä½ææçæå齿æã
- 对èåä½çä¸åæåèµå¼ï¼å°ä¼å¯¹è¦çå ¶ä»æåçå¼ï¼è对äºç»æä½ç对ä¸åæåèµå¼æ¶ï¼ç¸äºä¸å½±åã
- èåä½ç大å°ä¸ºå ¶å 鍿æåéçæå¤§å¼ï¼æç §æå¤§ç±»åçåæ°è¿è¡åé 大å°ï¼ç»æä½åé å åç大å°éµå¾ªå å对é½ååã
#include <iostream>
using namespace std;
typedef union
{
char c[10];
char cc1; // char 1 åèï¼æè¯¥ç±»åçåæ°åé
大å°
} u11;
typedef union
{
char c[10];
int i; // int 4 åèï¼æè¯¥ç±»åçåæ°åé
大å°
} u22;
typedef union
{
char c[10];
double d; // double 8 åèï¼æè¯¥ç±»åçåæ°åé
大å°
} u33;
typedef struct s1
{
char c; // 1 åè
double d; // 1ï¼charï¼+ 7ï¼å
å对é½ï¼+ 8ï¼doubleï¼= 16 åè
} s11;
typedef struct s2
{
char c; // 1 åè
char cc; // 1ï¼charï¼+ 1ï¼charï¼= 2 åè
double d; // 2 + 6ï¼å
å对é½ï¼+ 8ï¼doubleï¼= 16 åè
} s22;
typedef struct s3
{
char c; // 1 åè
double d; // 1ï¼charï¼+ 7ï¼å
å对é½ï¼+ 8ï¼doubleï¼= 16 åè
char cc; // 16 + 1ï¼charï¼+ 7ï¼å
å对é½ï¼= 24 åè
} s33;
int main()
{
cout << sizeof(u11) << endl; // 10
cout << sizeof(u22) << endl; // 12
cout << sizeof(u33) << endl; // 16
cout << sizeof(s11) << endl; // 16
cout << sizeof(s22) << endl; // 16
cout << sizeof(s33) << endl; // 24
cout << sizeof(int) << endl; // 4
cout << sizeof(double) << endl; // 8
return 0;
}
# class å struct çå¼åæ¯ä»ä¹ï¼
- struct å class é½å¯ä»¥èªå®ä¹æ°æ®ç±»åï¼ä¹æ¯æç»§æ¿æä½ã
- struct ä¸é»è®¤ç访é®çº§å«æ¯ publicï¼é»è®¤çç»§æ¿çº§å«ä¹æ¯ publicï¼class ä¸é»è®¤ç访é®çº§å«æ¯ privateï¼é»è®¤çç»§æ¿çº§å«ä¹æ¯ privateã
- å½ class ç»§æ¿ struct æè struct ç»§æ¿ class æ¶ï¼é»è®¤çç»§æ¿çº§å«åå³äº class æ struct æ¬èº«ï¼classï¼private ç»§æ¿ï¼ï¼structï¼public ç»§æ¿ï¼ï¼å³åå³äºæ´¾çç±»çé»è®¤ç»§æ¿çº§å«ã
struct A{}ï¼
class B : A{}; // private ç»§æ¿
struct C : B{}ï¼ // public ç»§æ¿
举ä¾:
#include<iostream>
using namespace std;
class A{
public:
void funA(){
cout << "class A" << endl;
}
};
struct B: A{ // ç±äº B æ¯ structï¼A çé»è®¤ç»§æ¿çº§å«ä¸º public
public:
void funB(){
cout << "class B" << endl;
}
};
class C: B{ // ç±äº C æ¯ classï¼B çé»è®¤ç»§æ¿çº§å«ä¸º privateï¼æä»¥æ æ³è®¿é®åºç±» B ä¸ç printB 彿°
};
int main(){
A ex1;
ex1.funA(); // class A
B ex2;
ex2.funA(); // class A
ex2.funB(); // class B
C ex3;
ex3.funB(); // error: 'B' is not an accessible base of 'C'.
return 0;
}
class å¯ä»¥ç¨äºå®ä¹æ¨¡æ¿åæ°ï¼struct ä¸è½ç¨äºå®ä¹æ¨¡æ¿åæ°ã
# C å C++ static çåºå«æ¯ä»ä¹ï¼
å¨ C è¯è¨ä¸ï¼ä½¿ç¨ static å¯ä»¥å®ä¹å±é¨éæåéãå¤é¨éæåéãéæå½æ° å¨ C++ ä¸ï¼ä½¿ç¨ static å¯ä»¥å®ä¹å±é¨éæåéãå¤é¨éæåéãéæå½æ°ãéææååéåéææå彿°ãå 为 C++ä¸æç±»çæ¦å¿µï¼éææååéãéææå彿°é½æ¯ä¸ç±»æå ³çæ¦å¿µã
# C++ staticä½ç¨æ¯ä»ä¹ï¼
static å®ä¹éæåéï¼éæå½æ°ã
ä¿æåéå 容æä¹ ï¼static ä½ç¨äºå±é¨åéï¼æ¹åäºå±é¨åéççå卿ï¼ä½¿å¾è¯¥åéåå¨äºå®ä¹åç´å°ç¨åºè¿è¡ç»æçè¿æ®µæ¶é´ã
#include <iostream>
using namespace std;
int fun(){
static int var = 1; // var åªå¨ç¬¬ä¸æ¬¡è¿å
¥è¿ä¸ªå½æ°çæ¶åå§å
var += 1;
return var;
}
int main()
{
for(int i = 0; i < 10; ++i)
cout << fun() << " "; // 2 3 4 5 6 7 8 9 10 11
return 0;
}
éèï¼staticä½ç¨äºå ¨å±åéå彿°ï¼æ¹åäºå ¨å±åéå彿°çä½ç¨åï¼ä½¿å¾å ¨å±åéå彿°åªè½å¨å®ä¹å®çæä»¶ä¸ä½¿ç¨ï¼å¨æºæä»¶ä¸ä¸å ·æå ¨å±å¯è§æ§ãï¼æ³¨ï¼æ®éå ¨å±åéå彿°å ·æå ¨å±å¯è§æ§ï¼å³å ¶ä»çæºæä»¶ä¹å¯ä»¥ä½¿ç¨ãï¼
static ä½ç¨äºç±»çæååéåç±»çæå彿°ï¼ä½¿å¾ç±»åéæè ç±»æå彿°åç±»æå ³ï¼ä¹å°±æ¯è¯´å¯ä»¥ä¸å®ä¹ç±»ç对象就å¯ä»¥éè¿ç±»è®¿é®è¿äºéææåãæ³¨æï¼ç±»çéææå彿°ä¸åªè½è®¿é®éææååéæè éææå彿°ï¼ä¸è½å°éææå彿°å®ä¹æè彿°ã
#include<iostream>
using namespace std;
class A
{
private:
int var;
static int s_var; // éææååé
public:
void show()
{
cout << s_var++ << endl;
}
static void s_show()
{
cout << s_var << endl;
// cout << var << endl; // error: invalid use of member 'A::a' in static member function. éææå彿°ä¸è½è°ç¨ééææååéãæ æ³ä½¿ç¨ this.var
// show(); // error: cannot call member function 'void A::show()' without object. éææå彿°ä¸è½è°ç¨ééææå彿°ãæ æ³ä½¿ç¨ this.show()
}
};
int A::s_var = 1; // éææååéå¨ç±»å¤è¿è¡åå§åèµå¼ï¼é»è®¤åå§å为 0
int main()
{
// cout << A::sa << endl; // error: 'int A::sa' is private within this context
A ex;
ex.show();
A::s_show();
}
# static å¨ç±»ä¸ä½¿ç¨ç注æäºé¡¹æåªäºï¼
static éææååéï¼
- éææåå鿝å¨ç±»å è¿è¡å£°æï¼å¨ç±»å¤è¿è¡å®ä¹ååå§åï¼å¨ç±»å¤è¿è¡å®ä¹ååå§åçæ¶åä¸è¦åºç°staticå ³é®ååprivateãpublicãprotected 访é®è§åã
- éææååéç¸å½äºç±»åä¸çå ¨å±åéï¼è¢«ç±»çææå¯¹è±¡æå ±äº«ï¼å æ¬æ´¾çç±»ç对象ã
- éææååéå¯ä»¥ä½ä¸ºæå彿°çåæ°ï¼èæ®éæååéä¸å¯ä»¥ã
#include <iostream>
using namespace std;
class A
{
public:
static int s_var;
int var;
void fun1(int i = s_var); // æ£ç¡®ï¼éææååéå¯ä»¥ä½ä¸ºæå彿°çåæ°
void fun2(int i = var); // error: invalid use of non-static data member 'A::var'
};
int main()
{
return 0;
}
éææ°æ®æåçç±»åå¯ä»¥æ¯æå±ç±»çç±»åï¼èæ®éæ°æ®æåçç±»ååªè½æ¯è¯¥ç±»ç±»åçæéæå¼ç¨ã
#include <iostream>
using namespace std;
class A
{
public:
static A s_var; // æ£ç¡®ï¼éææ°æ®æå
A var; // error: field 'var' has incomplete type 'A'
A *p; // æ£ç¡®ï¼æé
A &var1; // æ£ç¡®ï¼å¼ç¨
};
int main()
{
return 0;
}
static éææå彿°ï¼
- éææå彿°ä¸è½è°ç¨ééææååéæè ééææå彿°ï¼å ä¸ºéææå彿°æ²¡æ this æéãéææå彿°å为类ä½ç¨åçå ¨å±å½æ°ã
- éææå彿°ä¸è½å£°ææè彿°ï¼virtualï¼ãconst 彿°å volatile 彿°ã
# static å ¨å±åéåæ®éå ¨å±åéçå¼åæ¯ä»ä¹ï¼
ç¸åç¹ï¼
- å卿¹å¼ï¼æ®éå ¨å±åéå static å ¨å±åé齿¯éæå卿¹å¼ã
ä¸åç¹ï¼
- ä½ç¨åï¼æ®éå ¨å±åéçä½ç¨åæ¯æ´ä¸ªæºç¨åºï¼å½ä¸ä¸ªæºç¨åºç±å¤ä¸ªæºæä»¶ç»ææ¶ï¼æ®éå ¨å±åéå¨åä¸ªæºæä»¶ä¸é½æ¯ææçï¼éæå ¨å±åéåéå¶äºå ¶ä½ç¨åï¼å³åªå¨å®ä¹è¯¥åéçæºæä»¶å ææï¼å¨å䏿ºç¨åºçå ¶å®æºæä»¶ä¸ä¸è½ä½¿ç¨å®ãç±äºéæå ¨å±åéçä½ç¨åéäºä¸ä¸ªæºæä»¶å ï¼åªè½ä¸ºè¯¥æºæä»¶å ç彿°å ¬ç¨ï¼å æ¤å¯ä»¥é¿å å¨å ¶ä»æºæä»¶ä¸å¼èµ·é误ã
- åå§åï¼éæå ¨å±åéåªåå§å䏿¬¡ï¼é²æ¢å¨å ¶ä»æä»¶ä¸ä½¿ç¨ã
# C++ éæåéç使ç¨åºæ¯æ¯ä»ä¹ï¼æªåå§åçå ¨å±éæåéå¢ï¼
éæåéï¼å æ¬å ¨å±éæãå±é¨éæãç±»éææåï¼çæ ¸å¿ç¹ç¹æ¯çå½å¨æè´¯ç©¿ç¨åºè¿è¡å§ç»ï¼ä¸ä½ç¨ååéå®ï¼å¸¸è§ä½¿ç¨åºæ¯å¦ä¸ï¼
å ¨å±éæåéï¼
static修饰çå ¨å±åéï¼
- ä½ç¨ï¼éå¶åéä» å¨å½åæä»¶å å¯è§ï¼é¿å ä¸åæä»¶ä¸åååéå²çªï¼ï¼ä½çå½å¨ææ¯æ´ä¸ªç¨åºè¿è¡æé´ã
- åºæ¯ï¼å½å¤ä¸ªæä»¶éè¦ç¬ç«ä½¿ç¨åååéï¼å¦ç»è®¡å模åçå
é¨è®¡æ°ï¼ï¼ä½ä¸å¸æè¢«å
¶ä»æä»¶è®¿é®æä¿®æ¹æ¶ãä¾ï¼
static int count = 0;ï¼ä» å½å.cppæä»¶å¯è®¿é®ï¼å ¶ä»æä»¶å³ä½¿å£°æextern int count乿 æ³ä½¿ç¨ï¼ã
å±é¨éæåéï¼å½æ°å ç
staticåéï¼
- ä½ç¨ï¼åéå¨å½æ°ç¬¬ä¸æ¬¡è°ç¨æ¶åå§åï¼åç»è°ç¨ä¸åéæ°åå§åï¼å¼ä¼è¢«ä¿çï¼çå½å¨æå ¨å±ï¼ä½ç¨åä» é彿°å ï¼ã
- åºæ¯ï¼è®°å½å½æ°è¢«è°ç¨ç次æ°ï¼å¦
static int call_count = 0; call_count++;ï¼ï¼å便¨¡å¼ä¸ï¼ç¡®ä¿å ¨å±åªåå¨ä¸ä¸ªå®ä¾ï¼å¦å½æ°å è¿åéæå¯¹è±¡çæéï¼ï¼é¿å é¢ç¹åå»ºéæ¯ä¸´æ¶å¯¹è±¡ï¼å¦å·¥å ·å½æ°ä¸å¤ç¨çç¼å²åºï¼ã
ç±»éææååéï¼
static修饰çç±»æåï¼
- ä½ç¨ï¼å±äºæ´ä¸ªç±»èéæä¸ªå¯¹è±¡ï¼ææå¯¹è±¡å ±äº«è¯¥åéï¼çå½å¨æå ¨å±ï¼éå¨ç±»å¤åç¬åå§åã
- åºæ¯ï¼ç»è®¡ç±»çå®ä¾æ°éï¼å¦
static int total;ï¼å¨æé 彿°ä¸total++ï¼ææå½æ°ä¸total--ï¼ï¼åå¨ç±»çº§å«ç常éæå ±äº«é ç½®ï¼å¦static const int MAX_SIZE = 100;ï¼ã
æªåå§åçå ¨å±éæåé
æªåå§åçå
¨å±éæåéï¼å¦ static int a;ï¼æä¸¤ä¸ªå
³é®ç¹æ§ï¼
- èªå¨åå§åï¼ç¼è¯å¨ä¼å°å
¶é»è®¤åå§å为 0ï¼å
æ¬æ°å¼ç±»å为 0ï¼æéç±»å为
nullptrçï¼ã è¿æ¯å ä¸ºå ¨å±éæåéåæ¾å¨å åç BSS æ®µï¼æªåå§åæ°æ®æ®µï¼ï¼ç¨åºå¯å¨æ¶ç³»ç»ä¼èªå¨å°è¯¥æ®µæææ°æ®æ¸ é¶ã - ä½ç¨åéå¶ï¼ååå§åçå ¨å±éæåé䏿 ·ï¼ä» å¨å½åæä»¶å å¯è§ï¼ä¸å½±åå ¶ä»æä»¶çåååéã
ä¾ï¼
// file1.cpp
static int uninit; // æªåå§åï¼é»è®¤å¼ä¸º0ï¼ä»
file1å¯è§
// file2.cpp
static int uninit; // ä¸file1çuninitæ å
³ï¼åèªä¸º0
æªåå§åçå ¨å±éæåéæ¬è´¨ä¸æ¯ â带æä»¶ä½ç¨åçé¶åå§åå ¨å±åéâï¼éåéè¦è·¨å½æ°ï¼ä½ä» éå½åæä»¶ï¼å ±äº«ãä¸åå§å¼ä¸º 0 çåºæ¯ã
# ä»ç»const ä½ç¨åç¨æ³ï¼
ä½ç¨ï¼
- const 修饰æååéï¼å®ä¹æ const 常éï¼ç¸è¾äºå®å¸¸éï¼å¯è¿è¡ç±»åæ£æ¥ï¼èçå å空é´ï¼æé«äºæçã
- const ä¿®é¥°å½æ°åæ°ï¼ä½¿å¾ä¼ éè¿æ¥ç彿°åæ°çå¼ä¸è½æ¹åã
- const 修饰æå彿°ï¼ä½¿å¾æå彿°ä¸è½ä¿®æ¹ä»»ä½ç±»åçæååéï¼mutable 修饰çåéé¤å¤ï¼ï¼ä¹ä¸è½è°ç¨é const æå彿°ï¼å 为é const æå彿°å¯è½ä¼ä¿®æ¹æååéã
å¨ç±»ä¸çç¨æ³ï¼
const æååéï¼
- const æååéåªè½å¨ç±»å 声æãå®ä¹ï¼å¨æé 彿°åå§åå表ä¸åå§åã
- const æååéåªå¨æä¸ªå¯¹è±¡ççåå¨æå æ¯å¸¸éï¼å¯¹äºæ´ä¸ªç±»èè¨å´æ¯å¯åçï¼å 为类å¯ä»¥å建å¤ä¸ªå¯¹è±¡ï¼ä¸åç±»ç const æååéç弿¯ä¸åçãå æ¤ä¸è½å¨ç±»ç声æä¸åå§å const æååéï¼ç±»çå¯¹è±¡è¿æ²¡æå建ï¼ç¼è¯å¨ä¸ç¥éä»çå¼ã
const æå彿°ï¼
- ä¸è½ä¿®æ¹æååéçå¼ï¼é¤éæ mutable 修饰ï¼åªè½è®¿é®æååéã
- ä¸è½è°ç¨é常éæå彿°ï¼ä»¥é²ä¿®æ¹æååéçå¼ã
# define å const çåºå«æ¯ä»ä¹ï¼
åºå«ï¼
- ç¼è¯é¶æ®µï¼define æ¯å¨ç¼è¯é¢å¤çé¶æ®µè¿è¡æ¿æ¢ï¼const æ¯å¨ç¼è¯é¶æ®µç¡®å®å ¶å¼ã
- å®å ¨æ§ï¼define å®ä¹çå®å¸¸éæ²¡ææ°æ®ç±»åï¼åªæ¯è¿è¡ç®åçæ¿æ¢ï¼ä¸ä¼è¿è¡ç±»åå®å ¨çæ£æ¥ï¼const å®ä¹ç叏鿝æç±»åçï¼æ¯è¦è¿è¡å¤æçï¼å¯ä»¥é¿å ä¸äºä½çº§çé误ã
- å åå ç¨ï¼define å®ä¹çå®å¸¸éï¼å¨ç¨åºä¸ä½¿ç¨å¤å°æ¬¡å°±ä¼è¿è¡å¤å°æ¬¡æ¿æ¢ï¼å å䏿å¤ä¸ªå¤ä»½ï¼å ç¨çæ¯ä»£ç 段ç空é´ï¼const å®ä¹ç常éå ç¨éæåå¨åºç空é´ï¼ç¨åºè¿è¡è¿ç¨ä¸åªæä¸ä»½ã
- è°è¯ï¼define å®ä¹çå®å¸¸éä¸è½è°è¯ï¼å 为å¨é¢ç¼è¯é¶æ®µå°±å·²ç»è¿è¡æ¿æ¢äºï¼conså®ä¹ç常éå¯ä»¥è¿è¡è°è¯ã
const çä¼ç¹ï¼
- ææ°æ®ç±»åï¼å¨å®ä¹å¼å¯è¿è¡å®å ¨æ§æ£æ¥ã
- å¯è°å¼ã
- å ç¨è¾å°ç空é´ã
# define å typedef çåºå«æ¯ä»ä¹ï¼
- åçï¼#define ä½ä¸ºé¢å¤çæä»¤ï¼å¨ç¼è¯é¢å¤çæ¶è¿è¡æ¿æ¢æä½ï¼ä¸ä½æ£ç¡®æ§æ£æ¥ï¼åªæå¨ç¼è¯å·²è¢«å±å¼çæºç¨åºæ¶æä¼åç°å¯è½çé误并æ¥éãtypedef æ¯å ³é®åï¼å¨ç¼è¯æ¶å¤çï¼æç±»åæ£æ¥åè½ï¼ç¨æ¥ç»ä¸ä¸ªå·²ç»åå¨çç±»åä¸ä¸ªå«åï¼ä½ä¸è½å¨ä¸ä¸ªå½æ°å®ä¹éé¢ä½¿ç¨ typedef ã
- åè½ï¼typedef ç¨æ¥å®ä¹ç±»åçå«åï¼æ¹ä¾¿ä½¿ç¨ã#define ä¸ä» å¯ä»¥ä¸ºç±»ååå«åï¼è¿å¯ä»¥å®ä¹å¸¸éãåéãç¼è¯å¼å ³çã
- ä½ç¨åï¼#define 没æä½ç¨åçéå¶ï¼åªè¦æ¯ä¹åé¢å®ä¹è¿çå®ï¼å¨ä»¥åçç¨åºä¸é½å¯ä»¥ä½¿ç¨ï¼è typedef æèªå·±çä½ç¨åã
- æéçæä½ï¼typedef å #define å¨å¤çæéæ¶ä¸å®å ¨ä¸æ ·
#include <iostream>
#define INTPTR1 int *
typedef int * INTPTR2;
using namespace std;
int main()
{
INTPTR1 p1, p2; // p1: int *; p2: int
INTPTR2 p3, p4; // p3: int *; p4: int *
int var = 1;
const INTPTR1 p5 = &var; // ç¸å½äº const int * p5; 常éæéï¼å³ä¸å¯ä»¥éè¿ p5 å»ä¿®æ¹ p5 æåçå
容ï¼ä½æ¯ p5 å¯ä»¥æåå
¶ä»å
容ã
const INTPTR2 p6 = &var; // ç¸å½äº int * const p6; æé常éï¼ä¸å¯ä½¿ p6 åæåå
¶ä»å
容ã
return 0;
}
# volatile çä½ç¨ï¼æ¯å¦å ·æååæ§ï¼å¯¹ç¼è¯å¨æä»ä¹å½±åï¼
volatile çä½ç¨ï¼å½å¯¹è±¡çå¼å¯è½å¨ç¨åºçæ§å¶ææ£æµä¹å¤è¢«æ¹åæ¶ï¼åºè¯¥å°è¯¥å¯¹è±¡å£°æä¸º violatileï¼åç¥ç¼è¯å¨ä¸åºå¯¹è¿æ ·ç对象è¿è¡ä¼åã
volatileä¸å ·æååæ§ã
volatile 对ç¼è¯å¨çå½±åï¼ä½¿ç¨è¯¥å ³é®ååï¼ç¼è¯å¨ä¸ä¼å¯¹ç¸åºç对象è¿è¡ä¼åï¼å³ä¸ä¼å°åéä»å åç¼åå°å¯åå¨ä¸ï¼é²æ¢å¤ä¸ªçº¿ç¨æå¯è½ä½¿ç¨å åä¸çåéï¼æå¯è½ä½¿ç¨å¯åå¨ä¸çåéï¼ä»è导è´ç¨åºé误ã
# ä»ä¹æ åµä¸ä¸å®è¦ç¨ volatileï¼ è½å¦å const ä¸èµ·ä½¿ç¨ï¼
ä½¿ç¨ volatile å ³é®åçåºæ¯ï¼
- å½å¤ä¸ªçº¿ç¨é½ä¼ç¨å°æä¸åéï¼å¹¶ä¸è¯¥åéç弿å¯è½åçæ¹åæ¶ï¼éè¦ç¨ volatile å ³é®å对该åéè¿è¡ä¿®é¥°ï¼
- 䏿æå¡ç¨åºä¸è®¿é®çåéæå¹¶è¡è®¾å¤ç硬件å¯åå¨çåéï¼æå¥½ç¨ volatile å ³é®å修饰ã
volatile å ³é®åå const å ³é®åå¯ä»¥åæ¶ä½¿ç¨ï¼æç§ç±»åå¯ä»¥æ¢æ¯ volatile 忝 const ï¼åæ¶å ·æäºè ç屿§ã
# 为ä»ä¹ä¸è¬å°ææå½æ°è®¾ç½®ä¸ºè彿°ï¼
ææå½æ°è¢«è®¾ä¸ºè彿°ä¸»è¦æ¯ä¸ºäºè§£å³åºç±»æéæåæ´¾ç类对象æ¶çèµæºéæ¾é®é¢ã
妿æä»¬æä¸ä¸ªåºç±»æéï¼å®å®é 䏿åä¸ä¸ªæ´¾ç类对象ï¼å½æä»¬å é¤è¿ä¸ªåºç±»æéæ¶ï¼å¦æææå½æ°ä¸æ¯è彿°ï¼é£ä¹å°±åªä¼è°ç¨åºç±»çææå½æ°ï¼èä¸ä¼è°ç¨æ´¾çç±»çææå½æ°ãè¿å¯è½ä¼å¯¼è´æ´¾ç类对象çä¸äºèµæºæ²¡æè¢«æ£ç¡®éæ¾ï¼ä»èå¼åå åæ³æ¼çé®é¢ã
妿æä»¬å°ææå½æ°è®¾ç½®ä¸ºè彿°ï¼é£ä¹å¨å é¤åºç±»æéæ¶ï¼ä¼é¦å è°ç¨æ´¾çç±»çææå½æ°ï¼ç¶ååè°ç¨åºç±»çææå½æ°ï¼ä»èç¡®ä¿ææçèµæºé½è½è¢«æ£ç¡®éæ¾ã
# ææå½æ°ä¸ºä»ä¹é常æ¯ä¼åæä¸ä¸ªè彿°å¢ï¼
妿ä¸ä¸ªç±»æè彿°ï¼å°±åºè¯¥ä¸ºå ¶å®ä¹ä¸ä¸ªèææå½æ°ãè¿æ¯å 为å¨ä½¿ç¨deleteæä½ç¬¦éæ¾ä¸ä¸ªæåæ´¾ç类对象çåºç±»æéæ¶ï¼å¦æåºç±»çææå½æ°ä¸æ¯è彿°ï¼é£ä¹åªä¼è°ç¨åºç±»çææå½æ°ï¼èä¸ä¼è°ç¨æ´¾çç±»çææå½æ°ï¼è¿æ ·å°±ä¼å¯¼è´å åæ³æ¼åæªå®ä¹è¡ä¸ºçé®é¢ãéè¿å°ææå½æ°å®ä¹ä¸ºè彿°ï¼å¯ä»¥ç¡®ä¿å¨éæ¾æ´¾ç类对象æ¶ï¼å è°ç¨æ´¾çç±»çææå½æ°ï¼åè°ç¨åºç±»çææå½æ°ï¼ä»èé¿å å åæ³æ¼åæªå®ä¹è¡ä¸ºçé®é¢ã
# 为ä»ä¹ææå½æ°ä¸è¬å为è彿°ï¼
妿ææå½æ°ä¸è¢«å£°ææè彿°ï¼åç¼è¯å¨å®æ½éæç»å®ï¼å¨å é¤åºç±»æéæ¶ï¼åªä¼è°ç¨åºç±»çææå½æ°èä¸è°ç¨æ´¾çç±»ææå½æ°ï¼è¿æ ·å°±ä¼é ææ´¾ç类对象ææä¸å®å ¨ï¼é æå åæ³æ¼ã
æä»¥å¨å®ç°å¤ææ¶ï¼å½ç¨åºç±»æä½æ´¾çç±»ï¼å¨æææ¶é²æ¢åªææåºç±»èä¸æææ´¾çç±»çç¶åµåçï¼è¦å°åºç±»çææå½æ°å£°æä¸ºè彿°ã
# 为ä»ä¹æé 彿°ä¸å为è彿°ï¼
ä»åå¨ç©ºé´è§åº¦ï¼è彿°å¯¹åºä¸ä¸ªvtableï¼å¯æ¯è¿ä¸ªvtableå ¶å®æ¯åå¨å¨å¯¹è±¡çå å空é´çãé®é¢åºæ¥äºï¼å¦ææé 彿°æ¯èçï¼å°±éè¦éè¿ vtableæ¥è°ç¨ï¼å¯æ¯å¯¹è±¡è¿æ²¡æå®ä¾åï¼ä¹å°±æ¯å å空é´è¿æ²¡æï¼æ æ³æ¾å°vtableï¼æä»¥æé 彿°ä¸è½æ¯è彿°ã
ä»ä½¿ç¨è§åº¦ï¼è彿°çä½ç¨å¨äºéè¿ç¶ç±»çæéæè å¼ç¨æ¥è°ç¨å®çæ¶åè½å¤åæè°ç¨åç±»çé£ä¸ªæå彿°ãèæé 彿°æ¯å¨å建对象æ¶èªå¨è°ç¨çï¼ä¸å¯è½éè¿ç¶ç±»çæéæè å¼ç¨å»è°ç¨ï¼å æ¤ä¹å°±è§å®æé 彿°ä¸è½æ¯è彿°ã
# ä»ä¹æ¯å è彿°ï¼
å¨C++ä¸ï¼ä½¿ç¨å ³é®å"inline"å¯ä»¥å£°æä¸ä¸ªå è彿°ã声æä¸ºå è彿°ç彿°ä¼å¨ç¼è¯æ¶è¢«è§ä¸ºåé项ï¼ç¼è¯å¨ä¼å°è¯å°å ¶å±å¼ï¼å°å½æ°ä½ç´æ¥æå ¥å°è°ç¨ç¹å¤ãè¿æ ·å¯ä»¥é¿å 彿°è°ç¨çå¼éï¼åå°äºå½æ°è°ç¨çæ 帧çé¢å¤å¼éï¼ä»èæé«ç¨åºçæ§è¡æçã
# å®å®ä¹ï¼defineï¼åå è彿°ï¼inlineï¼çåºå«æ¯ä»ä¹ï¼
- å è彿°æ¯å¨ç¼è¯æ¶å±å¼ï¼èå®å¨ç¼è¯é¢å¤çæ¶å±å¼ï¼å¨ç¼è¯çæ¶åï¼å è彿°ç´æ¥è¢«åµå ¥å°ç®æ 代ç ä¸å»ï¼èå®åªæ¯ä¸ä¸ªç®åçææ¬æ¿æ¢ã
- å è彿°æ¯çæ£ç彿°ï¼åæ®é彿°è°ç¨çæ¹æ³ä¸æ ·ï¼å¨è°ç¨ç¹å¤ç´æ¥å±å¼ï¼é¿å äºå½æ°çåæ°åæ æä½ï¼åå°äºè°ç¨çå¼éãèå®å®ä¹ç¼åè¾ä¸ºå¤æï¼å¸¸éè¦å¢å ä¸äºæ¬å·æ¥é¿å æ§ä¹ã
- å®å®ä¹åªè¿è¡ææ¬æ¿æ¢ï¼ä¸ä¼å¯¹åæ°çç±»åãè¯å¥è½å¦æ£å¸¸ç¼è¯çè¿è¡æ£æ¥ãèå è彿°æ¯çæ£ç彿°ï¼ä¼å¯¹åæ°çç±»åã彿°ä½å çè¯å¥ç¼åæ¯å¦æ£ç¡®çè¿è¡æ£æ¥ã
#include <iostream>
#define MAX(a, b) ((a) > (b) ? (a) : (b))
using namespace std;
inline int fun_max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int var = 1;
cout << MAX(var, 5) << endl;
cout << fun_max(var, 0) << endl;
return 0;
}
/*
ç¨åºè¿è¡ç»æï¼
5
1
*/
# å è彿°æä»ä¹ç¼ºç¹ï¼
å è彿°ç缺ç¹ä¸»è¦æä»¥ä¸å ç¹ï¼
- 代ç è¨èï¼å è彿°ä¼å¨æ¯ä¸ªè°ç¨å®çå°æ¹è¿è¡ä»£ç æ¿æ¢ï¼è¿å¯è½å¯¼è´ä»£ç è¨èã妿å è彿°ä½é常大æè 被é¢ç¹è°ç¨ï¼ä¼å¢å 坿§è¡æä»¶ç大å°ï¼å¯è½å¯¼è´ç¼åä¸å½ä¸ï¼å½±åæ§è½ã
- ç¼è¯æ¶é´å¢å ï¼å è彿°éè¦å¨æ¯ä¸ªè°ç¨ç¹è¿è¡ä»£ç æ¿æ¢ï¼è¿ä¼å¢å ç¼è¯æ¶é´ãç¹å«æ¯å½å è彿°è¢«å¹¿æ³ä½¿ç¨æ¶ï¼ç¼è¯æ¶é´å¯è½ä¼æ¾èå¢å ã
- å¯è¯»æ§éä½ï¼å è彿°ä¼å°å½æ°ä½åµå ¥å°è°ç¨ç¹ï¼å¯è½å¯¼è´ä»£ç çå¯è¯»æ§éä½ã彿°ä½è¢«åæ£å¨å¤ä¸ªå°æ¹ï¼å¯è½ä¼ä½¿ä»£ç é¾ä»¥çè§£åç»´æ¤ã
# include â â å <> çåºå«æ¯ä»ä¹ï¼
include<æä»¶å> å #includeâæä»¶åâ çåºå«:
- æ¥æ¾æä»¶çä½ç½®ï¼include<æä»¶å>卿 ååºå¤´æä»¶æå¨çç®å½ä¸æ¥æ¾ï¼å¦ææ²¡æï¼åå°å½åæºæä»¶æå¨ç®å½ä¸æ¥æ¾ï¼#includeâæä»¶åâ å¨å½åæºæä»¶æå¨ç®å½ä¸è¿è¡æ¥æ¾ï¼å¦ææ²¡æï¼åå°ç³»ç»ç®å½ä¸æ¥æ¾ã
- 使ç¨ä¹ æ¯ï¼å¯¹äºæ ååºä¸ç头æä»¶å¸¸ç¨ include<æä»¶å>ï¼å¯¹äºèªå·±å®ä¹ç头æä»¶ï¼å¸¸ç¨ #includeâæä»¶åâ
# void*æ¯ä»ä¹?
void*æ¯ä¸ç§éç¨çæéç±»åï¼è¢«ç§°ä¸º"æ ç±»åæé"ãå®å¯ä»¥ç¨æ¥è¡¨ç¤ºæåä»»ä½ç±»åçæéï¼å 为void*æé没ææå®ç¹å®çæ°æ®ç±»åã
ç±äºvoid*æ¯æ ç±»åçï¼å®ä¸è½ç´æ¥è¿è¡è§£å¼ç¨æä½ï¼ä¹ä¸è½è¿è¡æéè¿ç®ãå¨ä½¿ç¨void*æéæ¶ï¼éè¦å°å
¶è½¬æ¢ä¸ºå
·ä½çæéç±»åæè½è¿è¡æä½ã
void*æé常ç¨äºéè¦å¨ä¸åç±»åä¹é´è¿è¡éç¨æä½çæ
åµï¼ä¾å¦å¨å½æ°ä¸ä¼ éä»»æç±»åçæéåæ°æå¨å¨æå
ååé
ä¸ä½¿ç¨ã
# mallocçåæ°å表 void*æä¹è½¬å为int*çï¼
å¯ä»¥ä½¿ç¨ç±»å转æ¢å°void*æé转å为int*æéã以䏿¯å°void*æé转å为int*æéç示ä¾ä»£ç ï¼
void* voidPtr = malloc(sizeof(int)); // åé
å
åå¹¶è¿åvoid*æé
int* intPtr = (int*)voidPtr; // å°void*æé转å为int*æé
// ç°å¨å¯ä»¥éè¿intPtræé访é®intç±»åçæ°æ®
*intPtr = 42;
å¨ä¸è¿°ç¤ºä¾ä¸ï¼ä½¿ç¨malloc彿°åé
äºåå¨ä¸ä¸ªintç±»åæ°æ®æéçå
åï¼å¹¶è¿åäºä¸ä¸ªvoid*æéãç¶åï¼éè¿å°void*æé转æ¢ä¸ºint*æéï¼å°å
¶èµå¼ç»intPtråéãç°å¨ï¼å¯ä»¥éè¿intPtræé访é®åæä½intç±»åçæ°æ®ã
# sizeof å strlen çåºå«æ¯ä»ä¹ï¼
strlen æ¯å¤´æä»¶ ä¸ç彿°ï¼sizeof æ¯ C++ ä¸çè¿ç®ç¬¦ã strlen æµéçæ¯å符串çå®é é¿åº¦ï¼å ¶æºä»£ç å¦ä¸ï¼ï¼ä»¥ \0 ç»æãè sizeof æµéçæ¯å符æ°ç»çåé 大å°ã
strlen æºä»£ç :
size_t strlen(const char *str) {
size_t length = 0;
while (*str++)
++length;
return length;
}
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char arr[10] = "hello";
cout << strlen(arr) << endl; // 5
cout << sizeof(arr) << endl; // 10
return 0;
}
è¥å符æ°ç» arr ä½ä¸ºå½æ°çå½¢åï¼sizeof(arr) ä¸ arr 被å½ä½å符æéæ¥å¤çï¼strlen(arr) ä¸ arr ä¾ç¶æ¯å符æ°ç»ï¼ä»ä¸è¿°ç¨åºçè¿è¡ç»æä¸å°±å¯ä»¥çåºã
#include <iostream>
#include <cstring>
using namespace std;
void size_of(char arr[])
{
cout << sizeof(arr) << endl; // warning: 'sizeof' on array function parameter 'arr' will return size of 'char*' .
cout << strlen(arr) << endl;
}
int main()
{
char arr[20] = "hello";
size_of(arr);
return 0;
}
/*
è¾åºç»æï¼
8
5
*/
- strlen æ¬èº«æ¯åºå½æ°ï¼å æ¤å¨ç¨åºè¿è¡è¿ç¨ä¸ï¼è®¡ç®é¿åº¦ï¼è sizeof å¨ç¼è¯æ¶ï¼è®¡ç®é¿åº¦ï¼
- sizeof çåæ°å¯ä»¥æ¯ç±»åï¼ä¹å¯ä»¥æ¯åéï¼strlen çåæ°å¿ é¡»æ¯ char* ç±»åçåéã
# explicit çä½ç¨æ¯ä»ä¹ï¼
ä½ç¨ï¼ç¨æ¥å£°æç±»æé 彿°æ¯æ¾ç¤ºè°ç¨çï¼èééå¼è°ç¨ï¼å¯ä»¥é»æ¢è°ç¨æé 彿°æ¶è¿è¡éå¼è½¬æ¢ãåªå¯ç¨äºä¿®é¥°ååæé 彿°ï¼å 为æ åæé 彿°åå¤åæé 彿°æ¬èº«å°±æ¯æ¾ç¤ºè°ç¨çï¼åå ä¸ explicit å ³é®å乿²¡æä»ä¹æä¹ã
éå¼è½¬æ¢ï¼
#include <iostream>
using namespace std;
class A {
public:
int var;
A(int tmp) {
var = tmp;
}
};
int main() {
A ex = 10; // åçäºéå¼è½¬æ¢
return 0;
}
ä¸è¿°ä»£ç ä¸ï¼A ex = 10; å¨ç¼è¯æ¶ï¼è¿è¡äºéå¼è½¬æ¢ï¼å° 10 è½¬æ¢æ A ç±»åç对象ï¼ç¶åå°è¯¥å¯¹è±¡èµå¼ç» exï¼çåäºå¦ä¸æä½ï¼
为äºé¿å éå¼è½¬æ¢ï¼å¯ç¨ explicit å ³é®åè¿è¡å£°æï¼
#include <iostream>
using namespace std;
class A {
public:
int var;
explicit A(int tmp) {
var = tmp;
cout << var << endl;
}
};
int main() {
A ex(100);
A ex1 = 10; // error: conversion from 'int' to non-scalar type 'A' requested
return 0;
}
# memcpy 彿°çåºå±åçæ¯ä»ä¹ï¼
memcpy 彿°çåºå±åçç®å说就æ¯ç´æ¥æä½å ååçäºè¿å¶æ°æ®ãå®ä¼ä»æºå°åå¼å§ï¼é个åèï¼æææ´é«æçåï¼å¤å¶æ°æ®å°ç®æ å°åï¼ç´å°å¤å¶å®æå®çåèæ°ã
åºå±å®ç°é常ä¼åä¼åï¼æ¯å¦å¯¹å¯¹é½çå ååç¨æ´å¤§çåä½ï¼å¦ 4 åèã8 åèï¼æ¹éå¤å¶ï¼æ¯ååèå¾ªç¯æ´å¿«ï¼å¯¹æªå¯¹é½çé¨åå ç¨ååèå¤çå°å¯¹é½ä½ç½®ï¼åç¨åå¤å¶ãæ´ä¸ªè¿ç¨ä¸å ³å¿æ°æ®ç±»åï¼çº¯ç²¹æåèæ¬è¿ï¼æä»¥å¤å¶åç®æ å ååæºå åçäºè¿å¶å 容å®å ¨ä¸è´ï¼ä½ä¸ä¼å¤çååç¬¦ä¸²ç»æç¬¦è¿ç±»ç¹æ®æ åµã
void *memcpy(void *dst, const void *src, size_t size)
{
char *psrc;
char *pdst;
if (NULL == dst || NULL == src)
{
return NULL;
}
if ((src < dst) && (char *)src + size > (char *)dst) // åºç°å°åéå çæ
åµï¼èªåååæ·è´
{
psrc = (char *)src + size - 1;
pdst = (char *)dst + size - 1;
while (size--)
{
*pdst-- = *psrc--;
}
}
else
{
psrc = (char *)src;
pdst = (char *)dst;
while (size--)
{
*pdst++ = *psrc++;
}
}
return dst;
}
# strcpy 彿°æä»ä¹ç¼ºé·ï¼
strcpy 彿°ç缺é·ï¼strcpy 彿°ä¸æ£æ¥ç®çç¼å²åºç大å°è¾¹çï¼èæ¯å°æºå符串éä¸çå ¨é¨èµå¼ç»ç®çå符串å°åèµ·å§çä¸åè¿ç»çå å空é´ï¼åæ¶å ä¸åç¬¦ä¸²ç»æ¢ç¬¦ï¼ä¼å¯¼è´å ¶ä»åé被è¦çã
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int var = 0x11112222;
char arr[10];
cout << "Address : var " << &var << endl;
cout << "Address : arr " << &arr << endl;
strcpy(arr, "hello world!");
cout << "var:" << hex << var << endl; // å°åé var 以 16 è¿å¶è¾åº
cout << "arr:" << arr << endl;
return 0;
}
/*
Address : var 0x23fe4c
Address : arr 0x23fe42
var:11002164
arr:hello world!
*/
- 说æï¼ä»ä¸è¿°ä»£ç ä¸å¯ä»¥çåºï¼åé var çåå ä½è¢«å符串 âhello world!â ç âd!\0â è¿ä¸ä¸ªå符æ¹åï¼è¿ä¸ä¸ªå符对åºç ascii ç çåå è¿å¶ä¸ºï¼\0(0x00)ï¼!(0x21)ï¼d(0x64)ã
- åå ï¼åé arr åªåé ç 10 个å å空é´ï¼éè¿ä¸è¿°ç¨åºä¸çå°åå¯ä»¥çåº arr å var å¨å å䏿¯è¿ç»åæ¾çï¼ä½æ¯å¨è°ç¨ strcpy 彿°è¿è¡æ·è´æ¶ï¼æºå符串 âhello world!â æå çå å空é´ä¸º 13ï¼å æ¤å¨æ·è´çè¿ç¨ä¸ä¼å ç¨ var çå å空é´ï¼å¯¼è´ varçåå ä½è¢«è¦çã
# C++ç¼è¯
# C++çç¼è¯è¿ç¨ä»ç»ä¸ä¸ï¼
C++çç¼è¯è¿ç¨ç»è¿äºé¢å¤çãç¼è¯ãæ±ç¼å龿¥å个主è¦é¶æ®µï¼

- é¢å¤çï¼é¢å¤çé¶æ®µä¼å¯¹æºä»£ç è¿è¡å¤çï¼ä¸»è¦å æ¬å±å¼å®å®ä¹ãå¤çæ¡ä»¶ç¼è¯æä»¤ï¼å¦#includeã#defineã#ifdefçï¼ä»¥åå 餿³¨éçãé¢å¤ççç»ææ¯çæä¸ä¸ªç»è¿å®å±å¼åæ¡ä»¶å¤çåç纯C++æºä»£ç æä»¶ã
- ç¼è¯ï¼Compilationï¼ï¼ç¼è¯é¶æ®µå°é¢å¤çåçæºä»£ç ç¿»è¯ä¸ºæ±ç¼è¯è¨ï¼çææ±ç¼ä»£ç ãç¼è¯å¨ä¼è¿è¡è¯æ³åæãè¯æ³åæåè¯ä¹åæï¼æ£æ¥ä»£ç çæ£ç¡®æ§ï¼å¹¶çæä¸é´ä»£ç 表示ã
- æ±ç¼ï¼æ±ç¼é¶æ®µå°æ±ç¼ä»£ç 转æ¢ä¸ºæºå¨å¯ä»¥æ§è¡çç®æ æä»¶ãæ±ç¼å¨ä¼å°æ±ç¼ä»£ç 转å为æºå¨æä»¤ï¼å¹¶çæä¸æºå¨ç¡¬ä»¶å¹³å°ç¸å ³çç®æ æä»¶ï¼é常以".obj"æ".o"为æ©å±åï¼ã
- 龿¥ï¼é¾æ¥é¶æ®µå°ç®æ æä»¶ä¸å ¶ä»å¿ è¦çåºæä»¶é¾æ¥å¨ä¸èµ·ï¼çæå¯æ§è¡ç¨åºã龿¥å¨ä¼è§£æç®æ æä»¶ä¸ç符å·å¼ç¨ï¼å°å ¶ä¸å ¶ä»ç®æ æä»¶æåºæä»¶ä¸ç符å·å®ä¹è¿è¡å¹é ï¼æç»çæä¸ä¸ªå®æ´ç坿§è¡æä»¶ãå¨é¾æ¥é¶æ®µï¼è¿ä¼è¿è¡å°åéå®ä½ã符å·è§£æã符å·è¡¨çæçæä½ï¼ç¡®ä¿ç¨åºçæ£ç¡®æ§è¡ã
# éæé¾æ¥åºå卿龿¥åºæä»ä¹åºå«ï¼
- 龿¥æ¹å¼ï¼éæé¾æ¥åºå¨ç¼è¯é¾æ¥æ¶ä¼è¢«å®æ´å°å¤å¶å°å¯æ§è¡æä»¶ä¸ï¼æä¸ºå¯æ§è¡æä»¶çä¸é¨åï¼è卿龿¥åºå¨ç¼è¯é¾æ¥æ¶åªä¼å¨å¯æ§è¡æä»¶ä¸å å«å¯¹åºçå¼ç¨ï¼å®é çåºæä»¶å¨è¿è¡æ¶ç±æä½ç³»ç»å¨æå è½½ã
- æä»¶å¤§å°ï¼éæé¾æ¥åºä¼ä½¿å¾å¯æ§è¡æä»¶ç大å°å¢å ï¼å 为åºç代ç è¢«å®æ´å°å¤å¶å°å¯æ§è¡æä»¶ä¸ï¼è卿龿¥åºä¸ä¼å¢å 坿§è¡æä»¶ç大å°ï¼å 为åºç代ç å¨è¿è¡æ¶æä¼è¢«å è½½ã
- å åå ç¨ï¼éæé¾æ¥åºå¨è¿è¡æ¶ä¼è¢«å®æ´å°å è½½å°å åä¸ï¼å ç¨åºå®çå å空é´ï¼è卿龿¥åºå¨è¿è¡æ¶æä¼è¢«å è½½ï¼å¯ä»¥å¨å¤ä¸ªè¿ç¨ä¹é´å ±äº«ï¼åå°å åå ç¨ã
- 坿©å±æ§ï¼å¨æé¾æ¥åºç坿©å±æ§æ´å¥½ï¼å¯ä»¥å¨ä¸ä¿®æ¹å¯æ§è¡æä»¶çæ åµä¸æ¿æ¢ææ·»å æ°çåºæä»¶ï¼èéæé¾æ¥åºéè¦éæ°ç¼è¯é¾æ¥ã
# C++é¢å对象
# ä»ä¹æ¯é¢å对象ï¼é¢å对象çä¸å¤§ç¹æ§
é¢å对象ï¼å¯¹è±¡æ¯æå ·ä½çæä¸ä¸ªäºç©ï¼è¿äºäºç©çæ½è±¡å°±æ¯ç±»ï¼ç±»ä¸å 嫿°æ®ï¼æååéï¼åå¨ä½ï¼æåæ¹æ³ï¼ã
é¢å对象çä¸å¤§ç¹æ§ï¼
- å°è£ ï¼å°å ·ä½çå®ç°è¿ç¨åæ°æ®å°è£ æä¸ä¸ªå½æ°ï¼åªè½éè¿æ¥å£è¿è¡è®¿é®ï¼éä½è¦åæ§ã
- ç»§æ¿ï¼å类继æ¿ç¶ç±»çç¹å¾åè¡ä¸ºï¼åç±»æç¶ç±»çé private æ¹æ³ææååéï¼åç±»å¯ä»¥å¯¹ç¶ç±»çæ¹æ³è¿è¡éåï¼å¢å¼ºäºç±»ä¹é´çè¦åæ§ï¼ä½æ¯å½ç¶ç±»ä¸çæååéãæå彿°æè ç±»æ¬èº«è¢« final å ³é®å修饰æ¶ï¼ä¿®é¥°çç±»ä¸è½ç»§æ¿ï¼ä¿®é¥°çæåä¸è½éåæä¿®æ¹ã
- 夿ï¼å¤æå°±æ¯ä¸åç»§æ¿ç±»ç对象ï¼å¯¹å䏿¶æ¯ååºä¸åçååºï¼åºç±»çæéæåæç»å®å°æ´¾çç±»ç对象ï¼ä½¿å¾åºç±»æéåç°ä¸åçè¡¨ç°æ¹å¼ã
# C++ç¹æ§ä»ç»ä¸ä¸ï¼
- å°è£ æ¯å°ä¸äºæ°æ®å彿°å°è£ å°ç±»ä¸ï¼è¿æ ·å¤å±è°ç¨ç±»åªä¼è°ç¨å°è®¾è®¡è æ³è®©ä»è°ç¨çæ¹æ³ï¼
- ç»§æ¿çè¯ï¼æå¸¸æ¯è®¾è®¡ä¸ä¸ªåºç±»ï¼ç¶ååå«è®¾ç½®åç±»å»ç»§æ¿åºç±»çä¸äºæ¹æ³ï¼å°¤å ¶æ¯è彿°ï¼é对ä¸ååç±»çç¹ç¹å¯¹è彿°è¿è¡éåã
- ç»§æ¿è¿æå ¬æåç§æä¸¤ç§æ¹æ³ï¼å ¬æç»§æ¿æ¯å°åºç±»çæåé½åå°ä¸å¨çç»§æ¿ä¸æ¥ï¼ç§æç»§æ¿åä¼å°å ¶æ¹ä¸ºç§æé¨åï¼å¤æçè¯ï¼æ¯æå½æ°éè½½åä¹åæå°çè彿°ï¼å½æ°éè½½æ¯å¯ä»¥ä½¿å¾ç¸åç彿°é¢å¯¹ä¸åçåæ°ä¸ªæ°æè ç±»åè¿è¡ä¸åçæ¹å¼å®ç°ã
# å¦ä½çè§£ C++ æ¯é¢å对象ç¼ç¨ï¼
说æï¼è¯¥é®é¢æå¥½ç»åèªå·±ç项ç®ç»åè¿è¡å±å¼è§£éï¼æä¸¾ä¸äºæ°å½çä¾åï¼åæ¶å¯¹æ¯ä¸é¢åè¿ç¨ç¼ç¨ã
- é¢åè¿ç¨ç¼ç¨ï¼ä¸ç§ä»¥æ§è¡ç¨åºæä½çè¿ç¨æå½æ°ä¸ºä¸å¿ç¼åè½¯ä»¶çæ¹æ³ãç¨åºçæ°æ®é常åå¨å¨åéä¸ï¼ä¸è¿äºè¿ç¨æ¯åå¼çãæä»¥å¿ é¡»å°åéä¼ éç»éè¦ä½¿ç¨å®ä»¬ç彿°ã缺ç¹ï¼éçç¨åºåå¾è¶æ¥è¶å¤æï¼ç¨åºæ°æ®ä¸è¿è¡ä»£ç çå离å¯è½ä¼å¯¼è´é®é¢ãä¾å¦ï¼ç¨åºçè§èç»å¸¸ä¼åçååï¼ä»èéè¦æ´æ¹æ°æ®çæ ¼å¼ææ°æ®ç»æç设计ã彿°æ®ç»æåçååæ¶ï¼å¯¹æ°æ®è¿è¡æä½ç代ç ä¹å¿ é¡»æ´æ¹ä¸ºæ¥åæ°çæ ¼å¼ãæ¥æ¾éè¦æ´æ¹çææä»£ç ä¼ä¸ºç¨åºå带æ¥é¢å¤çå·¥ä½ï¼å¹¶å¢å äºä½¿ä»£ç åºç°éè¯¯çæºä¼ã
- é¢å对象ç¼ç¨ï¼Object-Oriented Programming, OOPï¼ï¼ä»¥å建å使ç¨å¯¹è±¡ä¸ºä¸å¿ãä¸ä¸ªå¯¹è±¡ï¼Objectï¼å°±æ¯ä¸ä¸ªè½¯ä»¶å®ä½ï¼å®å°æ°æ®åç¨åºå¨ä¸ä¸ªåå ä¸ç»åèµ·æ¥ãå¯¹è±¡çæ°æ®é¡¹ï¼ä¹ç§°ä¸ºå ¶å±æ§ï¼åå¨å¨æååéä¸ã对象æ§è¡çè¿ç¨è¢«ç§°ä¸ºå ¶æå彿°ãå°å¯¹è±¡çæ°æ®åè¿ç¨ç»å®å¨ä¸èµ·å被称为å°è£ ã
é¢å对象ç¼ç¨è¿ä¸æ¥è¯´æï¼
- é¢å对象ç¼ç¨å°æ°æ®æååæå彿°å°è£ å°ä¸ä¸ªç±»ä¸ï¼å¹¶å£°ææ°æ®æååæå彿°ç访é®çº§å«ï¼publicãprivateãprotectedï¼ï¼ä»¥ä¾¿æ§å¶ç±»å¯¹è±¡å¯¹æ°æ®æåå彿°ç访é®ï¼å¯¹æ°æ®æåèµ·å°ä¸å®çä¿æ¤ä½ç¨ãèä¸å¨ç±»ç对象è°ç¨æå彿°æ¶ï¼åªéç¥éæå彿°çåãåæ°å表以åè¿åå¼ç±»åå³å¯ï¼æ éäºè§£å ¶å½æ°çå®ç°åçãå½ç±»å é¨çæ°æ®æåæè æå彿°åçæ¹åæ¶ï¼ä¸å½±åç±»å¤é¨ç代ç ã
# éè½½ãéåãéèçåºå«æ¯ä»ä¹ï¼
éè½½ï¼æ¯æåä¸å¯è®¿é®åºå 被声æå ä¸ªå ·æä¸ååæ°åï¼åæ°çç±»åã个æ°ã顺åºï¼çåå彿°ï¼æ ¹æ®åæ°å表确å®è°ç¨åªä¸ªå½æ°ï¼éè½½ä¸å ³å¿å½æ°è¿åç±»åã
class A {
public:
void fun(int tmp);
void fun(float tmp); // éè½½ åæ°ç±»åä¸åï¼ç¸å¯¹äºä¸ä¸ä¸ªå½æ°ï¼
void fun(int tmp, float tmp1); // éè½½ åæ°ä¸ªæ°ä¸åï¼ç¸å¯¹äºä¸ä¸ä¸ªå½æ°ï¼
void fun(float tmp, int tmp1); // éè½½ åæ°é¡ºåºä¸åï¼ç¸å¯¹äºä¸ä¸ä¸ªå½æ°ï¼
int fun(int tmp); // error: 'int A::fun(int)' cannot be overloaded éè¯¯ï¼æ³¨æéè½½ä¸å
³å¿å½æ°è¿åç±»å
};
éèï¼æ¯ææ´¾çç±»ç彿°å±è½äºä¸å ¶ååçåºç±»å½æ°ï¼ä¸»è¦åªè¦åå彿°ï¼ä¸ç®¡åæ°å表æ¯å¦ç¸åï¼åºç±»å½æ°é½ä¼è¢«éèã
#include <iostream>
using namespace std;
class Base {
public:
void fun(int tmp, float tmp1) {
cout << "Base::fun(int tmp, float tmp1)" << endl;
}
};
class Derive : public Base {
public:
void fun(int tmp) {
cout << "Derive::fun(int tmp)" << endl;
} // éèåºç±»ä¸çåå彿°
};
int main() {
Derive ex;
ex.fun(1); // Derive::fun(int tmp)
ex.fun(1, 0.01); // error: candidate expects 1 argument, 2 provided
return 0;
}
说æï¼ä¸è¿°ä»£ç ä¸ ex.fun(1, 0.01); åºç°é误ï¼è¯´ææ´¾çç±»ä¸å°åºç±»çåå彿°éèäºãè¥æ¯æ³è°ç¨åºç±»ä¸çåå彿°ï¼å¯ä»¥å ä¸ç±»ååææ ex.Base::fun(1, 0.01);ï¼è¿æ ·å°±å¯ä»¥è°ç¨åºç±»ä¸çåå彿°ã
éå(è¦ç)ï¼æ¯ææ´¾çç±»ä¸åå¨éæ°å®ä¹ç彿°ã彿°åãåæ°å表ãè¿åå¼ç±»åé½å¿ é¡»ååºç±»ä¸è¢«éåç彿°ä¸è´ï¼åªæå½æ°ä½ä¸åãæ´¾çç±»è°ç¨æ¶ä¼è°ç¨æ´¾çç±»çéå彿°ï¼ä¸ä¼è°ç¨è¢«éå彿°ãéåçåºç±»ä¸è¢«éåç彿°å¿ é¡»æ virtual 修饰ã
#include <iostream>
using namespace std;
class Base {
public:
virtual void fun(int tmp) {
cout << "Base::fun(int tmp) : " << tmp << endl;
}
};
class Derived : public Base {
public:
virtual void fun(int tmp) {
cout << "Derived::fun(int tmp) : " << tmp << endl;
} // éååºç±»ä¸ç fun 彿°
};
int main() {
Base *p = new Derived();
p->fun(3); // Derived::fun(int) : 3
return 0;
}
éååéè½½çåºå«ï¼
- èå´åºå«ï¼å¯¹äºç±»ä¸å½æ°çéè½½æè éåèè¨ï¼éè½½åçå¨åä¸ä¸ªç±»çå é¨ï¼éååçå¨ä¸åçç±»ä¹é´ï¼åç±»åç¶ç±»ä¹é´ï¼ã
- åæ°åºå«ï¼éè½½ç彿°éè¦ä¸å彿°æç¸åç彿°åãä¸åçåæ°å表ï¼ä¸å ³æ³¨å½æ°çè¿åå¼ç±»åï¼éåç彿°ç彿°åãåæ°å表åè¿åå¼ç±»åé½éè¦åå彿°ç¸åï¼ç¶ç±»ä¸è¢«éåç彿°éè¦æ virtual 修饰ã
- virtual å ³é®åï¼éåç彿°åºç±»ä¸å¿ é¡»æ virtualå ³é®åç修饰ï¼éè½½ç彿°å¯ä»¥æ virtual å ³é®åç修饰ä¹å¯ä»¥æ²¡æã
éèåéåï¼éè½½çåºå«ï¼
- èå´åºå«ï¼éèä¸éè½½èå´ä¸åï¼éèåçå¨ä¸åç±»ä¸ã
- åæ°åºå«ï¼éè彿°å被éè彿°åæ°å表å¯ä»¥ç¸åï¼ä¹å¯ä»¥ä¸åï¼ä½å½æ°åä¸å®ç¸åï¼å½åæ°ä¸åæ¶ï¼æ 论åºç±»ä¸ç彿°æ¯å¦è¢« virtual 修饰ï¼åºç±»å½æ°é½æ¯è¢«éèï¼è䏿¯éåã
# C++ç夿æ¯ä»ä¹ï¼æä¹éè¿è彿°å®ç°ï¼
C++ä¸çå¤ææ§æ¯æçæ¯åä¸ä¸ªæä½ä½ç¨äºä¸åç对象æ¶ï¼å¯ä»¥äº§çä¸åçè¡ä¸ºã夿æ§ä¸»è¦éè¿è彿°å®ç°ï¼è½å¤è®©ä½ 以ç¶ç±»çæéæå¼ç¨è°ç¨åç±»çå®ç°ï¼ä»èå¨è¿è¡æ¶å³å®ä½¿ç¨åªä¸ªå½æ°ã
C++ä¸ç夿é常å为两ç§ä¸»è¦ç±»åï¼
- ç¼è¯æ¶å¤æï¼éæå¤æï¼ï¼éè¿å½æ°éè½½åè¿ç®ç¬¦éè½½å®ç°ï¼å¨ç¼è¯æ¶ç¡®å®è°ç¨åªä¸ªå½æ°ã
- è¿è¡æ¶å¤æï¼å¨æå¤æï¼ï¼éè¿è彿°å®ç°ï¼å¨è¿è¡æ¶æ ¹æ®å¯¹è±¡çå®é ç±»åå³å®è°ç¨ç彿°ãå®ç°åçæ¯ï¼æ¯ä¸ªå å«è彿°çç±»é½æä¸ä¸ªè彿°è¡¨ï¼è¿ä¸ªè¡¨è®°å½äºè¯¥ç±»å¯¹è±¡å¯ä»¥è°ç¨çè彿°æéï¼æ¯ä¸ªå¯¹è±¡ä¹æä¸ä¸ªéå¼çè彿°æéï¼æåå ¶ç±»çè彿°è¡¨ãå¨è¿è¡æ¶ï¼è°ç¨è彿°æ¶ï¼ç¨åºéè¿è彿°æéæ¥æ¾æ£ç¡®ç彿°ã
è彿°æ¯éè¿å¨åºç±»ä¸å£°æä¸ä¸ªå½æ°ä¸ºvirtualæ¥å®ç°çãè¿æ å¿çè¿ä¸ªå½æ°å¯ä»¥è¢«æ´¾çç±»éåï¼overrideï¼ãå½éè¿åºç±»æéæå¼ç¨è°ç¨è彿°æ¶ï¼C++伿¥æ¾å®é
对象çç±»åï¼è°ç¨å¯¹åºçåç±»å®ç°ï¼è䏿¯åºç±»çå®ç°ã
ä¸é¢æ¯ä¸ä¸ªç®åç示ä¾ï¼å±ç¤ºäºå¦ä½ä½¿ç¨è彿°å®ç°å¤æã
1. å®ä¹åºç±»åæ´¾çç±»
#include <iostream>
using namespace std;
// åºç±»
class Shape {
public:
// è彿°
virtual void draw() {
cout << "Drawing Shape" << endl;
}
};
// æ´¾çç±»ï¼Circle
class Circle : public Shape {
public:
void draw() override { // éåè彿°
cout << "Drawing Circle" << endl;
}
};
// æ´¾çç±»ï¼Square
class Square : public Shape {
public:
void draw() override { // éåè彿°
cout << "Drawing Square" << endl;
}
};
2. 使ç¨è彿°
- å建ä¸ä¸ªå½æ°ï¼æ¥ååºç±»æéä½ä¸ºåæ°ï¼å©ç¨å¤ææ§è°ç¨ä¸åçæ´¾çç±»æ¹æ³ã
void renderShape(Shape* shape) {
shape->draw(); // è°ç¨è彿°
}
int main() {
Shape* shape1 = new Circle(); // å建 Circle 对象
Shape* shape2 = new Square(); // å建 Square 对象
renderShape(shape1); // è¾åº: Drawing Circle
renderShape(shape2); // è¾åº: Drawing Square
delete shape1; // éæ¾å
å
delete shape2; // éæ¾å
å
return 0;
}
# C++ä¸ç夿æä¹å®ç°çï¼
C++ä¸ç夿䏻è¦éè¿è彿°åç»§æ¿æ¥å®ç°ã夿å为两ç§ï¼ç¼è¯æ¶å¤æåè¿è¡æ¶å¤æã
- ç¼è¯æ¶å¤æï¼ä¹ç§°ä¸ºéæå¤æææ©ç»å®ãè¿ç§å¤ææ¯éè¿å½æ°éè½½åæ¨¡æ¿æ¥å®ç°çã
- è¿è¡æ¶å¤æï¼ä¹ç§°ä¸ºå¨æå¤æææç»å®ãè¿ç§å¤ææ¯éè¿è彿°åç»§æ¿æ¥å®ç°çãå½åºç±»çæéæå¼ç¨æåæ´¾ç类对象æ¶ï¼è°ç¨çè彿°å°æ¯æ´¾çç±»ççæ¬ï¼è¿å°±å®ç°äºè¿è¡æ¶å¤æã
# C++å¤æç¹æ§æ¯ä»ä¹ï¼
夿æ¯é¢å对象ç¼ç¨ï¼OOPï¼çéè¦ç¹æ§ä¹ä¸ï¼å®å 许ä¸åç对象对å䏿¶æ¯ï¼å½æ°è°ç¨ï¼ååºä¸åçååºãå¨ C++ ä¸ï¼å¤æä¸»è¦éè¿è彿°æ¥å®ç°ã
夿æéæå¤æå卿夿䏤ç§ï¼
- **éæå¤æï¼ç¼è¯æ¶å¤æï¼ï¼**主è¦éè¿å½æ°éè½½æ¥å®ç°ã彿°éè½½æ¯æå¨åä¸ä¸ªä½ç¨åå ï¼å¯ä»¥æå¤ä¸ªåå彿°ï¼ä½æ¯å®ä»¬çåæ°å表ï¼åæ°ä¸ªæ°ãåæ°ç±»åæè åæ°é¡ºåºï¼ä¸åãä¾å¦ï¼
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
å½è°ç¨add彿°æ¶ï¼ç¼è¯å¨ä¼æ ¹æ®ä¼ å
¥çåæ°ç±»åå个æ°å¨ç¼è¯æ¶æå°±ç¡®å®è°ç¨åªä¸ªçæ¬çadd彿°ã
- **卿夿ï¼è¿è¡æ¶å¤æï¼ï¼**åºäºè彿°åç»§æ¿æ¥å®ç°ãå®å 许å¨è¿è¡æ¶æ ¹æ®å¯¹è±¡çå®é ç±»åæ¥è°ç¨ç¸åºç彿°ãå½ä¸ä¸ªç±»å å«è彿°æ¶ï¼ç¼è¯å¨ä¼ä¸ºè¿ä¸ªç±»å建ä¸ä¸ªè彿°è¡¨ãè彿°è¡¨æ¯ä¸ä¸ªå½æ°æéæ°ç»ï¼å ¶ä¸åå¨äºè¿ä¸ªç±»çè彿°çå°åãæ¯ä¸ªå å«è彿°çç±»ç对象ä¸é½ä¼å å«ä¸ä¸ªè彿°æéï¼è¿ä¸ªæéæå该类çè彿°è¡¨ãå½éè¿åºç±»æéæå¼ç¨è°ç¨è彿°æ¶ï¼ç¨åºä¼æ ¹æ®è彿°æéæ¾å°å¯¹åºçè彿°è¡¨ï¼ç¶åå¨è彿°è¡¨ä¸æ¥æ¾è¦è°ç¨çè彿°çå®é å°åï¼ä»èå®ç°æ ¹æ®å¯¹è±¡çå®é ç±»åæ¥è°ç¨å½æ°ã
# C++ç彿°å¯¹è±¡æ¯ä»ä¹ï¼è·æ®é彿°çåºå«ï¼
彿°å¯¹è±¡æ¯æä¸ä¸ªéè½½äº operator() çç±»æç»æä½å®ä¾ã彿°å¯¹è±¡å¯ä»¥åæ®é彿°ä¸æ ·è¢«è°ç¨ï¼ä½å®ä»¬å®é
䏿¯å¯¹è±¡ï¼å
·æç¶æåè¡ä¸ºã
æ®é彿°ä¸å½æ°å¯¹è±¡çåºå«ï¼
- 宿¶æ¹å¼ï¼æ®é彿°æ¯ç¨
è¿åç±»å 彿°å(åæ°)è¯æ³å®ä¹çï¼è彿°å¯¹è±¡æ¯ä¸ä¸ªç±»æç»æä½ï¼å¹¶éè½½äºoperator()ã - ç¶æï¼æ®é彿°æ ç¶æï¼è彿°å¯¹è±¡å¯ä»¥æå ç½®çç¶æï¼æååéï¼ã
- è°ç¨æ¹å¼ï¼æ®é彿°è¢«ç´æ¥è°ç¨ï¼å½æ°å¯¹è±¡éè¦å å建å®ä¾ï¼ç¶åç¨å®ä¾è°ç¨ã
- çµæ´»æ§ï¼å½æ°å¯¹è±¡å¯ä»¥éè½½å¤ä¸ªæä½ç¬¦ææ·»å æ´å¤åè½ï¼æ®é彿°ååªè½å®ä¹ä¸ä¸ªå½æ°ã
æ®é彿°ï¼
int add(int a, int b) {
return a + b;
}
彿°å¯¹è±¡ï¼
class Add {
public:
int operator()(int a, int b) {
return a + b;
}
};
Add add;
int result = add(2, 3); // è°ç¨å½æ°å¯¹è±¡
# C++ ç±»ç¸å ³
# classä¸ç¼ºçç彿°æ¯ä»ä¹ï¼
å¨C++ä¸ï¼å¦æä¸ä¸ªç±»æ²¡ææ¾å¼å°å®ä¹ãæé 彿°ãææå½æ°ãæ·è´æé 彿°ãèµå¼è¿ç®ç¬¦éè½½å½æ°ãï¼é£ä¹ç¼è¯å¨ä¼èªå¨çæè¿äºå½æ°ï¼è¿äºå½æ°è¢«ç§°ä¸ºç¼ºç彿°ã
# ä»ä¹æ¯çº¯è彿°ï¼æåªäºåºç¨åºæ¯
纯è彿°æ¯å¨åºç±»ä¸å£°æçè彿°ï¼å®å¨åºç±»ä¸æ²¡æå®ä¹ï¼ä½è¦æ±ä»»ä½æ´¾çç±»é½è¦å®ä¹èªå·±çå®ç°æ¹æ³ãå¨C++ä¸ï¼çº¯è彿°ç声æå½¢å¼å¦ä¸ï¼
virtual void function() = 0;
å
¶ä¸ï¼= 0å°±è¡¨ç¤ºè¿æ¯ä¸ä¸ªçº¯è彿°ã
å«æçº¯è彿°ç类被称为æ½è±¡ç±»ãæ½è±¡ç±»ä¸è½è¢«å®ä¾åï¼åªè½ä½ä¸ºæ¥å£ä½¿ç¨ãæ´¾çç±»å¿ é¡»å®ç°ææç纯è彿°ï¼å¦å该派çç±»ä¹ä¼åææ½è±¡ç±»ã
纯è彿°çåºç¨åºæ¯ä¸»è¦å æ¬ï¼
- 设计模å¼ï¼ä¾å¦å¨æ¨¡æ¿æ¹æ³æ¨¡å¼ä¸ï¼åºç±»å®ä¹ä¸ä¸ªç®æ³ç骨æ¶ï¼èå°ä¸äºæ¥éª¤å»¶è¿å°åç±»ä¸ãè¿äºéè¦å¨åç±»ä¸å®ç°çæ¥éª¤å°±å¯ä»¥å£°æä¸ºçº¯è彿°ã
- æ¥å£å®ä¹ï¼å¯ä»¥å建ä¸ä¸ªåªå å«çº¯è彿°çæ½è±¡ç±»ä½ä¸ºæ¥å£ãææå®ç°è¯¥æ¥å£çç±»é½å¿ é¡»æä¾è¿äºå½æ°çå®ç°ã
# ä»ä¹æ¯è彿°ï¼ä»ä¹æ¯çº¯è彿°ï¼
è彿°ï¼è¢« virtual å ³é®å修饰çæå彿°ï¼å°±æ¯è彿°ã
#include <iostream>
using namespace std;
class A
{
public:
virtual void v_fun() // è彿°
{
cout << "A::v_fun()" << endl;
}
};
class B : public A
{
public:
void v_fun()
{
cout << "B::v_fun()" << endl;
}
};
int main()
{
A *p = new B();
p->v_fun(); // B::v_fun()
return 0;
}
纯è彿°ï¼
- 纯è彿°å¨ç±»ä¸å£°ææ¶ï¼å ä¸ =0ï¼
- å«æçº¯è彿°ç类称为æ½è±¡ç±»ï¼åªè¦å«æçº¯è彿°è¿ä¸ªç±»å°±æ¯æ½è±¡ç±»ï¼ï¼ç±»ä¸åªææ¥å£ï¼æ²¡æå ·ä½çå®ç°æ¹æ³ï¼
- ç»§æ¿çº¯è彿°çæ´¾çç±»ï¼å¦ææ²¡æå®å ¨å®ç°åºç±»çº¯è彿°ï¼ä¾ç¶æ¯æ½è±¡ç±»ï¼ä¸è½å®ä¾å对象ã
说æï¼
- æ½è±¡ç±»å¯¹è±¡ä¸è½ä½ä¸ºå½æ°çåæ°ï¼ä¸è½å建对象ï¼ä¸è½ä½ä¸ºå½æ°è¿åç±»åï¼
- å¯ä»¥å£°ææ½è±¡ç±»æéï¼å¯ä»¥å£°ææ½è±¡ç±»çå¼ç¨ï¼
- åç±»å¿ é¡»ç»§æ¿ç¶ç±»ç纯è彿°ï¼å¹¶å ¨é¨å®ç°åï¼æè½å建åç±»ç对象ã
# è彿°å纯è彿°çåºå«ï¼
- è彿°å纯è彿°å¯ä»¥åºç°å¨åä¸ä¸ªç±»ä¸ï¼è¯¥ç±»ç§°ä¸ºæ½è±¡åºç±»ãï¼å«æçº¯è彿°ç类称为æ½è±¡åºç±»ï¼
- ä½¿ç¨æ¹å¼ä¸åï¼è彿°å¯ä»¥ç´æ¥ä½¿ç¨ï¼çº¯è彿°å¿ 须卿´¾çç±»ä¸å®ç°åæè½ä½¿ç¨ï¼
- å®ä¹å½¢å¼ä¸åï¼è彿°å¨å®ä¹æ¶å¨æ®é彿°çåºç¡ä¸å ä¸ virtual å ³é®åï¼çº¯è彿°å®ä¹æ¶é¤äºå ä¸virtual å ³é®åè¿éè¦å ä¸ =0;
- è彿°å¿ é¡»å®ç°ï¼å¦åç¼è¯å¨ä¼æ¥éï¼
- 对äºå®ç°çº¯è彿°çæ´¾çç±»ï¼è¯¥çº¯è彿°å¨æ´¾çç±»ä¸è¢«ç§°ä¸ºè彿°ï¼è彿°å纯è彿°é½å¯ä»¥å¨æ´¾çç±»ä¸éåï¼
- ææå½æ°æå¥½å®ä¹ä¸ºè彿°ï¼ç¹å«æ¯å¯¹äºå«æç»§æ¿å ³ç³»çç±»ï¼ææå½æ°å¯ä»¥å®ä¹ä¸ºçº¯è彿°ï¼æ¤æ¶ï¼å ¶æå¨ç类为æ½è±¡åºç±»ï¼ä¸è½å建å®ä¾å对象ã
# è彿°çå®ç°æºå¶æ¯ä»ä¹ï¼
å®ç°æºå¶ï¼è彿°éè¿è彿°è¡¨æ¥å®ç°ãè彿°çå°åä¿åå¨è彿°è¡¨ä¸ï¼å¨ç±»ç对象æå¨çå å空é´ä¸ï¼ä¿åäºæåè彿°è¡¨çæéï¼ç§°ä¸ºâè表æéâï¼ï¼éè¿è表æéå¯ä»¥æ¾å°ç±»å¯¹åºçè彿°è¡¨ãè彿°è¡¨è§£å³äºåºç±»åæ´¾çç±»çç»§æ¿é®é¢åç±»ä¸æå彿°çè¦çé®é¢ï¼å½ç¨åºç±»çæéæ¥æä½ä¸ä¸ªæ´¾çç±»çæ¶åï¼è¿å¼ è彿°è¡¨å°±ææäºå®é åºè¯¥è°ç¨ç彿°
è彿°è¡¨ç¸å ³ç¥è¯ç¹ï¼
- è彿°è¡¨åæ¾çå 容ï¼ç±»çè彿°çå°åã
- è彿°è¡¨å»ºç«çæ¶é´ï¼ç¼è¯é¶æ®µï¼å³ç¨åºçç¼è¯è¿ç¨ä¸ä¼å°è彿°çå°åæ¾å¨è彿°è¡¨ä¸ã
- è表æéä¿åçä½ç½®ï¼è表æéåæ¾å¨å¯¹è±¡çå å空é´ä¸æåé¢çä½ç½®ï¼è¿æ¯ä¸ºäºä¿è¯æ£ç¡®åå°è彿°çåç§»éã
注ï¼è彿°è¡¨åç±»ç»å®ï¼è表æéå对象ç»å®ãå³ç±»çä¸åç对象çè彿°è¡¨æ¯ä¸æ ·çï¼ä½æ¯æ¯ä¸ªå¯¹è±¡é½æèªå·±çè表æéï¼æ¥æåç±»çè彿°è¡¨ã
ä¾åï¼æ è彿°è¦ççæ åµï¼
#include <iostream>
using namespace std;
class Base
{
public:
virtual void B_fun1() { cout << "Base::B_fun1()" << endl; }
virtual void B_fun2() { cout << "Base::B_fun2()" << endl; }
virtual void B_fun3() { cout << "Base::B_fun3()" << endl; }
};
class Derive : public Base
{
public:
virtual void D_fun1() { cout << "Derive::D_fun1()" << endl; }
virtual void D_fun2() { cout << "Derive::D_fun2()" << endl; }
virtual void D_fun3() { cout << "Derive::D_fun3()" << endl; }
};
int main()
{
Base *p = new Derive();
p->B_fun1(); // Base::B_fun1()
return 0;
}
åºç±»åæ´¾çç±»çç»§æ¿å ³ç³»ï¼

åºç±»çè彿°è¡¨ï¼

æ´¾çç±»çè彿°è¡¨ï¼

䏻彿°ä¸åºç±»çæé p æåäºæ´¾çç±»ç对象ï¼å½è°ç¨å½æ° B_fun1() æ¶ï¼éè¿æ´¾çç±»çè彿°è¡¨æ¾å°è¯¥å½æ°çå°åï¼ä»è宿è°ç¨ã
# åç»§æ¿åå¤ç»§æ¿çè彿°è¡¨ç»ææ¯ææ ·çï¼
ç¼è¯å¨å¤çè彿°è¡¨ï¼
- ç¼è¯å¨å°è彿°è¡¨çæéæ¾å¨ç±»çå®ä¾å¯¹è±¡çå å空é´ä¸ï¼è¯¥å¯¹è±¡è°ç¨è¯¥ç±»çè彿°æ¶ï¼éè¿æéæ¾å°è彿°è¡¨ï¼æ ¹æ®è彿°è¡¨ä¸åæ¾çè彿°çå°åæ¾å°å¯¹åºçè彿°ã
- å¦ææ´¾ç类没æéæ°å®ä¹åºç±»çè彿° Aï¼åæ´¾çç±»çè彿°è¡¨ä¸ä¿åçæ¯åºç±»çè彿° A çå°åï¼ä¹å°±æ¯è¯´åºç±»åæ´¾çç±»çè彿° A çå°åæ¯ä¸æ ·çã
- å¦ææ´¾çç±»éåäºåºç±»çæä¸ªè彿° Bï¼åæ´¾ççè彿°è¡¨ä¸ä¿åçæ¯éååçè彿° B çå°åï¼ä¹å°±æ¯è¯´è彿° B æä¸¤ä¸ªçæ¬ï¼åå«åæ¾å¨åºç±»åæ´¾çç±»çè彿°è¡¨ä¸ã
- å¦ææ´¾çç±»éæ°å®ä¹äºæ°çè彿° Cï¼æ´¾çç±»çè彿°è¡¨ä¿åæ°çè彿° C çå°åã
åç»§æ¿æ è彿°è¦ççæ åµï¼
#include <iostream>
using namespace std;
class Base
{
public:
virtual void B_fun1() { cout << "Base::B_fun1()" << endl; }
virtual void B_fun2() { cout << "Base::B_fun2()" << endl; }
virtual void B_fun3() { cout << "Base::B_fun3()" << endl; }
};
class Derive : public Base
{
public:
virtual void D_fun1() { cout << "Derive::D_fun1()" << endl; }
virtual void D_fun2() { cout << "Derive::D_fun2()" << endl; }
virtual void D_fun3() { cout << "Derive::D_fun3()" << endl; }
};
int main()
{
Base *p = new Derive();
p->B_fun1(); // Base::B_fun1()
return 0;
}
åºç±»åæ´¾çç±»çç»§æ¿å ³ç³»ï¼

åºç±»çè彿°è¡¨ï¼

æ´¾çç±»çè彿°è¡¨ï¼

åç»§æ¿æè彿°è¦ççæ åµï¼
#include <iostream>
using namespace std;
class Base
{
public:
virtual void fun1() { cout << "Base::fun1()" << endl; }
virtual void B_fun2() { cout << "Base::B_fun2()" << endl; }
virtual void B_fun3() { cout << "Base::B_fun3()" << endl; }
};
class Derive : public Base
{
public:
virtual void fun1() { cout << "Derive::fun1()" << endl; }
virtual void D_fun2() { cout << "Derive::D_fun2()" << endl; }
virtual void D_fun3() { cout << "Derive::D_fun3()" << endl; }
};
int main()
{
Base *p = new Derive();
p->fun1(); // Derive::fun1()
return 0;
}
æ´¾çç±»çè彿°è¡¨ï¼

å¤ç»§æ¿æ è彿°è¦ççæ åµï¼
#include <iostream>
using namespace std;
class Base1
{
public:
virtual void B1_fun1() { cout << "Base1::B1_fun1()" << endl; }
virtual void B1_fun2() { cout << "Base1::B1_fun2()" << endl; }
virtual void B1_fun3() { cout << "Base1::B1_fun3()" << endl; }
};
class Base2
{
public:
virtual void B2_fun1() { cout << "Base2::B2_fun1()" << endl; }
virtual void B2_fun2() { cout << "Base2::B2_fun2()" << endl; }
virtual void B2_fun3() { cout << "Base2::B2_fun3()" << endl; }
};
class Base3
{
public:
virtual void B3_fun1() { cout << "Base3::B3_fun1()" << endl; }
virtual void B3_fun2() { cout << "Base3::B3_fun2()" << endl; }
virtual void B3_fun3() { cout << "Base3::B3_fun3()" << endl; }
};
class Derive : public Base1, public Base2, public Base3
{
public:
virtual void D_fun1() { cout << "Derive::D_fun1()" << endl; }
virtual void D_fun2() { cout << "Derive::D_fun2()" << endl; }
virtual void D_fun3() { cout << "Derive::D_fun3()" << endl; }
};
int main(){
Base1 *p = new Derive();
p->B1_fun1(); // Base1::B1_fun1()
return 0;
}
åºç±»åæ´¾çç±»çå ³ç³»ï¼

æ´¾çç±»çè彿°è¡¨ï¼ï¼åºç±»ç顺åºå声æç顺åºä¸è´ï¼

å¤ç»§æ¿æè彿°è¦ççæ åµï¼
#include <iostream>
using namespace std;
class Base1
{
public:
virtual void fun1() { cout << "Base1::fun1()" << endl; }
virtual void B1_fun2() { cout << "Base1::B1_fun2()" << endl; }
virtual void B1_fun3() { cout << "Base1::B1_fun3()" << endl; }
};
class Base2
{
public:
virtual void fun1() { cout << "Base2::fun1()" << endl; }
virtual void B2_fun2() { cout << "Base2::B2_fun2()" << endl; }
virtual void B2_fun3() { cout << "Base2::B2_fun3()" << endl; }
};
class Base3
{
public:
virtual void fun1() { cout << "Base3::fun1()" << endl; }
virtual void B3_fun2() { cout << "Base3::B3_fun2()" << endl; }
virtual void B3_fun3() { cout << "Base3::B3_fun3()" << endl; }
};
class Derive : public Base1, public Base2, public Base3
{
public:
virtual void fun1() { cout << "Derive::fun1()" << endl; }
virtual void D_fun2() { cout << "Derive::D_fun2()" << endl; }
virtual void D_fun3() { cout << "Derive::D_fun3()" << endl; }
};
int main(){
Base1 *p1 = new Derive();
Base2 *p2 = new Derive();
Base3 *p3 = new Derive();
p1->fun1(); // Derive::fun1()
p2->fun1(); // Derive::fun1()
p3->fun1(); // Derive::fun1()
return 0;
}
åºç±»åæ´¾çç±»çå ³ç³»ï¼

æ´¾çç±»çè彿°è¡¨ï¼

# C++空类ç大尿¯å¤å°ï¼
C++ 空类ç大尿¯ 1 åèã
åå å¾ç®åï¼C++ è§å®ï¼ä»»ä½å¯¹è±¡é½å¿ é¡»æä¸ä¸ªå¯ä¸çå åå°åãå¦æç©ºç±»å¤§å°ä¸º 0ï¼é£ä¹å½å建è¿ä¸ªç±»çå¤ä¸ªå¯¹è±¡æ¶ï¼å®ä»¬ä¼å ±äº«åä¸ä¸ªå°åï¼è¿è¿åäº âæ¯ä¸ªå¯¹è±¡å°åå¯ä¸â çè§åãæä»¥ç¼è¯å¨ä¼ç»ç©ºç±»éå¼åé 1 åèç空é´ï¼ç®çå°±æ¯ä¸ºäºè®©è¿ä¸ªç±»çæ¯ä¸ªå®ä¾é½è½æ¥æç¬ä¸æ äºçå åå°åã
ä¾å¦ï¼
class A {};
int main(){
cout<<sizeof(A)<<endl;// è¾åº 1;
A a;
cout<<sizeof(a)<<endl;// è¾åº 1;
return 0;
}
- C++空类ç大å°ä¸ä¸º0ï¼ä¸åç¼è¯å¨è®¾ç½®ä¸ä¸æ ·ï¼vsålg++齿¯è®¾ç½®ä¸º1ï¼
- C++æ åæåºï¼ä¸å 许ä¸ä¸ªå¯¹è±¡ï¼å½ç¶å æ¬ç±»å¯¹è±¡ï¼ç大å°ä¸º0ï¼ä¸åç对象ä¸è½å ·æç¸åçå°åï¼
- 带æè彿°çC++类大å°ä¸ä¸º1**ï¼å 为æ¯ä¸ä¸ªå¯¹è±¡ä¼æä¸ä¸ªvptræåè彿°è¡¨ï¼**å ·ä½å¤§å°æ ¹æ®æé大å°ç¡®å®ï¼
- C++ä¸è¦æ±å¯¹äºç±»çæ¯ä¸ªå®ä¾é½å¿ é¡»æç¬ä¸æ äºçå°å,é£ä¹ç¼è¯å¨èªå¨ä¸ºç©ºç±»åé ä¸ä¸ªåè大å°ï¼è¿æ ·ä¾¿ä¿è¯äºæ¯ä¸ªå®ä¾åæç¬ä¸æ äºçå åå°åã
å¨C++ä¸ç©ºç±»ä¼å ä¸ä¸ªåèï¼è¿æ¯ä¸ºäºè®©å¯¹è±¡çå®ä¾è½å¤ç¸äºåºå«ãå ·ä½æ¥è¯´ï¼ç©ºç±»åæ ·å¯ä»¥è¢«å®ä¾åï¼å¹¶ä¸æ¯ä¸ªå®ä¾å¨å åä¸é½æç¬ä¸æ äºçå°åï¼å æ¤ï¼ç¼è¯å¨ä¼ç»ç©ºç±»éå«å ä¸ä¸ä¸ªåèï¼è¿æ ·ç©ºç±»å®ä¾åä¹å就伿¥æç¬ä¸æ äºçå åå°åãå½è¯¥ç©ºç½ç±»ä½ä¸ºåºç±»æ¶ï¼è¯¥ç±»ç大å°å°±ä¼å为0äºï¼åç±»ç大å°å°±æ¯åç±»æ¬èº«ç大å°ãè¿å°±æ¯æè°ç空ç½åºç±»æä¼åã
空类çå®ä¾å¤§å°å°±æ¯ç±»ç大å°ï¼æä»¥sizeof(a)=1åèï¼å¦æaæ¯æéï¼åsizeof(a)å°±æ¯æéç大å°ï¼å³4åèã
# åªå«è彿°çç±»ç大尿¯å¤å¤§ï¼
å 为æè彿°ç类对象ä¸é½æä¸ä¸ªè彿°è¡¨æé __vptrï¼å ¶å¤§å°æ¯4åèï¼32使ºå¨ä¸ï¼
class A { virtual Fun(){} };
int main(){
cout<<sizeof(A)<<endl;// è¾åº 4(32使ºå¨)/8(64使ºå¨);
A a;
cout<<sizeof(a)<<endl;// è¾åº 4(32使ºå¨)/8(64使ºå¨);
return 0;
}
# ä¸ä¸ªåªå å«int åéç空classååªå å«intåéç空structçå ååå å¤å¤§ï¼
åªå«æä¸ä¸ªintæååéçç±»ç大尿¯4
class A { int a; };
int main(){
cout<<sizeof(A)<<endl;// è¾åº 4;
A a;
cout<<sizeof(a)<<endl;// è¾åº 4;
return 0;
}
åªæ¯ä¸ä¸ªintåéç大å°ââ4åè
åªå«æä¸ä¸ªéææååéçç±»ç大尿¯1
class A { static int a; };
int main(){
cout<<sizeof(A)<<endl;// è¾åº 1;
A a;
cout<<sizeof(a)<<endl;// è¾åº 1;
return 0;
}
éææååæ¾å¨éæåå¨åºï¼ä¸å ç¨ç±»ç大å°, æ®é彿°ä¹ä¸å ç¨ç±»å¤§å°
class A { static int a; int b; };;
int main(){
cout<<sizeof(A)<<endl;// è¾åº 4;
A a;
cout<<sizeof(a)<<endl;// è¾åº 4;
return 0;
}
éææåaä¸å ç¨ç±»ç大å°ï¼æä»¥ç±»ç大å°å°±æ¯båéçå¤§å° å³4个åè
# C++ è¯è¨ç¹æ§
# å·¦å¼åå³å¼çåºå«ï¼å·¦å¼å¼ç¨åå³å¼å¼ç¨çåºå«ï¼å¦ä½å°å·¦å¼è½¬æ¢æå³å¼ï¼
å·¦å¼ï¼æè¡¨è¾¾å¼ç»æåä¾ç¶åå¨çæä¹ 对象ã
å³å¼ï¼è¡¨è¾¾å¼ç»æå°±ä¸ååå¨ç临æ¶å¯¹è±¡ã
å·¦å¼åå³å¼çåºå«ï¼å·¦å¼æä¹ ï¼å³å¼çæ
å³å¼å¼ç¨åå·¦å¼å¼ç¨çåºå«ï¼
- å·¦å¼å¼ç¨ä¸è½ç»å®å°è¦è½¬æ¢ç表达å¼ãåé¢å¸¸éæè¿åå³å¼ç表达å¼ãå³å¼å¼ç¨æ°å¥½ç¸åï¼å¯ä»¥ç»å®å°è¿ç±»è¡¨è¾¾å¼ï¼ä½ä¸è½ç»å®å°ä¸ä¸ªå·¦å¼ä¸ã
- å³å¼å¼ç¨å¿ é¡»ç»å®å°å³å¼çå¼ç¨ï¼éè¿ && è·å¾ãå³å¼å¼ç¨åªè½ç»å®å°ä¸ä¸ªå°è¦éæ¯ç对象ä¸ï¼å æ¤å¯ä»¥èªç±å°ç§»å¨å ¶èµæºã
std::move å¯ä»¥å°ä¸ä¸ªå·¦å¼å¼ºå¶è½¬å为å³å¼ï¼ç»§èå¯ä»¥éè¿å³å¼å¼ç¨ä½¿ç¨è¯¥å¼ï¼ä»¥ç¨äºç§»å¨è¯ä¹ã
#include <iostream>
using namespace std;
void fun1(int& tmp)
{
cout << "fun1(int& tmp):" << tmp << endl;
}
void fun2(int&& tmp)
{
cout << "fun2(int&& tmp)" << tmp << endl;
}
int main()
{
int var = 11;
fun1(12); // error: cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int'
fun1(var);
fun2(1);
}
# ä»ç»ç§»å¨è¯ä¹
ç§»å¨è¯ä¹éè¿å³å¼å¼ç¨ï¼Rvalue Referencesï¼åç§»å¨æé 彿°ï¼Move Constructorsï¼æ¥ä¼å对象å¨å åä¸çä¼ éåå¤çï¼é¿å ä¸å¿ è¦çæ°æ®å¤å¶ã
ä¼ ç»çæ·è´æä½å¯¹äºå¤§å对象æèµæºå¯éå对象æ¥è¯´å¯è½ä¼æå¾é«çå¼éï¼å 为å®ä»¬éè¦å°å¯¹è±¡çæææ°æ®å¤å¶å°æ°ç对象ä¸ãç§»å¨è¯ä¹çå¼å ¥è§£å³äºè¿ä¸é®é¢ï¼å®ç°äºå¯¹è±¡èµæºçâç§»å¨âèéâå¤å¶âã
- å³å¼å¼ç¨ï¼Rvalue Referencesï¼ï¼éè¿ä½¿ç¨åå¼å·&&声æå³å¼å¼ç¨ï¼å¯ä»¥ç»å®å°ä¸´æ¶å¯¹è±¡æå³å¼ï¼å³é£äºå°ä¼è¢«éæ¯ç临æ¶å¯¹è±¡ãå³å¼å¼ç¨å 许æä»¬å¯¹å ¶èµæºè¿è¡ç§»å¨æä½è䏿¯å¤å¶æä½ã
T&& t = T(); // t为å³å¼å¼ç¨
- ç§»å¨æé 彿°ï¼Move Constructorï¼ï¼ç§»å¨æé 彿°æ¯ä¸é¨ç¨äºå°å¯¹è±¡èµæºä»ä¸ä¸ªå³å¼å¼ç¨å¯¹è±¡âç§»å¨âå°å¦ä¸ä¸ªå¯¹è±¡çæé 彿°ãå®éè¿å°èµæºæææä»ä¸ä¸ªå¯¹è±¡è½¬ç§»å°å¦ä¸ä¸ªå¯¹è±¡æ¥é¿å ä¸å¿ è¦çæ°æ®å¤å¶ï¼ä»èæé«ç¨åºæ§è½ã
// ç§»å¨æé 彿°ç¤ºä¾
T(T&& other) {
// å°other对象çèµæºç§»å¨å°å½å对象
}
- æ 记对象为å³å¼ï¼std::moveï¼ï¼ä½¿ç¨std::move彿°å¯ä»¥å°ä¸ä¸ªå¯¹è±¡æ 记为å³å¼ï¼ä»¥ä¾¿å¯ä»¥è°ç¨ç§»å¨æé 彿°è䏿¯æ·è´æé 彿°ã
T obj1;
T obj2 = std::move(obj1); // å°obj1æ 记为å³å¼ï¼è°ç¨ç§»å¨æé 彿°
ç§»å¨è¯ä¹çåºç¨å¯ä»¥å¨æ¶åå¯¹è±¡æææè½¬ç§»çæ åµä¸æé«æ§è½ï¼ç¹å«æ¯å¨å¨æå å管çå容å¨å ç´ ç§»å¨æ¶ãéè¿é¿å ä¸å¿ è¦çå¤å¶æä½ï¼ç§»å¨è¯ä¹ä½¿å¾ä»£ç æ´å 髿åå¯ç»´æ¤ï¼åæ¶åå°äºèµæºç浪费ã
# å³å¼å¼ç¨æä»ä¹ä½ç¨ï¼
- å³å¼å¼ç¨æ¯C++11å¼å ¥çç¹æ§ï¼å®æ¯æå¯¹å³å¼è¿è¡å¼ç¨çä¸ç§æ¹å¼ãå³å¼å¼ç¨çä½ç¨ä¸»è¦æä¸¤ä¸ªï¼
- å¯ä»¥éè¿å³å¼å¼ç¨æ¥å®ç°ç§»å¨è¯ä¹ãç§»å¨è¯ä¹å¯ä»¥å¨ä¸è¿è¡æ·±æ·è´çæ åµä¸ï¼å°å¯¹è±¡çèµæºæææä»ä¸ä¸ªå¯¹è±¡è½¬ç§»å°å¦ä¸ä¸ªå¯¹è±¡ï¼ä»èæé«ä»£ç çæçã
- å³å¼å¼ç¨è¿å¯ä»¥ç¨äºå®ç¾è½¬åãå¨å½æ°æ¨¡æ¿ä¸ï¼éè¿ä½¿ç¨å³å¼å¼ç¨ç±»åçå½¢åæ¥æ¥æ¶åæ°ï¼å¯ä»¥å®ç°å®ç¾è½¬åï¼å³ä¿æååæ°çå¼ç±»å«ï¼å·¦å¼è¿æ¯å³å¼ï¼ï¼å°åæ°ä¼ éç»å¦ä¸ä¸ªå½æ°ã
# std::move() 彿°çå®ç°åçæ¯ä»ä¹ï¼
std::move() 彿°ååï¼
template <typename T>
typename remove_reference<T>::type&& move(T&& t) {
return static_cast<typename remove_reference<T>::type &&>(t);
}
说æï¼å¼ç¨æå åç
- å³å¼ä¼ éç»ä¸è¿°å½æ°çå½¢å T&& ä¾ç¶æ¯å³å¼ï¼å³ T&& && ç¸å½äº T&&ã
- å·¦å¼ä¼ éç»ä¸è¿°å½æ°çå½¢å T&& ä¾ç¶æ¯å·¦å¼ï¼å³ T&& & ç¸å½äº T&ã
å°ç»ï¼éè¿å¼ç¨æå åçå¯ä»¥ç¥éï¼move() 彿°ç形忢å¯ä»¥æ¯å·¦å¼ä¹å¯ä»¥æ¯å³å¼ã
remove_reference å ·ä½å®ç°ï¼
//åå§çï¼æéç¨ççæ¬
template <typename T>
struct remove_reference {
typedef T type; //å®ä¹ T çç±»åå«å为 type
};
//é¨åçæ¬ç¹ä¾åï¼å°ç¨äºå·¦å¼å¼ç¨åå³å¼å¼ç¨
template <class T>
struct remove_reference<T&> { //å·¦å¼å¼ç¨
typedef T type;
};
template <class T>
struct remove_reference<T&&> { //å³å¼å¼ç¨
typedef T type;
};
//举ä¾å¦ä¸,ä¸åå®ä¹çaãbãcä¸ä¸ªåé齿¯intç±»å
int i;
remove_refrence<decltype(42)>::type a; //使ç¨åçæ¬ï¼
remove_refrence<decltype(i)>::type b; //å·¦å¼å¼ç¨ç¹ä¾çæ¬
remove_refrence<decltype(std::move(i))>::type b; //å³å¼å¼ç¨ç¹ä¾çæ¬
举ä¾ï¼
int var = 10;
转åè¿ç¨ï¼
1. std::move(var) => std::move(int&& &) => æå å std::move(int&)
2. æ¤æ¶ï¼T çç±»å为 int&ï¼typename remove_reference<T>::type 为 intï¼è¿éä½¿ç¨ remove_reference çå·¦å¼å¼ç¨çç¹ä¾åçæ¬
3. éè¿ static_cast å° int& 强å¶è½¬æ¢ä¸º int&&
æ´ä¸ªstd::move被å®ä¾åå¦ä¸ï¼
string&& move(int& t) {
return static_cast<int&&>(t);
}
std::move() å®ç°åçï¼
- å©ç¨å¼ç¨æå åçå°å³å¼ç»è¿ T&& ä¼ éç±»åä¿æä¸åè¿æ¯å³å¼ï¼èå·¦å¼ç»è¿ T&& å为æ®éçå·¦å¼å¼ç¨ï¼ä»¥ä¿è¯æ¨¡æ¿å¯ä»¥ä¼ éä»»æå®åï¼ä¸ä¿æç±»åä¸åï¼
- ç¶åéè¿ remove_refrence ç§»é¤å¼ç¨ï¼å¾å°å ·ä½çç±»å Tï¼
- æåéè¿ static_cast<> è¿è¡å¼ºå¶ç±»å转æ¢ï¼è¿å T&& å³å¼å¼ç¨ã
# å¦ä½å¤æç»æä½æ¯å¦ç¸çï¼è½å¦ç¨ memcmp 彿°å¤æç»æä½ç¸çï¼
éè¦éè½½æä½ç¬¦ == å¤æä¸¤ä¸ªç»æä½æ¯å¦ç¸çï¼ä¸è½ç¨å½æ° memcmp æ¥å¤æä¸¤ä¸ªç»æä½æ¯å¦ç¸çï¼å 为 memcmp 彿°æ¯é个åèè¿è¡æ¯è¾çï¼èç»æä½åå¨å å空é´ä¸ä¿åæ¶åå¨åè对é½ï¼åè坹齿¶è¡¥çåèå 容æ¯éæºçï¼ä¼äº§çåå¾å¼ï¼æä»¥æ æ³æ¯è¾ã
å©ç¨è¿ç®ç¬¦éè½½æ¥å®ç°ç»æä½å¯¹è±¡çæ¯è¾ï¼
#include <iostream>
using namespace std;
struct A
{
char c;
int val;
A(char c_tmp, int tmp) : c(c_tmp), val(tmp) {}
friend bool operator==(const A &tmp1, const A &tmp2); // åå
è¿ç®ç¬¦éè½½å½æ°
};
bool operator==(const A &tmp1, const A &tmp2)
{
return (tmp1.c == tmp2.c && tmp1.val == tmp2.val);
}
int main()
{
A ex1('a', 90), ex2('b', 80);
if (ex1 == ex2)
cout << "ex1 == ex2" << endl;
else
cout << "ex1 != ex2" << endl; // è¾åº
return 0;
}
# ä»ä¹æ¯æ¨¡æ¿ï¼å¦ä½å®ç°ï¼
模æ¿ï¼å建类æè 彿°çè徿è å ¬å¼ï¼åä¸ºå½æ°æ¨¡æ¿å类模æ¿ã å®ç°æ¹å¼ï¼æ¨¡æ¿å®ä¹ä»¥å ³é®å template å¼å§ï¼åè·ä¸ä¸ªæ¨¡æ¿åæ°å表ã
- 模æ¿åæ°å表ä¸è½ä¸ºç©ºï¼
- 模æ¿ç±»ååæ°åå¿ é¡»ä½¿ç¨å ³é®å class æè typenameï¼å¨æ¨¡æ¿åæ°å表ä¸è¿ä¸¤ä¸ªå ³é®åå«ä¹ç¸åï¼å¯äºæ¢ä½¿ç¨ã
template <typename T, typename U, ...>
彿°æ¨¡æ¿ï¼éè¿å®ä¹ä¸ä¸ªå½æ°æ¨¡æ¿ï¼å¯ä»¥é¿å 为æ¯ä¸ç§ç±»åå®ä¹ä¸ä¸ªæ°å½æ°ã
- 对äºå½æ°æ¨¡æ¿èè¨ï¼æ¨¡æ¿ç±»ååæ°å¯ä»¥ç¨æ¥æå®è¿åç±»åæå½æ°çåæ°ç±»åï¼ä»¥åå¨å½æ°ä½å ç¨äºåé声ææç±»å转æ¢ã
- 彿°æ¨¡æ¿å®ä¾åï¼å½è°ç¨ä¸ä¸ªæ¨¡æ¿æ¶ï¼ç¼è¯å¨ç¨å½æ°å®åæ¥æ¨ææ¨¡æ¿å®åï¼ä»è使ç¨å®åçç±»åæ¥ç¡®å®ç»å®å°æ¨¡æ¿åæ°çç±»åã
#include <iostream>
using namespace std;
template <typename T>
T add_fun(const T & tmp1, const T & tmp2) {
return tmp1 + tmp2;
}
int main() {
int var1, var2;
cin >> var1 >> var2;
cout << add_fun(var1, var2);
double var3, var4;
cin >> var3 >> var4;
cout << add_fun(var3, var4);
return 0;
}
类模æ¿ï¼ç±»ä¼¼å½æ°æ¨¡æ¿ï¼ç±»æ¨¡æ¿ä»¥å ³é®å template å¼å§ï¼åè·æ¨¡æ¿åæ°å表ã使¯ï¼ç¼è¯å¨ä¸è½ä¸ºç±»æ¨¡æ¿æ¨ææ¨¡æ¿åæ°ç±»åï¼éè¦å¨ä½¿ç¨è¯¥ç±»æ¨¡æ¿æ¶ï¼å¨æ¨¡æ¿ååé¢çå°æ¬å·ä¸ææç±»åã
#include <iostream>
using namespace std;
template <typename T>
class Complex {
public:
//æé 彿°
Complex(T a, T b) {
this->a = a;
this->b = b;
}
//è¿ç®ç¬¦éè½½
Complex<T> operator+(Complex &c) {
Complex<T> tmp(this->a + c.a, this->b + c.b);
cout << tmp.a << " " << tmp.b << endl;
return tmp;
}
private:
T a;
T b;
};
int main() {
Complex<int> a(10, 20);
Complex<int> b(20, 30);
Complex<int> c = a + b;
return 0;
}
# 彿°æ¨¡æ¿å类模æ¿çåºå«ï¼
- å®ä¾åæ¹å¼ä¸åï¼å½æ°æ¨¡æ¿å®ä¾åç±ç¼è¯ç¨åºå¨å¤ç彿°è°ç¨æ¶èªå¨å®æï¼ç±»æ¨¡æ¿å®ä¾åéè¦å¨ç¨åºä¸æ¾å¼æå®ã
- å®ä¾åçç»æä¸åï¼å½æ°æ¨¡æ¿å®ä¾å忝ä¸ä¸ªå½æ°ï¼ç±»æ¨¡æ¿å®ä¾å忝ä¸ä¸ªç±»ã
- é»è®¤åæ°ï¼ç±»æ¨¡æ¿å¨æ¨¡æ¿åæ°å表ä¸å¯ä»¥æé»è®¤åæ°ã
- ç¹åï¼å½æ°æ¨¡æ¿åªè½å ¨ç¹åï¼è类模æ¿å¯ä»¥å ¨ç¹åï¼ä¹å¯ä»¥åç¹åã
- è°ç¨æ¹å¼ä¸åï¼å½æ°æ¨¡æ¿å¯ä»¥éå¼è°ç¨ï¼ä¹å¯ä»¥æ¾å¼è°ç¨ï¼ç±»æ¨¡æ¿åªè½æ¾å¼è°ç¨ã
彿°æ¨¡æ¿è°ç¨æ¹å¼ä¸¾ä¾ï¼
#include <iostream>
using namespace std;
template <typename T>
T add_fun(const T & tmp1, const T & tmp2) {
return tmp1 + tmp2;
}
int main() {
int var1, var2;
cin >> var1 >> var2;
cout << add_fun<int>(var1, var2); // æ¾å¼è°ç¨
double var3, var4;
cin >> var3 >> var4;
cout << add_fun(var3, var4); // éå¼è°ç¨
return 0;
}
ä»ä¹æ¯å¯ååæ°æ¨¡æ¿ï¼ å¯ååæ°æ¨¡æ¿ï¼æ¥åå¯åæ°ç®åæ°ç模æ¿å½æ°ææ¨¡æ¿ç±»ãå°å¯åæ°ç®çåæ°è¢«ç§°ä¸ºåæ°å ï¼å æ¬æ¨¡æ¿åæ°å å彿°åæ°å ã
- 模æ¿åæ°å ï¼è¡¨ç¤ºé¶ä¸ªæå¤ä¸ªæ¨¡æ¿åæ°ï¼
- 彿°åæ°å ï¼è¡¨ç¤ºé¶ä¸ªæå¤ä¸ªå½æ°åæ°ã
ç¨çç¥å·æ¥æåºä¸ä¸ªæ¨¡æ¿åæ°æå½æ°åæ°è¡¨ç¤ºä¸ä¸ªå ï¼å¨æ¨¡æ¿åæ°å表ä¸ï¼class⦠æ typename⦠æåºæ¥ä¸æ¥çåæ°è¡¨ç¤ºé¶ä¸ªæå¤ä¸ªç±»åçå表ï¼ä¸ä¸ªç±»åååé¢è·ä¸ä¸ªçç¥å·è¡¨ç¤ºé¶ä¸ªæå¤ä¸ªç»å®ç±»åçéç±»ååæ°çå表ãå½éè¦ç¥éå 䏿å¤å°å ç´ æ¶ï¼å¯ä»¥ä½¿ç¨ sizeof⦠è¿ç®ç¬¦ã
template <typename T, typename... Args> // Args æ¯æ¨¡æ¿åæ°å
void foo(const T &t, const Args&... rest); // å¯ååæ°æ¨¡æ¿ï¼rest æ¯å½æ°åæ°å
#include <iostream>
using namespace std;
template <typename T>
void print_fun(const T &t) {
cout << t << endl; // æåä¸ä¸ªå
ç´
}
template <typename T, typename... Args>
void print_fun(const T &t, const Args &...args) {
cout << t << " ";
print_fun(args...);
}
int main() {
print_fun("Hello", "wolrd", "!");
return 0;
}
/*è¿è¡ç»æï¼
Hello wolrd !
*/
说æï¼å¯å忰彿°é常æ¯éå½çï¼ç¬¬ä¸ä¸ªçæ¬ç print_fun è´è´£ç»æ¢éå½å¹¶æå°åå§è°ç¨ä¸çæåä¸ä¸ªå®åã第äºä¸ªçæ¬ç print_fun æ¯å¯ååæ°çæ¬ï¼æå°ç»å®å° t çå®åï¼å¹¶ç¨æ¥è°ç¨èªèº«æ¥æå°å½æ°åæ°å ä¸çå©ä½å¼ã
# C++ STL
C++ STLï¼æ 忍¡æ¿åºï¼æä¾äºå¤ç§å®¹å¨ï¼ç¨äºåå¨åç®¡çæ°æ®ï¼è¿äºå®¹å¨å¯å为åºåå¼å®¹å¨ãå ³èå¼å®¹å¨å容å¨éé å¨ä¸å¤§ç±»ï¼åèªéç¨äºä¸ååºæ¯ï¼

åºåå¼å®¹å¨ï¼æå ç´ æå ¥é¡ºåºåå¨ï¼å ç´ ä½ç½®ä¸æå ¥é¡ºåºç¸å ³ï¼ä¸èªå¨æåºã
vectorï¼å¨ææ°ç»ï¼å åè¿ç»ï¼æ¯æéæºè®¿é®ï¼[]æat()ï¼ï¼ä¼ç¹å°¾æ / å°¾å æçé«ï¼O (1)ï¼ï¼éåé¢ç¹è®¿é®å ç´ çåºæ¯ãç¼ºç¹æ¯ä¸é´æå ¥ / å 餿çä½ï¼O (n)ï¼ï¼æ©å®¹æ¶å¯è½éæ°åé å åãdequeï¼å端éåï¼å ååæ®µè¿ç»ï¼æ¯æé¦å°¾é«ææä½ãä¼ç¹å¤´æ / 头å ãå°¾æ / å°¾å æçå为 O (1)ï¼å¯éæºè®¿é®ï¼éååºæ¯éè¦å¨ä¸¤ç«¯é¢ç¹æä½çåºæ¯ï¼å¦å®ç°éåãæ ï¼ãlistï¼ååé¾è¡¨ï¼å ç´ éè¿æéè¿æ¥ï¼å åä¸è¿ç»ãä¼ç¹ä»»æä½ç½®æå ¥ / å 餿çé«ï¼O (1)ï¼åªéä¿®æ¹æéï¼ã缺ç¹ä¸æ¯æéæºè®¿é®ï¼è®¿é®å ç´ ééåï¼O (n)ï¼ï¼å åå¼éè¾å¤§ãarrayï¼åºå®å¤§å°æ°ç»ï¼C++11 æ°å¢ï¼ï¼ç¼è¯æ¶ç¡®å®å¤§å°ï¼å åè¿ç»ï¼æ¯åçæ°ç»æ´å®å ¨ï¼æ¯æè¾¹çæ£æ¥ï¼ï¼ä½å¤§å°ä¸å¯åã
å ³èå¼å®¹å¨ï¼å ç´ æé®ï¼keyï¼ æåºåå¨ï¼æ¯æå¿«éæ¥æ¾ï¼é常 O (log n)ï¼ï¼å为æåºåæ åºä¸¤ç±»ã
# æåºå ³è容å¨ï¼åºäºçº¢é»æ å®ç°ï¼
setï¼åå¨å¯ä¸é®å¼ï¼å ç´ èªå¨æé®ååºæåºï¼é®å³å¼ï¼key=valueï¼ãéååºæ¯éè¦å»é䏿åºçæ°æ®éåï¼å¦åå¨ä¸éå¤ç ID å¹¶æåºï¼ãmultisetï¼ä¸set类似ï¼ä½å 许é®å¼éå¤ï¼å ¶ä»ç¹æ§ç¸åãmapï¼åå¨é®å¼å¯¹ï¼key-valueï¼ï¼é®å¯ä¸ä¸èªå¨æåºï¼éè¿é®å¿«éæ¥æ¾å¼ãéååºæ¯é®å¼æ å°åºæ¯ï¼å¦åå ¸ãé 置表ï¼ãmultimapï¼ä¸map类似ï¼ä½å 许é®éå¤ï¼ä¸ä¸ªé®å¯å¯¹åºå¤ä¸ªå¼ï¼ã
æ åºå ³è容å¨ï¼C++11 æ°å¢ï¼åºäºåå¸è¡¨å®ç°ï¼
unordered_set/unordered_multisetï¼åè½åset/multisetï¼ä½å ç´ æ åºï¼éè¿åå¸è¡¨å®ç°ï¼æ¥æ¾ãæå ¥ãå é¤å¹³åæçæ´é«ï¼O (1)ï¼ãéååºæ¯å¯¹é¡ºåºæ è¦æ±ï¼ä½éè¦å¿«éå¢å æ¥çåºæ¯ãunordered_map/unordered_multimapï¼åè½åmap/multimapï¼æ åºï¼åºäºåå¸è¡¨ï¼å¹³åæä½æç O (1)ã
容å¨éé å¨ï¼åºäºå ¶ä»å®¹å¨å®ç°ï¼å°è£ ç¹å®æ¥å£ï¼æä¾åéåè½ã
stackï¼æ ï¼éµå¾ª âåè¿å åºï¼LIFOï¼âï¼ä» æ¯æå¨é¡¶é¨æå ¥ / å é¤ / 访é®å ç´ ï¼é»è®¤åºäºdequeå®ç°ï¼ä¹å¯æå®vectorælistä½ä¸ºåºå±å®¹å¨ãqueueï¼éåï¼éµå¾ª âå è¿å åºï¼FIFOï¼âï¼ä» æ¯æå¨å°¾é¨æå ¥ã头é¨å é¤ãé»è®¤åºäºdequeå®ç°ï¼ä¹å¯æå®listä½ä¸ºåºå±å®¹å¨ãpriority_queueï¼**ä¼å éåï¼å ç´ æä¼å 级èªå¨æåºï¼é»è®¤æå¤§å ç´ å¨é¡¶é¨ï¼ï¼æå ¥ / å 餿ç O (log n)ãé»è®¤åºäºvectorå®ç°ï¼åºå±ç¨å ç»æç»´æ¤ä¼å 级ã
# vectorä¸push_backåemplace_backçåºå«ï¼
- push_back() å容å¨å°¾é¨æ·»å å ç´ æ¶ï¼é¦å ä¼å建è¿ä¸ªå ç´ ï¼ç¶ååå°è¿ä¸ªå ç´ æ·è´æè ç§»å¨å°å®¹å¨ä¸ï¼å¦ææ¯æ·è´çè¯ï¼äºåä¼èªè¡éæ¯å åå建çè¿ä¸ªå ç´ ï¼ï¼
- èemplace_back() å¨å®ç°æ¶ï¼åæ¯ç´æ¥å¨å®¹å¨å°¾é¨å建è¿ä¸ªå ç´ ï¼çå»äºæ·è´æç§»å¨å ç´ çè¿ç¨ã
# C++ çmapæ¯çº¿ç¨å®å ¨çä¹ï¼
䏿¯çº¿ç¨å®å
¨çã妿å¤ä¸ªçº¿ç¨åæ¶å¯¹ std::map è¿è¡æä½ï¼å°¤å
¶æ¯åæä½ï¼å¦æå
¥ãå é¤ãä¿®æ¹å
ç´ ï¼ï¼å¯è½ä¼å¯¼è´æªå®ä¹è¡ä¸ºï¼ä¾å¦æ°æ®æåãè¿ä»£å¨å¤±æãç¨åºå´©æºçï¼ã
å ·ä½æ¥è¯´ï¼çº¿ç¨ä¸å®å ¨ä¸»è¦ä½ç°å¨ï¼
- å¹¶ååæä½ï¼å¤ä¸ªçº¿ç¨åæ¶æ§è¡æå
¥ï¼
insertï¼ãå é¤ï¼eraseï¼æä¿®æ¹ï¼å¦operator[]èµå¼ï¼æ¶ï¼ä¼ç ´åstd::mapå é¨ççº¢é»æ ç»æï¼æåºå ³è容å¨çåºå±å®ç°ï¼ï¼å¯¼è´æ°æ®éä¹±ã - 读åå¹¶åï¼å³ä½¿ä¸ä¸ªçº¿ç¨è¯»ãå¦ä¸ä¸ªçº¿ç¨åï¼ä¹å¯è½åºç°é®é¢ãä¾å¦ï¼è¯»çº¿ç¨æ£å¨éå
mapæ¶ï¼å线ç¨ä¿®æ¹äºç»æï¼å¯è½å¯¼è´è¯»çº¿ç¨çè¿ä»£å¨å¤±æï¼è§¦åä¸å¯é¢ç¥çé误ã - æ å
ç½®åæ¥æºå¶ï¼
std::map没ææä¾ä»»ä½éï¼å¦äºæ¥éï¼æååæä½æ¥ä¿è¯å¤çº¿ç¨å®å ¨ï¼ææåæ¥é»è¾éè¦å¼åè æå¨å®ç°ã
妿è¦å¤çº¿ç¨å®å ¨ä½¿ç¨mapï¼ééè¿å¤é¨åæ¥æºå¶ä¿è¯çº¿ç¨å®å ¨ï¼å¸¸è§æ¹å¼ï¼
- å éä¿æ¤ï¼ä½¿ç¨
std::mutexæstd::lock_guardçåæ¥å·¥å ·ï¼ç¡®ä¿å䏿¶é´åªæä¸ä¸ªçº¿ç¨è½è®¿é®æä¿®æ¹mapãä¾å¦ï¼
#include <map>
#include <mutex>
std::map<int, int> my_map;
std::mutex mtx; // äºæ¥é
// 线ç¨å®å
¨çæå
¥æä½
void safe_insert(int key, int value) {
std::lock_guard<std::mutex> lock(mtx); // èªå¨å é/è§£é
my_map[key] = value;
}
// 线ç¨å®å
¨çæ¥æ¾æä½
int safe_find(int key) {
std::lock_guard<std::mutex> lock(mtx);
auto it = my_map.find(key);
return (it != my_map.end()) ? it->second : -1;
}
- 使ç¨çº¿ç¨å®å
¨çæ¿ä»£å®¹å¨ï¼æäºåºï¼å¦ C++17 åç
concurrent_unordered_mapéæ åæ©å±ï¼æç¬¬ä¸æ¹åºå¦ Intel TBBï¼æä¾äºçº¿ç¨å®å ¨çåå¸è¡¨ / æ å°å®¹å¨ï¼å¯åå°æå¨å éçå¼éã
# unordered_mapçåºå±ç»ææ¯ä»ä¹ï¼
åºå±ç»æåºäºåå¸è¡¨å®ç°ã

std::unordered_map å
é¨ç»´æ¤äºä¸ä¸ªå叿¡¶æ°ç»ï¼æ°ç»ä¸çæ¯ä¸ªå
ç´ ç§°ä¸ºä¸ä¸ªå叿¡¶ãæ¯ä¸ªå叿¡¶å¯ä»¥åå¨ä¸ä¸ªæå¤ä¸ªé®å¼å¯¹ãå½å¤ä¸ªé®éè¿åå¸å½æ°è®¡ç®å¾å°ç¸åçç´¢å¼æ¶ï¼å°±ä¼åçåå¸å²çªã
std::unordered_map é常使ç¨é¾å°åæ³æ¥è§£å³åå¸å²çªãå¨é¾å°åæ³ä¸ï¼æ¯ä¸ªå叿¡¶æ¯ä¸ä¸ªé¾è¡¨ï¼å½åçåå¸å²çªæ¶ï¼æ°çé®å¼å¯¹ä¼è¢«æå
¥å°å¯¹åºçé¾è¡¨æå®¹å¨ä¸ã
# C++容å¨å¯ä»¥ä¸è¾¹éåä¸è¾¹æå ¥åï¼
å½å¤çvector,string,dequeæ¶ï¼å½å¨ä¸ä¸ªå¾ªç¯ä¸å¯è½å¢å æç§»é¤å ç´ æ¶ï¼è¦èèå°è¿ä»£å¨å¯è½ä¼å¤±æçé®é¢ã
vectoræå ¥çæ¶åï¼
- å½æå ¥(push_back)ä¸ä¸ªå ç´ åï¼endæä½è¿åçè¿ä»£å¨è¯å®å¤±æï¼
- å½æå ¥(push_back)ä¸ä¸ªå ç´ åï¼å¦ævectorçcapacityåçäºæ¹åï¼åéè¦éæ°å è½½æ´ä¸ªå®¹å¨ï¼æ¤æ¶firståendæä½è¿åçè¿ä»£å¨é½ä¼å¤±æï¼
listæå ¥çæ¶åï¼
- æå ¥æä½(insert)忥åæä½(splice)ä¸ä¼é æåæçlistè¿ä»£å¨å¤±æï¼
dequeæå ¥çæ¶åï¼
- å¨deque容å¨é¦é¨æè å°¾é¨æå ¥å ç´ ï¼ä¸ä¼ä½¿å¾ä»»ä½è¿ä»£å¨å¤±æï¼
- å¨deque容å¨çä»»ä½å ¶ä»ä½ç½®è¿è¡æå ¥æå 餿ä½é½å°ä½¿æå该容å¨å ç´ çææè¿ä»£å¨å¤±æï¼
setåmapæå ¥çæ¶åï¼
- ä¸listç¸åï¼å½å¯¹å ¶è¿è¡insertæè eraseæä½æ¶ï¼æä½ä¹åçææè¿ä»£å¨ï¼å¨æä½å®æä¹åé½ä¾ç¶ææï¼ä½è¢«å é¤å ç´ çè¿ä»£å¨å¤±æã
# 使ç¨è¿ä»£å¨æä¹å é¤ä¸ä¸ªå ç´ ï¼
顺åºå®¹å¨ï¼åºåå¼å®¹å¨ï¼æ¯å¦vectorãdequeï¼å é¤å ç´ çæ¹å¼ï¼eraseè¿ä»£å¨ä¸ä» 使ææå被å é¤çè¿ä»£å¨å¤±æï¼èä¸ä½¿è¢«å å ç´ ä¹åçææè¿ä»£å¨å¤±æ(listé¤å¤)ï¼æä»¥ä¸è½ä½¿ç¨erase(it++)çæ¹å¼ï¼ä½æ¯eraseçè¿å弿¯ä¸ä¸ä¸ªææè¿ä»£å¨ï¼It = c.erase(it);
std::vector<int> arrayInt;
...
std::vector<int>::iterator it = arrayInt.begin();
while (it != arrayInt.end())
{
if (...)
{
// éè¦æ³¨æçæ¯ï¼å 为顺åºå¼å®¹å¨ä¼ä½¿æ¬èº«ååé¢çå
ç´ è¿ä»£å¨é½å¤±æï¼æä»¥ä¸è½ç®åç++æä½
// 顺åºå¼å®¹å¨çerase()ä¼è¿åç´§é被å é¤å
ç´ çä¸ä¸ä¸ªå
ç´ çææè¿ä»£å¨ï¼èç¹å¼å®¹å¨çerase()çè¿å弿¯voidï¼
it = arrayInt.erase(it);
}
else
{
it++;
}
}
å ³è容å¨(å ³èå¼å®¹å¨ï¼æ¯å¦mapãsetãmultimapãmultisetç) å é¤å ç´ çæ¹å¼ï¼eraseè¿ä»£å¨åªæ¯è¢«å é¤å ç´ çè¿ä»£å¨å¤±æï¼ä½æ¯è¿å弿¯voidï¼æä»¥è¦éç¨erase(it++)çæ¹å¼å é¤è¿ä»£å¨ï¼c.erase(it++)
std::map<int, struct> mapInfo;
...
std::map<int, struct>::iterator it = mapInfo.begin();
while (it != mapInfo.end())
{
if (...)
{
// å é¤èç¹çåï¼å¯¹è¿ä»£å¨è¿è¡åç§»çæä½ï¼å 为å
¶ä»å
ç´ ä¸ä¼å¤±æ
mapInfo.erase(it++);
}
else
{
it++;
}
}
# stlè¿ä»£å¨çå¤±ææ åµä½ ç¥éåªäºï¼
åºåå¼å®¹å¨ï¼vectorãdequeï¼ï¼è¿ä»£å¨å¤±æçæ
åµ
å½å¨ vector 䏿å
¥å
ç´ æ¶ï¼å¦ææå
¥æä½å¯¼è´å®¹å¨çå
åéæ°åé
ï¼å³æå
¥å容å¨ç容éä¸è¶³ï¼éè¦éæ°åé
æ´å¤§çå
å空é´ï¼ï¼é£ä¹æææå vector çè¿ä»£å¨ãæéåå¼ç¨é½ä¼å¤±æãå ä¸ºéæ°åé
å
ååï¼å
ç´ ä¼è¢«ç§»å¨å°æ°çå
åä½ç½®ï¼ä¾å代ç ï¼
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3};
auto it = vec.begin();
vec.push_back(4); // å¯è½å¯¼è´å
åéæ°åé
// æ¤æ¶ it å¯è½å·²ç»å¤±æ
// std::cout << *it << std::endl; // æªå®ä¹è¡ä¸º
return 0;
}
å½å¨ vector ä¸å é¤å
ç´ æ¶ï¼æå被å é¤å
ç´ çè¿ä»£å¨ãæéåå¼ç¨ä¼å¤±æï¼å¹¶ä¸æåå é¤ä½ç½®ä¹åçå
ç´ çè¿ä»£å¨ãæéåå¼ç¨ä¹ä¼å¤±æã代ç å¦ä¸ï¼
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3};
auto it = vec.begin() + 1;
vec.erase(vec.begin()); // å é¤ç¬¬ä¸ä¸ªå
ç´
// æ¤æ¶ it 失æ
// std::cout << *it << std::endl; // æªå®ä¹è¡ä¸º
return 0;
}
å¨ deque çä¸é´æå
¥å
ç´ æ¶ï¼ææè¿ä»£å¨ãæéåå¼ç¨é½ä¼å¤±æï¼è¿æå¨ deque ç头鍿尾鍿å
¥å
ç´ æ¶ï¼æåå
ç´ çè¿ä»£å¨ãæéåå¼ç¨ä¸ä¼å¤±æï¼ä½å¦ææå
¥æä½å¯¼è´å
åéæ°åé
ï¼é£ä¹è¿ä»£å¨å¯è½ä¼å¤±æã
#include <iostream>
#include <deque>
int main() {
std::deque<int> deq = {1, 2, 3};
auto it = deq.begin() + 1;
deq.insert(deq.begin() + 1, 4); // å¨ä¸é´æå
¥å
ç´
// æ¤æ¶ it 失æ
// std::cout << *it << std::endl; // æªå®ä¹è¡ä¸º
return 0;
}
å é¤ deque ä¸é´çå
ç´ æ¶ï¼ææè¿ä»£å¨ãæéåå¼ç¨é½ä¼å¤±æï¼è¿æå é¤ deque 头鍿尾é¨çå
ç´ æ¶ï¼æå被å é¤å
ç´ çè¿ä»£å¨ãæéåå¼ç¨ä¼å¤±æã
#include <iostream>
#include <deque>
int main() {
std::deque<int> deq = {1, 2, 3};
auto it = deq.begin() + 1;
deq.erase(deq.begin() + 1); // å é¤ä¸é´å
ç´
// æ¤æ¶ it 失æ
// std::cout << *it << std::endl; // æªå®ä¹è¡ä¸º
return 0;
}
å
³èå¼å®¹å¨ï¼setãmapï¼ï¼è¿ä»£å¨å¤±æçæ
åµ
set 卿å
¥å
ç´ ä¸ä¼ä½¿ä»»ä½è¿ä»£å¨ãæéåå¼ç¨å¤±æï¼å 为å
³èå¼å®¹å¨ä½¿ç¨çº¢é»æ ç平衡äºåæç´¢æ å®ç°ï¼æå
¥æä½åªæ¯å¨æ 䏿·»å æ°èç¹ï¼ä¸ä¼å½±åå
¶ä»èç¹çå
åä½ç½®ã
ä¸è¿æå被å é¤å ç´ çè¿ä»£å¨ãæéåå¼ç¨ä¼å¤±æï¼å ¶ä»è¿ä»£å¨ãæéåå¼ç¨ä¸ä¼å¤±æã
#include <iostream>
#include <set>
int main() {
std::set<int> s = {1, 2, 3};
auto it = s.begin();
auto it_to_delete = s.find(2);
s.erase(it_to_delete);
// æ¤æ¶ it_to_delete 失æ
// std::cout << *it_to_delete << std::endl; // æªå®ä¹è¡ä¸º
std::cout << *it << std::endl; // æ£å¸¸è¾åº
return 0;
}
map 卿å
¥å
ç´ ä¸ä¼ä½¿ä»»ä½è¿ä»£å¨ãæéåå¼ç¨å¤±æï¼åå ä¸ set ã使¯æå被å é¤å
ç´ çè¿ä»£å¨ãæéåå¼ç¨ä¼å¤±æï¼å
¶ä»è¿ä»£å¨ãæéåå¼ç¨ä¸ä¼å¤±æã
#include <iostream>
#include <map>
int main() {
std::map<int, int> m = {{1, 10}, {2, 20}, {3, 30}};
auto it = m.begin();
auto it_to_delete = m.find(2);
m.erase(it_to_delete);
// æ¤æ¶ it_to_delete 失æ
// std::cout << it_to_delete->second << std::endl; // æªå®ä¹è¡ä¸º
std::cout << it->second << std::endl; // æ£å¸¸è¾åº
return 0;
}
é¾è¡¨å¼å®¹å¨ï¼listï¼ï¼è¿ä»£å¨å¤±æ
å¨ list æå
¥å
ç´ ä¸ä¼ä½¿ä»»ä½è¿ä»£å¨ãæéåå¼ç¨å¤±æï¼å 为é¾è¡¨çæå
¥æä½åªæ¯ä¿®æ¹èç¹çæéï¼ä¸ä¼å½±åå
¶ä»èç¹çå
åä½ç½®ã使¯ï¼æå被å é¤å
ç´ çè¿ä»£å¨ãæéåå¼ç¨ä¼å¤±æï¼å
¶ä»è¿ä»£å¨ãæéåå¼ç¨ä¸ä¼å¤±æã
#include <iostream>
#include <list>
int main() {
std::list<int> lst = {1, 2, 3};
auto it = lst.begin();
auto it_to_delete = ++lst.begin();
lst.erase(it_to_delete);
// æ¤æ¶ it_to_delete 失æ
// std::cout << *it_to_delete << std::endl; // æªå®ä¹è¡ä¸º
std::cout << *it << std::endl; // æ£å¸¸è¾åº
return 0;
}
# STL 容å¨ä¸ä¼å 级éå priority_queue çåºå±åç
priority_queue ä¼å 级éå乿以æ»è½ä¿è¯ä¼å 级æé«çå ç´ ä½äºéå¤´ï¼æéè¦çåå æ¯å ¶åºå±éç¨å æ°æ®ç»æåå¨ç»æã
æè¯»è å¯è½ä¼é®ï¼priority_queue åºå±ä¸æ¯éç¨ vector æ deque 容å¨å卿°æ®åï¼è¿éå说使ç¨å ç»æå卿°æ®ï¼å®ä»¬ä¹é´ä¸å²çªåï¼æ¾ç¶ï¼å®ä»¬ä¹é´æ¯ä¸å²çªçã
priority_queue åºå±éç¨ vector æ deque 容å¨å卿°æ®åéç¨å æ°æ®ç»ææ¯ä¸å²çªçã
é¦å ï¼vector å deque æ¯ç¨æ¥åå¨å ç´ ç容å¨ï¼èå æ¯ä¸ç§æ°æ®ç»æï¼å ¶æ¬èº«æ æ³å卿°æ®ï¼åªè½ä¾éäºæä¸ªåå¨ä»è´¨ï¼è¾ å©å ¶ç»ç»æ°æ®åå¨çå 忬¡åºã
å ¶æ¬¡ï¼priority_queue åºå±éç¨ vector æè deque ä½ä¸ºåºç¡å®¹å¨ï¼è¿æ¯åº¸ç½®çãä½ç±äº vector æ deque 容å¨å¹¶æ²¡ææä¾å®ç° priority_queue 容å¨éé å¨ âFirst in,Largest outâ ç¹æ§çåè½ï¼å æ¤ STL éæ©ä½¿ç¨å æ¥éæ°ç»ç» vector æ deque 容å¨ä¸åå¨çæ°æ®ï¼ä»èå®ç°è¯¥ç¹æ§ã
ç®åççè§£å ï¼å®å¨æ¯å®å ¨äºåæ çåºç¡ä¸ï¼è¦æ±æ 䏿æçç¶èç¹ååèç¹ä¹é´ï¼é½è¦æ»¡è¶³æ¢å®çæåºè§åï¼
- 妿æåºè§å为ä»å¤§å°å°æåºï¼å表示å çå®å ¨äºåæ ä¸ï¼æ¯ä¸ªç¶èç¹çå¼é½è¦ä¸å°äºåèç¹çå¼ï¼è¿ç§å é常称为大顶å ï¼
- 妿æåºè§å为ä»å°å°å¤§æåºï¼å表示å çå®å ¨äºåæ ä¸ï¼æ¯ä¸ªç¶èç¹çå¼é½è¦ä¸å¤§äºåèç¹çå¼ï¼è¿ç§å é常称为å°é¡¶å ï¼
ä¸å¾å±ç¤ºäºä¸ä¸ªç± {10,20,15,30,40,25,35,50,45} è¿äºå ç´ ææç大顶å åå°é¡¶å ãå ¶ä¸ç»å¤§é¡¶å ç»ç»åçæ°æ®å 忬¡åºå为 {50,45,40,20,25,35,30,10,15}ï¼èç»å°é¡¶å ç»ç»åçæ°æ®æ¬¡åºä¸º{10,20,15,25,50,30,40,35,45}ã

å¯ä»¥çå°ï¼å¤§é¡¶å ä¸ï¼æ¯ä¸ªç¶èç¹çå¼é½ä¸å°äºåèç¹ï¼åæ ·å¨å°é¡¶å ä¸ï¼æ¯ä¸ªç¶èç¹çå¼é½ä¸å¤§äºåèç¹ãä½éè¦æ³¨æçæ¯ï¼æ 论æ¯å¤§é¡¶å è¿æ¯å°é¡¶å ï¼åä¸ç¶èç¹ä¸åèç¹çæ¬¡åºæ¯ä¸åè§å®çï¼è¿ä¹æ¯ç»å¤§é¡¶å æå°é¡¶å ç»ç»åçæ°æ®æ´ä½ä¾ç¶æ åºçåå ã
å¯ä»¥ç¡®å®çä¸ç¹æ¯ï¼æ 论æ¯éè¿å¤§é¡¶å æè å°é¡¶å ï¼æ»å¯ä»¥çéåºæå¤§ææå°çé£ä¸ªå ç´ ï¼ä¼å 级æå¤§ï¼ï¼å¹¶å°å ¶ç§»è³åºåçå¼å¤´ï¼æ¤åè½ä¹æ£æ¯ priority_queue 容å¨éé 卿éè¦çã
# ååéååºå±æ¯å¦ä½å®ç°çï¼
vectoråºå±éç¨çæ¯ä¸ä¸ªæ°ç»æ¥å®ç°ï¼liståºå±éç¨çæ¯ä¸ä¸ªç¯å½¢çååé¾è¡¨å®ç°ï¼èdequeåéç¨çæ¯ä¸¤è ç¸ç»åï¼æè°ç»åï¼å¹¶ä¸æ¯ä¸¤ç§æ°æ®ç»æçç»åï¼èæ¯æäºæ§è½ä¸çç»åãæä»¬ç¥éï¼ vectoræ¯æéæºè®¿é®ï¼èlistæ¯æå¸¸éæ¶é´çå é¤ï¼dequeæ¯æçæ¯éæºè®¿é®ä»¥åé¦å°¾å ç´ çæå ¥å é¤ ã
dequeä¸vectorçæå¤§å·®å¼ï¼ä¸æ¯dequeå è®¸å¸¸æ°æ¶é´å 对起头端è¿è¡å ç´ çæå ¥åå é¤ï¼äºæ¯deque没ææè°çå®¹éæ¦å¿µï¼å ä¸ºå®æ¯ä»¥å段è¿ç»ç©ºé´ç»åèæï¼éæ¶å¯ä»¥å¢å 䏿®µæ°ç空é´å¹¶è¿æ¥èµ·æ¥ãæ¢å¥è¯è¯´ï¼åvector飿 ·å æ§ç©ºé´ä¸è¶³èéæ°é ç½®æ´å¤§ç©ºé´ï¼å¤å¶å ç´ ï¼éæ¾å空é´çäºæ ï¼dequeæ¯ä¸ä¼åºç°çãä¹å æ¤ï¼dequeä¸éè¦æä¾æè°ç空é´ä¿çã

å端éådequeæ¯ä¸ç§ååå¼å£çåå¨ç©ºé´å段è¿ç»çæ°æ®ç»æï¼æ¯æ®µæ°æ®ç©ºé´å 鍿¯è¿ç»çï¼èæ¯æ®µæ°æ®ç©ºé´ä¹é´åä¸ä¸å®è¿ç»ï¼å¦ä¸å¾æç¤ºï¼

ä¸å¾çdequeæåæ®µæ°æ®ç©ºé´ï¼è¿äºç©ºé´é½æ¯ç¨åºè¿è¡è¿ç¨ä¸å¨å ä¸å¨æåé çã䏿§å¨ï¼æå«mapï¼ä¿åçä¸ç»æéï¼æ¯ä¸ªæéæå䏿®µæ°æ®ç©ºé´çèµ·å§ä½ç½®ï¼éè¿ä¸æ§å¨å¯ä»¥æ¾å°ææçæ°æ®ç©ºé´ã妿䏿§å¨çæ°æ®ç©ºé´æ»¡äºï¼ä¼éæ°ç³è¯·ä¸åæ´å¤§ç空é´ï¼å¹¶å°ä¸æ§å¨çæææéæ·è´å°æ°ç©ºé´ä¸ã

å¦ä¸å¾æç¤ºï¼dequeæ¯ç±ä¸æ®µä¸æ®µçå®éè¿ç»ç©ºé´æé ã䏿¦æå¿ è¦å¨dequeçå端æå°¾ç«¯å¢å æ°ç©ºé´ï¼ä¾¿é ç½®ä¸æ®µè¿ç»ç©ºé´ï¼ä¸²æ¥å¨æ´ä¸ªdequeç头鍿尾é¨ã
dequeéç¨ä¸åæè°çmapï¼ä¸æ¯STLçmap容å¨ï¼ä½ä¸ºä¸»æ§ï¼è¿éçmap乿¯ä¸åè¿ç»ç©ºé´ï¼å ¶ä¸æ¯ä¸ªå ç´ ä¸ºä¸ä¸ªèç¹ï¼ä¹æ¯dequeçè¿ä»£å¨ï¼ï¼æåå¦ä¸æ®µè¾å¤§çè¿ç»çº¿æ§ç©ºé´ï¼ç§°ä¸ºç¼å²åºï¼ç¼å²åºææ¯dequeçå¨å空é´ä¸»ä½ã

# Std::sortçåºå±æ¯æä¹å®ç°çï¼
std::sortä¸»è¦æ¯ä¸ç§ç®æ³çç»åä½ï¼æå ¥æåºï¼å¿«éæåºï¼å æåºã
| ç®æ³ | æ¶é´å¤æåº¦ | ä¼ç¹ | ç¼ºç¹ |
|---|---|---|---|
| æå ¥æåº | O(N*N) | 彿°æ®éå¾å°æ¶ï¼æçæ¯è¾é«ã | 彿°æ®éæ¯è¾å¤§æ¶ï¼æ¶é´å¤æåº¦æ¯è¾é«ã |
| å¿«éæåº | å¹³å O(NlogxN)ï¼æå O(NxN) | 大é¨åæ¶åæ§è½æ¯è¾å¥½ã | ç®æ³æ¶é´å¤æåº¦ä¸ç¨³å®ï¼æ°æ®é大æ¶é彿·±åº¦å¾å¤§ï¼å½±åç¨åºå·¥ä½æçã |
| å æåº | O(N*logN) | ç®æ³æ¶é´å¤æåº¦ç¨³å®ï¼æ¯è¾å°ï¼éåæ°æ®éæ¯è¾å¤§çæåºã | å æåºå¨å»ºå åè°æ´å çè¿ç¨ä¸ä¼äº§çæ¯è¾å¤§çå¼éï¼æ°æ®éå°çæ¶åä¸éç¨ã |
std::sort æ ¹æ®ä¸ææå°çå ç§ç®æ³çä¼ç¼ºç¹ï¼å¯¹æåºç®æ³è¿è¡æ´åã
- å¿«éæåºï¼é彿åºå°ä¸å®æ·±åº¦åï¼æ°æ®å·²ç»è¢«å为å¤ä¸ªååºåï¼ååºåéé¢çæ°æ®å¯è½æ¯æ åºçï¼ä½æ¯ååºåä¹é´å·²ç»æ¯æåºäºã
- å¨è¿å¤ä¸ªååºåéï¼å¦ææä¸ªååºåæ°æ®ä¸ªæ°å¤§äºéå¼ï¼16ï¼ï¼éç¨å æåºï¼ä½¿å¾æä¸ªååºåå 鍿åºã
- å©ä¸ç没æè¢«å æåºçå°åºåï¼æ°æ®é齿¯å°äºéå¼çï¼æåæ´ä¸ªæ°æ®åºåéç¨æå ¥æåºã

- std::sort éç¨çæ¯åæ²»æç»´ï¼å éç¨å¿«éæåºï¼å°æ´ä¸ªåºååæå¤ä¸ªååºåï¼æ¯ä¸ªååºåå 鍿 ¹æ®æ°æ®ééç¨ä¸åç®æ³ã
- åæ²»åï¼å个ååºåå±é¨æåºååéè¿æ´ä¸ªåºåè¿è¡æåºã
# C++æºè½æé
# ä»ç»ä¸ä¸æºè½æéï¼
å¨C++ä¸ï¼æä¸ç§å¸¸ç¨çæºè½æéï¼std::unique_ptrãstd::shared_ptråstd::weak_ptrã
- std::unique_ptrï¼std::unique_ptræ¯ä¸ç§ç¬å æææçæºè½æéãå®éè¿ä½¿ç¨ç¬å æææçæ¹å¼æ¥ç®¡çèµæºï¼åªè½æä¸ä¸ªstd::unique_ptræååä¸ä¸ªå¯¹è±¡ææ°ç»ãå½std::unique_ptrè¶ åºä½ç¨åæè¢«æ¾å¼éæ¾æ¶ï¼å®ä¼èªå¨å é¤æç®¡ççå¯¹è±¡ææ°ç»ãå®é常ç¨äºè¡¨ç¤ºç¬å çèµæºæææï¼å¦å¨æåé çåä¸ªå¯¹è±¡ææ°ç»ã
- std::shared_ptrï¼std::shared_ptræ¯ä¸ç§å ±äº«æææçæºè½æéãå®å¯ä»¥æå¤ä¸ªstd::shared_ptræååä¸ä¸ªå¯¹è±¡ï¼éè¿å¼ç¨è®¡æ°æ¥ç®¡çèµæºççå½å¨æãåªæå½æåä¸ä¸ªstd::shared_ptrè¶ åºä½ç¨åæè¢«æ¾å¼éæ¾æ¶ï¼èµæºæä¼è¢«å é¤ãstd::shared_ptrå 许å¤ä¸ªæéå ±äº«å¯¹åä¸èµæºç访é®ï¼é常ç¨äºè¡¨ç¤ºå ±äº«çèµæºæææã
- std::weak_ptrï¼std::weak_ptræ¯ä¸ç§å¼±å¼ç¨çæºè½æéãå®å¯ä»¥æåç±std::shared_ptr管çç对象ï¼ä½ä¸ä¼å¢å å¼ç¨è®¡æ°ãstd::weak_ptr主è¦ç¨äºè§£å³std::shared_ptrç循ç¯å¼ç¨é®é¢ï¼éè¿std::weak_ptr.lock()æ¹æ³å¯ä»¥è·åä¸ä¸ªææçstd::shared_ptræ¥è®¿é®è¢«ç®¡çç对象ã
# å¨åªäºåºæ¯ä¸ä¼åºç¨æºè½æéï¼
æèªå·±æ¯å¨å¨å¨æå å管çä¸ï¼ä½¿ç¨æºè½æéå¯ä»¥é¿å æå¨ç®¡çå åç麻ç¦ååºéé£é©ã
# shared_ptrçä½ç¨æ¯ä»ä¹ï¼
å¨ä¼ ç»ç C++ ç¼ç¨ä¸ï¼ä½¿ç¨ new æä½ç¬¦åé
çå
åéè¦æå¨ä½¿ç¨ delete æä½ç¬¦éæ¾ï¼è¥å¿è®°éæ¾æè
å¨å¼å¸¸æ
åµä¸æ æ³æ§è¡ delete æä½ï¼å°±ä¼é æå
åæ³æ¼ã
std::shared_ptr å¯ä»¥èªå¨å¤çå
åçéæ¾ï¼å½ä¸åæ std::shared_ptr æå该对象æ¶ï¼å¯¹è±¡çå
åä¼è¢«èªå¨éæ¾ã
std::shared_ptr æ¯æå¤ä¸ª std::shared_ptr å®ä¾å
±äº«åä¸ä¸ªå¯¹è±¡çæææãå®éè¿å¼ç¨è®¡æ°æºå¶æ¥å®ç°è¿ä¸ç¹ï¼æ¯ä¸ª std::shared_ptr é½ä¼ç»´æ¤ä¸ä¸ªå¼ç¨è®¡æ°ï¼è®°å½æå¤å°ä¸ª std::shared_ptr å
±äº«åä¸ä¸ªå¯¹è±¡ãå½å¼ç¨è®¡æ°å为 0 æ¶ï¼å¯¹è±¡çå
åä¼è¢«éæ¾ã
#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() { std::cout << "MyClass constructor" << std::endl; }
~MyClass() { std::cout << "MyClass destructor" << std::endl; }
};
int main() {
std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();
std::shared_ptr<MyClass> ptr2 = ptr1; // å
±äº«æææ
std::cout << "Use count: " << ptr1.use_count() << std::endl; // è¾åº 2
ptr2.reset(); // éæ¾ ptr2 çæææ
std::cout << "Use count: " << ptr1.use_count() << std::endl; // è¾åº 1
// å½ ptr1 离å¼ä½ç¨åæ¶ï¼MyClass 对象çå
åä¼è¢«éæ¾
return 0;
}
å¨è¿ä¸ªä¾åä¸ï¼ptr1 å ptr2 å
±äº«åä¸ä¸ª MyClass å¯¹è±¡çæææï¼å¼ç¨è®¡æ°å为 2ãå½è°ç¨ ptr2.reset() æ¶ï¼ptr2 éæ¾äºå¯¹å¯¹è±¡çæææï¼å¼ç¨è®¡æ°å为 1ãå½ ptr1 离å¼ä½ç¨åæ¶ï¼å¼ç¨è®¡æ°å为 0ï¼å¯¹è±¡çå
åè¢«éæ¾ã
# weak_ptrçä½ç¨æ¯ä»ä¹ï¼å¦ä½åshared_ptrç»å使ç¨ï¼
std::weak_ptr 主è¦ç¨äºè¾
å© std::shared_ptr è¿è¡å
å管çï¼è§£å³ std::shared_ptr å¯è½åå¨ç循ç¯å¼ç¨é®é¢ï¼åæ¶è¿å¯ä»¥ç¨äºè§å¯ std::shared_ptr æç®¡ç对象ççå½å¨æã
å½ä¸¤ä¸ªæå¤ä¸ª std::shared_ptr ç¸äºå¼ç¨å½¢æå¾ªç¯æ¶ï¼ä¼å¯¼è´å¼ç¨è®¡æ°æ°¸è¿ä¸ä¼é为 0ï¼ä»èé æå
åæ³æ¼ãstd::weak_ptr ä¸ä¼å¢å ææå对象çå¼ç¨è®¡æ°ï¼å æ¤å¯ä»¥æç ´è¿ç§å¾ªç¯å¼ç¨ã
#include <iostream>
#include <memory>
class B;
class A {
public:
std::shared_ptr<B> b_ptr;
~A() { std::cout << "A destructor" << std::endl; }
};
class B {
public:
std::weak_ptr<A> a_ptr; // ä½¿ç¨ std::weak_ptr æç ´å¾ªç¯å¼ç¨
~B() { std::cout << "B destructor" << std::endl; }
};
int main() {
std::shared_ptr<A> a = std::make_shared<A>();
std::shared_ptr<B> b = std::make_shared<B>();
a->b_ptr = b;
b->a_ptr = a;
return 0;
}
å¨ä¸è¿°ä»£ç ä¸ï¼å¦æ B ç±»ä¸ç a_ptr ä¹ä½¿ç¨ std::shared_ptrï¼å°±ä¼å½¢æå¾ªç¯å¼ç¨ï¼å¯¼è´ A å B 对象çå
åæ æ³éæ¾ãä½¿ç¨ std::weak_ptr åï¼b->a_ptr ä¸ä¼å¢å A 对象çå¼ç¨è®¡æ°ï¼å½ main 彿°ç»ææ¶ï¼a å b çå¼ç¨è®¡æ°é为 0ï¼A å B 对象çå
åä¼è¢«æ£ç¡®éæ¾ã
å¦å¤ï¼std::weak_ptr å¯ä»¥ç¨äºè§å¯ std::shared_ptr æç®¡ç对象ççå½å¨æãéè¿ std::weak_ptr ç expired() æ¹æ³å¯ä»¥æ£æ¥ææåç对象æ¯å¦å·²ç»è¢«éæ¾ã
#include <iostream>
#include <memory>
int main() {
std::shared_ptr<int> shared = std::make_shared<int>(42);
std::weak_ptr<int> weak = shared;
if (!weak.expired()) {
std::cout << "Object is still alive." << std::endl;
}
shared.reset();
if (weak.expired()) {
std::cout << "Object has been destroyed." << std::endl;
}
return 0;
}
å¨è¿ä¸ªä¾åä¸ï¼weak è§å¯ shared æç®¡çç对象ãå½ shared éæ¾å¯¹è±¡åï¼weak.expired() è¿å trueï¼è¡¨ç¤ºå¯¹è±¡å·²ç»è¢«éæ¯ã
# æºè½æéä¼é æå åæ³æ¼åï¼
ä¼çï¼æ¯å¦å¾ªç¯å¼ç¨åºæ¯ï¼å¨å¤ä¸ªshared_ptrå½¢æå¾ªç¯å¼ç¨ï¼èµæºå°æ æ³éæ¾ã
std::shared_ptrï¼å¤ä¸ªshared_ptr对象å¯ä»¥å ±äº«åä¸ä¸ªèµæºçæææï¼å®ä»¬ä¼ç»´æ¤ä¸ä¸ªå¼ç¨è®¡æ°ãåªæå½å¼ç¨è®¡æ°ä¸ºé¶æ¶ï¼æä¼éæ¾èµæºãè¿ç§æºè½æéçå åç®¡çæ¯èªå¨çï¼å æ¤å¯ä»¥å¸®å©æä»¬é¿å æ¾å¼å°éæ¾å åæåºç°å åæ³æ¼çæ åµã
ä¾å¦ï¼
std::shared_ptr<int> sharedPtr1 = std::make_shared<int>(10);
std::shared_ptr<int> sharedPtr2 = sharedPtr1;
sharedPtr1.reset(); // ä¸ä¼å¯¼è´å
åæ³æ¼ï¼èµæºä»ç±sharedPtr2管ç
sharedPtr2.reset(); // èµæºè¢«éæ¾
å¨ä½¿ç¨std::shared_ptræ¶ï¼éè¦æ³¨æå¾ªç¯å¼ç¨çæ åµãå¦æä¸¤ä¸ªæå¤ä¸ªshared_ptr对象ç¸äºå¼ç¨ï¼å½¢æå¾ªç¯ä¾èµï¼å®ä»¬çå¼ç¨è®¡æ°æ°¸è¿ä¸ä¼è¾¾å°é¶ï¼èµæºå°æ æ³éæ¾ï¼ä»è导è´å åæ³æ¼ã
é对è¿ä¸ªé®é¢ï¼å¯ä»¥ä½¿ç¨ weak_ptr å¼±å¼ç¨æ¥è§£å³è¿ä¸ªé®é¢ãweak_ptræ¯ç¨æ¥çè§shared_ptrççå½å¨æï¼å®ä¸ç®¡çshared_ptrå é¨çæéï¼å®çæ·è´çææé½ä¸ä¼å½±åå¼ç¨è®¡æ°ï¼çº¯ç²¹æ¯ä½ä¸ºä¸ä¸ªæè§è çè§shared_pträ¸ç®¡ççèµæºæ¯å¦åå¨ï¼å¯ä»¥ç¨æ¥è¿åthisæéåè§£å³å¾ªç¯å¼ç¨é®é¢ã
# ä¸ä¸ª unique_ptr æä¹èµå¼ç»å¦ä¸ä¸ª unique_ptr 对象ï¼
åå© std::move() å¯ä»¥å®ç°å°ä¸ä¸ª unique_ptr 对象èµå¼ç»å¦ä¸ä¸ª unique_ptr 对象ï¼å ¶ç®çæ¯å®ç°æææç转移ã ä¹å¯ä»¥è®©å½åunique_ptrè°ç¨release鿾坹ptræ§å¶æï¼ç¶åå¨å¦ä¸ä¸ªunique_ptrè·åæ§å¶æã
// A ä½ä¸ºä¸ä¸ªç±»
std::unique_ptr<A> ptr1(new A());
std::unique_ptr<A> ptr2 = std::move(ptr1);
std::unique_ptr<A> ptr3(ptr2.release());
# ä½¿ç¨æºè½æéä¼åºç°ä»ä¹é®é¢ï¼æä¹è§£å³ï¼
æºè½æéå¯è½åºç°çé®é¢ï¼å¾ªç¯å¼ç¨
å¨å¦ä¸ä¾åä¸å®ä¹äºä¸¤ä¸ªç±» ParentãChildï¼å¨ä¸¤ä¸ªç±»ä¸åå«å®ä¹å¦ä¸ä¸ªç±»ç对象çå ±äº«æéï¼ç±äºå¨ç¨åºç»æåï¼ä¸¤ä¸ªæéç¸äºæå对æ¹çå å空é´ï¼å¯¼è´å åæ æ³éæ¾ã
#include <iostream>
#include <memory>
using namespace std;
class Child;
class Parent;
class Parent {
private:
shared_ptr<Child> ChildPtr;
public:
void setChild(shared_ptr<Child> child) {
this->ChildPtr = child;
}
void doSomething() {
if (this->ChildPtr.use_count()) {
}
}
~Parent() {
}
};
class Child {
private:
shared_ptr<Parent> ParentPtr;
public:
void setPartent(shared_ptr<Parent> parent) {
this->ParentPtr = parent;
}
void doSomething() {
if (this->ParentPtr.use_count()) {
}
}
~Child() {
}
};
int main() {
weak_ptr<Parent> wpp;
weak_ptr<Child> wpc;
{
shared_ptr<Parent> p(new Parent);
shared_ptr<Child> c(new Child);
p->setChild(c);
c->setPartent(p);
wpp = p;
wpc = c;
cout << p.use_count() << endl; // 2
cout << c.use_count() << endl; // 2
}
cout << wpp.use_count() << endl; // 1
cout << wpc.use_count() << endl; // 1
return 0;
}
循ç¯å¼ç¨çè§£å³æ¹æ³ï¼ weak_ptr
循ç¯å¼ç¨ï¼è¯¥è¢«è°ç¨çææå½æ°æ²¡æè¢«è°ç¨ï¼ä»èåºç°äºå åæ³æ¼ã
- weak_ptr 对被 shared_ptr 管çç对象åå¨éæ¥ææ§ï¼å¼±ï¼å¼ç¨ï¼å¨è®¿é®æå¼ç¨ç对象åå¿ é¡»å 转å为 shared_ptrï¼
- weak_ptr ç¨æ¥ææ shared_ptr æç®¡ç对象ç循ç¯å¼ç¨é®é¢ï¼è¥è¿ç§ç¯è¢«å¤ç«ï¼æ²¡ææåç¯ä¸çå¤é¨å ±äº«æéï¼ï¼shared_ptr å¼ç¨è®¡æ°æ æ³æµè¾¾ 0ï¼å å被æ³é²ï¼ä»¤ç¯ä¸çæéä¹ä¸ä¸ºå¼±æéå¯ä»¥é¿å 该æ åµï¼
- weak_ptr ç¨æ¥è¡¨è¾¾ä¸´æ¶æææçæ¦å¿µï¼å½æä¸ªå¯¹è±¡åªæå卿¶æéè¦è¢«è®¿é®ï¼èä¸éæ¶å¯è½è¢«ä»äººå é¤ï¼å¯ä»¥ç¨ weak_ptr è·è¸ªè¯¥å¯¹è±¡ï¼éè¦è·å¾ææææ¶å°å ¶è½¬å为 shared_ptrï¼æ¤æ¶å¦æåæ¥ç shared_ptr è¢«éæ¯ï¼å该对象ççå½æè¢«å»¶é¿è³è¿ä¸ªä¸´æ¶ç shared_ptr åæ ·è¢«éæ¯ã
#include <iostream>
#include <memory>
using namespace std;
class Child;
class Parent;
class Parent {
private:
//shared_ptr<Child> ChildPtr;
weak_ptr<Child> ChildPtr;
public:
void setChild(shared_ptr<Child> child) {
this->ChildPtr = child;
}
void doSomething() {
//new shared_ptr
if (this->ChildPtr.lock()) {
}
}
~Parent() {
}
};
class Child {
private:
shared_ptr<Parent> ParentPtr;
public:
void setPartent(shared_ptr<Parent> parent) {
this->ParentPtr = parent;
}
void doSomething() {
if (this->ParentPtr.use_count()) {
}
}
~Child() {
}
};
int main() {
weak_ptr<Parent> wpp;
weak_ptr<Child> wpc;
{
shared_ptr<Parent> p(new Parent);
shared_ptr<Child> c(new Child);
p->setChild(c);
c->setPartent(p);
wpp = p;
wpc = c;
cout << p.use_count() << endl; // 2
cout << c.use_count() << endl; // 1
}
cout << wpp.use_count() << endl; // 0
cout << wpc.use_count() << endl; // 0
return 0;
}
# C++å å管ç
# èæå åä»ç»ä¸ä¸
- 第ä¸ï¼èæå åå¯ä»¥ä½¿å¾è¿ç¨å¯¹è¿è¡å åè¶ è¿ç©çå å大å°ï¼å 为ç¨åºè¿è¡ç¬¦åå±é¨æ§åçï¼CPU 访é®å å伿徿æ¾çéå¤è®¿é®çå¾åæ§ï¼å¯¹äºé£äºæ²¡æè¢«ç»å¸¸ä½¿ç¨å°çå åï¼æä»¬å¯ä»¥æå®æ¢åºå°ç©çå åä¹å¤ï¼æ¯å¦ç¡¬çä¸ç swap åºåã
- 第äºï¼ç±äºæ¯ä¸ªè¿ç¨é½æèªå·±çé¡µè¡¨ï¼æä»¥æ¯ä¸ªè¿ç¨çèæå å空é´å°±æ¯ç¸äºç¬ç«çãè¿ç¨ä¹æ²¡æåæ³è®¿é®å ¶ä»è¿ç¨çé¡µè¡¨ï¼æä»¥è¿äºé¡µè¡¨æ¯ç§æçï¼è¿å°±è§£å³äºå¤è¿ç¨ä¹é´å°åå²çªçé®é¢ã
- 第ä¸ï¼é¡µè¡¨éç页表项ä¸é¤äºç©çå°åä¹å¤ï¼è¿æä¸äºæ è®°å±æ§çæ¯ç¹ï¼æ¯å¦æ§å¶ä¸ä¸ªé¡µç读åæéï¼æ 记该页æ¯å¦åå¨çãå¨å åè®¿é®æ¹é¢ï¼æä½ç³»ç»æä¾äºæ´å¥½çå®å ¨æ§ã
# èæå åç¨æ·æçå°åç©ºé´æä¹åé ç
ç¨æ·æå°åç©ºé´æ¯ä¸åè¿ç»çèæå°åèå´ï¼æ¯å¦ 32 ä½ç³»ç»éå¸¸æ¯ 0~3GBï¼64 ä½ç³»ç»èå´æ´å¤§ï¼ï¼æ âä»ä½å°é«â åæå åï¼æ¯åæä¸é¨ç¨éï¼äºä¸å¹²æ°ã

- ä»£ç æ®µï¼å æ¬äºè¿å¶å¯æ§è¡ä»£ç ;
- æ°æ®æ®µï¼å æ¬å·²åå§åçéæå¸¸éåå ¨å±åé;
- BSS 段ï¼å æ¬æªåå§åçéæåéåå ¨å±åé;
- å æ®µï¼å æ¬å¨æåé çå åï¼ä»ä½å°åå¼å§åä¸å¢é¿;
- æä»¶æ å°æ®µï¼å æ¬å¨æåºãå ±äº«å åç
- æ æ®µï¼å
æ¬å±é¨åéå彿°è°ç¨çä¸ä¸æçï¼æ¯å¦å½æ°éå®ä¹ç
int x = 5ï¼å°±å¨æ éãæ ç大尿¯åºå®çï¼ä¸è¬æ¯ 8MB ãå½ç¶ç³»ç»ä¹æä¾äºåæ°ï¼ä»¥ä¾¿æä»¬èªå®ä¹å¤§å°;
# C++ä¸çå åååºæåªäºï¼
å¨C++ä¸ï¼å å主è¦å为以ä¸äºä¸ªåºåï¼

- æ åºï¼Stackï¼ï¼ç±ç¼è¯å¨èªå¨åé éæ¾ï¼åæ¾å½æ°çåæ°å¼ï¼å±é¨åéçãå ¶æä½æ¹å¼ç±»ä¼¼äºæ°æ®ç»æä¸çæ ã
- å åºï¼Heapï¼ï¼ä¸è¬ç±ç¨åºååé éæ¾ï¼è¥ç¨åºåä¸éæ¾ï¼ç¨åºç»ææ¶å¯è½ç±OSåæ¶ãæ³¨æï¼ä¸æ°æ®ç»æä¸çå æ¯ä¸¤åäºï¼åé æ¹å¼åæ¯ç±»ä¼¼äºé¾è¡¨ã
- å ¨å±åºï¼éæåºï¼ï¼Staticï¼ï¼å ¨å±åéåéæåé被åé å°åä¸åå åä¸ãå¨C++ä¸ï¼å ¨å±åºè¿å å«äºå¸¸éåºï¼å符串常éåå ¶ä»å¸¸é乿¯åå¨å¨æ¤ã
- 常éåºï¼æ¯å ¨å±åºçä¸é¨åï¼åæ¾å¸¸éï¼ä¸å 许修æ¹ã
- 代ç åºï¼Textï¼ï¼åæ¾å½æ°ä½çäºè¿å¶ä»£ç ã
# ä»ç»ä¸ä¸å å对é½
å å对é½å°±æ¯å°±æ¯å°æ°æ®åæ¾å¨å åçæä¸ªä½ç½®ï¼ä½¿å¾CPUå¯ä»¥æ´å¿«å°è®¿é®å°è¿ä¸ªæ°æ®ï¼ä»¥ç©ºé´æ¢æ¶é´çæ¹å¼æ¥æé« cpu è®¿é®æ°æ®çæ§è½ã
å¨C++ä¸ï¼å å对é½ä¸»è¦æ¶åå°ä¸¤ä¸ªæ¦å¿µï¼å¯¹é½è¾¹çåå¡«å åèã
- 对é½è¾¹çï¼ä¸è¬æ åµä¸ï¼ç¼è¯å¨ä¼èªå¨å°å°æ°æ®åæ¾å¨å®çèªç¶è¾¹çä¸ãä¾å¦ï¼intç±»åçæ°æ®ï¼å®ç大å°ä¸º4åèï¼ç¼è¯å¨ä¼å°å ¶åæ¾å¨4çåæ°çå°åä¸ãè¿å°±æ¯æè°ç对é½è¾¹çã
- å¡«å åèï¼ä¸ºäºæ»¡è¶³å¯¹é½è¾¹ççè¦æ±ï¼ç¼è¯å¨ææ¶åéè¦å¨æ°æ®ä¹é´å¡«å ä¸äºåèãè¿äºåèæ²¡æå®é çæä¹ï¼åªæ¯ä¸ºäºæ»¡è¶³å å对é½çè¦æ±ã
# 为ä»ä¹è¦åè对é½ï¼
- å¹³å°åå (ç§»æ¤åå )ï¼ä¸æ¯ææç硬件平å°é½è½è®¿é®ä»»æå°åä¸çä»»ææ°æ®çï¼æäºç¡¬ä»¶å¹³å°åªè½å¨æäºå°åå¤åæäºç¹å®ç±»åçæ°æ®ï¼å¦åæåºç¡¬ä»¶å¼å¸¸ã
- æ§è½åå ï¼æ°æ®ç»æ(å°¤å ¶æ¯æ )åºè¯¥å°½å¯è½å°å¨èªç¶è¾¹çä¸å¯¹é½ãåå å¨äºï¼ä¸ºäºè®¿é®æªå¯¹é½çå åï¼å¤çå¨éè¦ä½ä¸¤æ¬¡å å访é®ï¼è对é½çå å访é®ä» éè¦ä¸æ¬¡è®¿é®ã
# 卿龿¥åºæä¹è£ è½½å°å åçï¼
éè¿ç¨mmapæè¯¥åºç´æ¥æ å°å°å个è¿ç¨çå°å空é´ä¸ï¼å°½ç®¡æ¯ä¸ªè¿ç¨é½è®¤ä¸ºèªå·±å°å空é´ä¸å è½½äºè¯¥åºï¼ä½å®é ä¸è¯¥åºå¨å åä¸åªæä¸ä»½ï¼mmapå°±è¿æ ·å¾ç¥å¥å卿龿¥åºèå¨èµ·æ¥äºã

# 彿°è°ç¨çæ¶ååæ æä¹æ ·ç
彿°è°ç¨æ¶ï¼ä¼è¿è¡ä»¥ä¸åæ æä½ï¼
- ä¿åè¿åå°åï¼å¨å½æ°è°ç¨åï¼è°ç¨æä»¤ä¼å°ä¸ä¸æ¡æä»¤çå°åï¼å³å½æ°è°ç¨åéè¦ç»§ç»æ§è¡çå°åï¼åå ¥æ ä¸ï¼ä»¥ä¾¿å½æ°æ§è¡å®æ¯åè½å¤æ£ç¡®è¿åå°è°ç¨ç¹ã
- ä¿åè°ç¨è çæ å¸§æéï¼å¨å½æ°è°ç¨åï¼è°ç¨æä»¤ä¼å°å½åæ 帧æéï¼å³è°ç¨è çæ æéï¼åå ¥æ ä¸ï¼ä»¥ä¾¿å½æ°æ§è¡å®æ¯åè½å¤æ¢å¤å°è°ç¨è çæ§è¡ç¶æã
- ä¼ éåæ°ï¼å½æ°è°ç¨æ¶ï¼ä¼å°åæ°å¼ä¾æ¬¡åå ¥æ ä¸ï¼è¿äºåæ°å¼å¨å½æ°å é¨å¯ä»¥éè¿æ æ¥è®¿é®ã
- åé å±é¨åé空é´ï¼å½æ°è°ç¨æ¶ï¼ä¼ä¸ºå±é¨åéåé 空é´ï¼è¿äºå±é¨åéä¼è¢«ä¿å卿 ä¸ãæ æéä¼ç¸åºå°ç§»å¨ä»¥éåºæ°çå±é¨åé空é´ã
# C++ä¸å åæ çåºå«
ç³è¯·æ¹å¼ï¼
- æ ï¼ç±ç³»ç»èªå¨åé
ãä¾å¦ï¼å£°æå¨å½æ°ä¸ä¸ä¸ªå±é¨åé
int bï¼ç³»ç»èªå¨å¨æ ä¸ä¸ºbå¼è¾ç©ºé´ã - å ï¼éè¦ç¨åºåèªå·±ç³è¯·ï¼å¹¶ææå¤§å°ï¼å¨Cè¯è¨ä¸éè¿malloc彿°ï¼å¦
p1 = (char *)malloc(10);ï¼å¨C++ä¸ç¨newè¿ç®ç¬¦ï¼å¦p2 = new char[20]
ç³è¯·åç³»ç»çååºï¼
- æ ï¼åªè¦æ çå©ä½ç©ºé´å¤§äºæç³è¯·ç©ºé´ï¼ç³»ç»å°ä¸ºç¨åºæä¾å åï¼å¦åå°æ¥å¼å¸¸æç¤ºæ 溢åºã
- å ï¼é¦å åºè¯¥ç¥éæä½ç³»ç»æä¸ä¸ªè®°å½ç©ºé²å åå°åçé¾è¡¨ï¼å½ç³»ç»æ¶å°ç¨åºçç³è¯·æ¶ï¼ä¼éå该é¾è¡¨ï¼å¯»æ¾ç¬¬ä¸ä¸ªç©ºé´å¤§äºæç³è¯·ç©ºé´çå ç»ç¹ï¼ç¶åå°è¯¥ç»ç¹ä»ç©ºé²ç»ç¹é¾è¡¨ä¸å é¤ï¼å¹¶å°è¯¥ç»ç¹ç空é´åé ç»ç¨åºï¼å¦å¤ï¼å¯¹äºå¤§å¤æ°ç³»ç»ï¼ä¼å¨è¿åå å空é´ä¸çé¦å°åå¤è®°å½æ¬æ¬¡åé ç大å°ï¼è¿æ ·ï¼ä»£ç ä¸çdeleteè¯å¥æè½æ£ç¡®çéæ¾æ¬å å空é´ãå¦å¤ï¼ç±äºæ¾å°çå ç»ç¹ç大å°ä¸ä¸å®æ£å¥½çäºç³è¯·ç大å°ï¼ç³»ç»ä¼èªå¨çå°å¤ä½çé£é¨åéæ°æ¾å ¥ç©ºé²é¾è¡¨ä¸ã
ç³è¯·å¤§å°çéå¶ï¼
- æ ï¼æ æ¯åä½å°åæ©å±çæ°æ®ç»æï¼æ¯ä¸åè¿ç»çå åçåºåãè¿å¥è¯çæææ¯æ é¡¶çå°ååæ çæå¤§å®¹éæ¯ç³»ç»é¢å è§å®å¥½çï¼æä½ç³»ç»ä¸ï¼æ ç大尿¯å MBï¼å¦æç³è¯·ç空é´è¶ è¿æ çå©ä½ç©ºé´æ¶ï¼å°æç¤ºoverflowãå æ¤ï¼è½ä»æ è·å¾ç空é´è¾å°ã
- å ï¼å æ¯åé«å°åæ©å±çæ°æ®ç»æï¼æ¯ä¸è¿ç»çå ååºåãè¿æ¯ç±äºç³»ç»æ¯ç¨é¾è¡¨æ¥åå¨ç空é²å åå°åçï¼èªç¶æ¯ä¸è¿ç»çï¼èé¾è¡¨çé忹忝ç±ä½å°ååé«å°åãå ç大å°åéäºè®¡ç®æºç³»ç»ä¸ææçèæå åãç±æ¤å¯è§ï¼å è·å¾çç©ºé´æ¯è¾çµæ´»ï¼ä¹æ¯è¾å¤§ã
çå½å¨æï¼
- æ ï¼æ çå åç®¡çæ¯èªå¨çï¼åéçå åä¼å¨å ¶ä½ç¨åç»ææ¶èªå¨éæ¾
- å ï¼å çå å管çéè¦æå¨è¿è¡ï¼éè¦ä½¿ç¨newå ³é®ååé å åï¼å¹¶ä½¿ç¨deleteædelete[]å ³é®åéæ¾å åï¼å¦åä¼å¯¼è´å åæ³æ¼ã
# newæ¯å¨å åä¸åªä¸åå»åé çå åï¼
newæç³è¯·çå ååºåå¨C++ä¸ç§°ä¸ºèªç±åå¨åºãå¾å¤ç¼è¯å¨çnew/delete齿¯ä»¥malloc/free为åºç¡æ¥å®ç°çï¼æä»¥é叏齿¯åç±å å®ç°æ¥å®ç°èªç±åå¨ï¼è¿æ¶åå°±å¯ä»¥è¯´newæç³è¯·çå ååºåå¨å ä¸ã
# 妿newå å失败äºä¼æ¯æä¹æ ·ï¼
伿åºstd::bad_allocå¼å¸¸ï¼å¦æå ä¸std::nothrowå ³é®åï¼A* p = new (std::nothrow) A;ï¼new å°±ä¸ä¼æåºå¼å¸¸èæ¯ä¼è¿å空æéã
# C++ mallocånewçåºå«æ¯ä»ä¹ï¼
newåmallocåºå«ï¼
- åé å åçä½ç½®ï¼mallocæ¯ä»å ä¸å¨æåé å åï¼newæ¯ä»èªç±åå¨åºä¸ºå¯¹è±¡å¨æåé å åãèªç±åå¨åºçä½ç½®åå³äºoperator newçå®ç°ãèªç±åå¨åºä¸ä» å¯ä»¥ä¸ºå ï¼è¿å¯ä»¥æ¯éæåå¨åºï¼è¿é½çoperator newå¨åªé为对象åé å åã
- è¿åç±»åå®å ¨æ§ï¼mallocå ååé æååè¿åvoid*ï¼ç¶åå强å¶ç±»å转æ¢ä¸ºéè¦çç±»åï¼newæä½ç¬¦åé å åæååè¿åä¸å¯¹è±¡ç±»åç¸å¹é çæéç±»åï¼å æ¤newæ¯ç¬¦åç±»åå®å ¨çæä½ç¬¦ã
- å ååé 失败è¿åå¼ï¼mallocå ååé 失败åè¿åNULLãnewåé å å失败å伿å¼å¸¸ï¼bac_allocï¼ã
- åé å åç大å°ç计ç®ï¼ä½¿ç¨newæä½ç¬¦ç³è¯·å ååé æ¶æ é¡»æå®å ååç大å°ï¼ç¼è¯å¨ä¼æ ¹æ®ç±»åä¿¡æ¯èªè¡è®¡ç®ï¼èmallocåéè¦æ¾å¼å°æåºæéå åç尺寸ã
- æ¯å¦å¯ä»¥è¢«éè½½ï¼opeartor new /operator deleteå¯ä»¥è¢«éè½½ãèmalloc/freeåä¸è½éè½½ã
# new å malloc å¦ä½å¤ææ¯å¦ç³è¯·å°å åï¼
- malloc ï¼æåç³è¯·å°å åï¼è¿åæå该å åçæéï¼åé 失败ï¼è¿å NULL æéã
- new ï¼å ååé æåï¼è¿å该对象类åçæéï¼åé å¤±è´¥ï¼æåº bac_alloc å¼å¸¸ã
# deleteåfreeçåºå«
- new/deleteæ¯C++çæä½ç¬¦ï¼èmalloc/freeæ¯Cä¸ç彿°ã
- newå两件äºï¼ä¸æ¯åé å åï¼äºæ¯è°ç¨ç±»çæé 彿°ï¼åæ ·ï¼deleteä¼è°ç¨ç±»çææå½æ°åéæ¾å åãèmallocåfreeåªæ¯åé åéæ¾å åã
- new建ç«çæ¯ä¸ä¸ªå¯¹è±¡ï¼èmallocåé çæ¯ä¸åå åï¼new建ç«ç对象å¯ä»¥ç¨æå彿°è®¿é®ï¼ä¸è¦ç´æ¥è®¿é®å®çå°å空é´ï¼mallocåé çæ¯ä¸åå ååºåï¼ç¨æé访é®ï¼å¯ä»¥å¨éé¢ç§»å¨æéï¼newåºæ¥çæéæ¯å¸¦æç±»åä¿¡æ¯çï¼èmallocè¿åçæ¯voidæéã
- new/deleteæ¯ä¿çåï¼ä¸éè¦å¤´æä»¶æ¯æï¼malloc/freeéè¦å¤´æä»¶åºå½æ°æ¯æã
# delete å®ç°åçï¼delete å delete[] çåºå«ï¼
delete çå®ç°åçï¼
- é¦å æ§è¡è¯¥å¯¹è±¡æå±ç±»çææå½æ°ï¼
- è¿èéè¿è°ç¨ operator delete çæ ååºå½æ°æ¥éæ¾æå çå å空é´ã
delete å delete [] çåºå«ï¼
- delete ç¨æ¥éæ¾å个对象æå ç空é´ï¼åªä¼è°ç¨ä¸æ¬¡ææå½æ°ï¼
- delete [] ç¨æ¥éæ¾æ°ç»ç©ºé´ï¼ä¼å¯¹æ°ç»ä¸çæ¯ä¸ªæåé½è°ç¨ä¸æ¬¡ææå½æ°ã
# malloc çåçï¼malloc çåºå±å®ç°ï¼
malloc çåç:
- å½å¼è¾ç空é´å°äº 128K æ¶ï¼è°ç¨ brk() 彿°ï¼éè¿ç§»å¨ _enddata æ¥å®ç°ï¼
- å½å¼è¾ç©ºé´å¤§äº 128K æ¶ï¼è°ç¨ mmap() 彿°ï¼éè¿å¨èæå°å空é´ä¸å¼è¾ä¸åå åç©ºé´æ¥å®ç°ã
malloc çåºå±å®ç°ï¼
- brk() 彿°å®ç°åçï¼åé«å°åçæ¹åç§»å¨æåæ°æ®æ®µçé«å°åçæé _enddataã
- mmap å åæ å°åçï¼
- è¿ç¨å¯å¨æ å°è¿ç¨ï¼å¹¶å¨èæå°å空é´ä¸ä¸ºæ å°åå»ºèææ å°åºåï¼
- è°ç¨å æ ¸ç©ºé´çç³»ç»è°ç¨å½æ° mmap()ï¼å®ç°æä»¶ç©çå°ååè¿ç¨èæå°åçä¸ä¸æ å°å ³ç³»ï¼
- è¿ç¨å起对è¿çæ å°ç©ºé´ç访é®ï¼å¼å缺页å¼å¸¸ï¼å®ç°æä»¶å 容å°ç©çå åï¼ä¸»åï¼çæ·è´ã
# malloc 1KBå1MB æä»ä¹åºå«ï¼
malloc() æºç éé»è®¤å®ä¹äºä¸ä¸ªéå¼ï¼
- å¦æç¨æ·åé çå åå°äº 128 KBï¼åéè¿ brk() ç³è¯·å åï¼
- å¦æç¨æ·åé çå åå¤§äº 128 KBï¼åéè¿ mmap() ç³è¯·å åï¼
注æï¼ä¸åç glibc çæ¬å®ä¹çéå¼ä¹æ¯ä¸åçã
# ä»ç»ä¸ä¸mallocçbrkï¼mmap
å®é ä¸ï¼malloc() 并䏿¯ç³»ç»è°ç¨ï¼èæ¯ C åºéç彿°ï¼ç¨äºå¨æåé å åã
malloc ç³è¯·å åçæ¶åï¼ä¼æä¸¤ç§æ¹å¼åæä½ç³»ç»ç³è¯·å å åã
- æ¹å¼ä¸ï¼éè¿ brk() ç³»ç»è°ç¨ä»å åé å å
- æ¹å¼äºï¼éè¿ mmap() ç³»ç»è°ç¨å¨æä»¶æ å°åºååé å åï¼
æ¹å¼ä¸å®ç°çæ¹å¼å¾ç®åï¼å°±æ¯éè¿ brk() 彿°å°ãå é¡¶ãæéåé«å°åç§»å¨ï¼è·å¾æ°çå å空é´ãå¦ä¸å¾ï¼

æ¹å¼äºéè¿ mmap() ç³»ç»è°ç¨ä¸ãç§æå¿åæ å°ãçæ¹å¼ï¼å¨æä»¶æ å°åºåé ä¸åå åï¼ä¹å°±æ¯ä»æä»¶æ å°åºâå·âäºä¸åå åãå¦ä¸å¾ï¼

# å页å å管ç说ä¸ä¸
åé¡µæ¯ææ´ä¸ªèæåç©çå å空é´åæä¸æ®µæ®µåºå®å°ºå¯¸ç大å°ãè¿æ ·ä¸ä¸ªè¿ç»å¹¶ä¸å°ºå¯¸åºå®çå å空é´ï¼æä»¬å«é¡µï¼Pageï¼ãå¨ Linux ä¸ï¼æ¯ä¸é¡µç大å°ä¸º 4KBã
èæå°åä¸ç©çå°åä¹é´éè¿é¡µè¡¨æ¥æ å°ï¼å¦ä¸å¾ï¼

页表æ¯åå¨å¨å åéçï¼å å管çåå ï¼MMUï¼å°±åå°èæå åå°åè½¬æ¢æç©çå°åçå·¥ä½ã
èå½è¿ç¨è®¿é®çèæå°åå¨é¡µè¡¨ä¸æ¥ä¸å°æ¶ï¼ç³»ç»ä¼äº§çä¸ä¸ªç¼ºé¡µå¼å¸¸ï¼è¿å ¥ç³»ç»å æ ¸ç©ºé´åé ç©çå åãæ´æ°è¿ç¨é¡µè¡¨ï¼æååè¿åç¨æ·ç©ºé´ï¼æ¢å¤è¿ç¨çè¿è¡ã
å¨å页æºå¶ä¸ï¼èæå°åå为两é¨åï¼é¡µå·å页å åç§»ã页å·ä½ä¸ºé¡µè¡¨çç´¢å¼ï¼é¡µè¡¨å å«ç©ç页æ¯é¡µæå¨ç©çå åçåºå°åï¼è¿ä¸ªåºå°åä¸é¡µå åç§»çç»å就形æäºç©çå åå°åï¼è§ä¸å¾ã

æ»ç»ä¸ä¸ï¼å¯¹äºä¸ä¸ªå åå°å转æ¢ï¼å ¶å®å°±æ¯è¿æ ·ä¸ä¸ªæ¥éª¤ï¼
- æèæå åå°åï¼ååæé¡µå·ååç§»éï¼
- æ ¹æ®é¡µå·ï¼ä»é¡µè¡¨éé¢ï¼æ¥è¯¢å¯¹åºçç©ç页å·ï¼
- ç´æ¥æ¿ç©ç页å·ï¼å ä¸åé¢çåç§»éï¼å°±å¾å°äºç©çå åå°åã
ä¸é¢ä¸¾ä¸ªä¾åï¼èæå åä¸ç页éè¿é¡µè¡¨æ å°ä¸ºäºç©çå åä¸ç页ï¼å¦ä¸å¾ï¼

# C++æ°ç¹æ§
# è¯´è¯´ä½ äºè§£çC++11ç¸å ³ç¹æ§
- èªå¨ç±»åæ¨æï¼autoï¼ï¼å¼å ¥äºautoå ³é®åï¼å¯ä»¥æ ¹æ®åéåå§å表达å¼çç±»åèªå¨æ¨æåéçç±»åï¼ä½¿å¾ä»£ç æ´å ·çµæ´»æ§åå¯è¯»æ§ã
- èå´for循ç¯ï¼éè¿for (element : container)è¯æ³ï¼å è®¸ç´æ¥éå容å¨ä¸çæ¯ä¸ªå ç´ ï¼ç®åäºè¿ä»£æä½ï¼åå°äºä»£ç éã
- ç§»å¨è¯ä¹åå³å¼å¼ç¨ï¼éè¿å¼å ¥å³å¼å¼ç¨ï¼&&ï¼åç§»å¨æé 彿°ï¼åå°äºèµæºç®¡çæ¶çä¸å¿ è¦æ·è´æä½ï¼æé«äºæ§è½ã
- æºè½æéï¼std::shared_ptråstd::unique_ptrçæºè½æéç±»çå¼å ¥ï¼å¸®å©ç®¡ç卿åé çå åï¼é¿å å åæ³æ¼åæ¬ææéçé®é¢ã
- Lambda表达å¼ï¼å¼å ¥äºå¿å彿°çLambda表达å¼è¯æ³ï¼è½å¤æ´æ¹ä¾¿å°å®ä¹å使ç¨å½æ°å¯¹è±¡ï¼åå°äºåä½ä»£ç ã
- nullptr空æéï¼å¼å ¥äºnullptrå ³é®åï¼ç¨äºè¡¨ç¤ºç©ºæéï¼æ¿ä»£äºä¼ ç»çNULLï¼é¿å äºç©ºæé常é䏿´æ°é´ç模ç³é®é¢ã
- åå§åå表ï¼éè¿ä½¿ç¨è±æ¬å·{}æ¥å¯¹å¯¹è±¡åå§åï¼ç»ä¸äºåå§åè¯æ³ï¼æä¾äºæ´å®å ¨ãç®æ´çåå§åæ¹å¼ã
- é»è®¤åå 餿å彿°ï¼å¼å ¥äº=defaultå=deleteæ¥ææé»è®¤æé 彿°ãæ·è´æé 彿°çççæåç¦æ¢ã
- 强类åæä¸¾ï¼å¼å ¥äºæä¸¾ç±»ï¼enum classï¼ï¼è§£å³äºä¼ ç»æä¸¾ç±»å带æ¥çå ¨å±å½å空é´åç±»åå®å ¨é®é¢ã
- å¤çº¿ç¨æ¯æï¼å¼å ¥äºstd::threadãstd::mutexçå¤çº¿ç¨æ¯æåºï¼ä½¿å¾å¹¶åç¼ç¨æ´å æ¹ä¾¿åå®å ¨ã
- æ³åç¼ç¨ä¼åï¼å¼å ¥äºconstexprå ³é®åï¼å 许å¨ç¼è¯æ¶è®¡ç®è¡¨è¾¾å¼ï¼æé«äºç¨åºçæ§è½ã
# C++11 æ°ç¹æ§äºè§£åªäºå 容ï¼
ç±»åæ¨å¯¼ä¸ç®åè¯æ³
| ç¹æ§åç§° | æè¿° | ç¤ºä¾ |
|---|---|---|
auto å
³é®å | èªå¨æ¨å¯¼åéç±»åï¼ç®åå¤æç±»å声æï¼å¦è¿ä»£å¨ï¼ã | auto x = 42; â int x |
decltype | æ¨å¯¼è¡¨è¾¾å¼ç±»åï¼ä¿ç const åå¼ç¨å±æ§ï¼éç¨äºæ¨¡æ¿ç¼ç¨ã | int i=1; decltype(i) j = i; â int j |
å³å¼å¼ç¨ä¸ç§»å¨è¯ä¹
å³å¼å¼ç¨ï¼&&ï¼ | åºåå·¦å¼/å³å¼ï¼æ¯æèµæºé«æè½¬ç§»ï¼å¦ä¸´æ¶å¯¹è±¡ï¼ã | std::vector<int> v2 = std::move(v1); |
|---|---|---|
| ç§»å¨æé 彿°/èµå¼è¿ç®ç¬¦ | åå°æ·±æ·è´å¼éï¼éè¿èµæºè½¬ç§»æåæ§è½ã | ç±»ä¸å®ä¹ ClassName(ClassName&& other) noexcept; |
å®ç¾è½¬åï¼std::forwardï¼ | ä¿æåæ°åå§ç±»åï¼é¿å 夿¬¡æ·è´ã | 模æ¿ä¸ä½¿ç¨ std::forward<T>(arg) |
æºè½æé
std::unique_ptr | ç¬å æææï¼ä¸å¯å¤å¶ä½å¯ç§»å¨ï¼æ¿ä»£ auto_ptrã | std::unique_ptr<int> ptr = std::make_unique<int>(10); |
|---|---|---|
std::shared_ptr | å ±äº«æææï¼å¼ç¨è®¡æ°ç®¡çèµæºï¼çº¿ç¨å®å ¨ã | std::shared_ptr<int> ptr = std::make_shared<int>(10); |
std::weak_ptr | è§£å³ shared_ptr 循ç¯å¼ç¨é®é¢ã | std::weak_ptr<int> w_ptr = s_ptr; |
彿°ä¸æ¨¡æ¿å¢å¼º
| Lambda è¡¨è¾¾å¼ | å¿å彿°ï¼æ¯ææè·å¤é¨åéï¼ç®ååè°åç®æ³ã | std::sort(vec.begin(), vec.end(), [](int a, int b) { return a < b; }); |
|---|---|---|
| åé¿åæ°æ¨¡æ¿ | æ¯æä»»ææ°é/ç±»åçæ¨¡æ¿åæ°ï¼ç¨äºå ç¼ç¨å容å¨è®¾è®¡ã | template<typename... Args> void func(Args... args); |
constexpr 常éè¡¨è¾¾å¼ | ç¼è¯æ¶æ±å¼ï¼ä¼åæ§è½ï¼å è®¸å½æ°å¨ç¼è¯ææ§è¡ã | constexpr int factorial(int n) { return n <=1 ? 1 : n*factorial(n-1); } |
å¹¶åç¼ç¨æ¯æ
std::thread | åçå¤çº¿ç¨æ¯æï¼ç»åäºæ¥éåååæä½å®ç°åæ¥ã | std::thread t(func); t.join(); |
|---|---|---|
std::async å std::future | ç®å弿¥ä»»å¡ç®¡çï¼è·å弿¥æä½ç»æã | auto future = std::async(func); int result = future.get(); |
# auto ç±»åæ¨å¯¼çåçæ¯ä»ä¹ï¼
auto ç±»åæ¨å¯¼çåçï¼ç¼è¯å¨æ ¹æ®åå§å¼æ¥æ¨ç®åéçç±»åï¼è¦æ±ç¨ auto å®ä¹åéæ¶å¿ é¡»æåå§å¼ãç¼è¯å¨æ¨æåºæ¥ç auto ç±»åææ¶ååå§å¼ç±»åå¹¶ä¸å®å ¨ä¸æ ·ï¼ç¼è¯å¨ä¼é彿¹åç»æç±»åä½¿å ¶æ´ç¬¦ååå§åè§åã
# lambda表达å¼çåçæ¯ä»ä¹ï¼
仿¬è´¨ä¸è®²ï¼Lambda è¡¨è¾¾å¼æ¯ç¼è¯å¨èªå¨çæçä¸ä¸ªå¿åç彿°å¯¹è±¡ï¼ä¹ç§°ä¸ºä»¿å½æ°ï¼ã彿们ç¼åä¸ä¸ª Lambda è¡¨è¾¾å¼æ¶ï¼ç¼è¯å¨ä¼å建ä¸ä¸ªæªå½åçç±»ï¼è¿ä¸ªç±»éè½½äºå½æ°è°ç¨è¿ç®ç¬¦ operator()ã
#include <iostream>
int main() {
auto lambda = [](int a, int b) { return a + b; };
int result = lambda(3, 4);
std::cout << "Result: " << result << std::endl;
return 0;
}
ç¼è¯å¨ä¼å°ä¸è¿° Lambda 表达å¼è½¬æ¢ä¸ºç±»ä¼¼ä¸é¢ç代ç ï¼
#include <iostream>
// ç¼è¯å¨çæçæªå½åç±»
class __lambda_4_13 {
public:
__lambda_4_13() = default;
inline int operator()(int a, int b) const {
return a + b;
}
};
int main() {
__lambda_4_13 lambda;
int result = lambda(3, 4);
std::cout << "Result: " << result << std::endl;
return 0;
}
# delete 彿°å default 彿°çåºå«æ¯ä»ä¹ï¼
- delete 彿°ï¼= delete è¡¨ç¤ºè¯¥å½æ°ä¸è½è¢«è°ç¨ã
- default 彿°ï¼= default 表示ç¼è¯å¨çæé»è®¤ç彿°ï¼ä¾å¦ï¼çæé»è®¤çæé 彿°ã
#include <iostream>
using namespace std;
class A
{
public:
A() = default; // 表示使ç¨é»è®¤çæé 彿°
~A() = default; // 表示使ç¨é»è®¤çææå½æ°
A(const A &) = delete; // 表示类çå¯¹è±¡ç¦æ¢æ·è´æé
A &operator=(const A &) = delete; // 表示类çå¯¹è±¡ç¦æ¢æ·è´èµå¼
};
int main()
{
A ex1;
A ex2 = ex1; // error: use of deleted function 'A::A(const A&)'
A ex3;
ex3 = ex1; // error: use of deleted function 'A& A::operator=(const A&)'
return 0;
}
# C++ 11 nullptr æ¯ NULL ä¼å¿æ¯ä»ä¹ï¼
两è çåºå«ï¼
- NULLï¼é¢å¤çåéï¼æ¯ä¸ä¸ªå®ï¼å®ç弿¯ 0ï¼å®ä¹å¨å¤´æä»¶ ä¸ï¼å³ #define NULL 0ã
- nullptrï¼C++ 11 ä¸çå ³é®åï¼æ¯ä¸ç§ç¹æ®ç±»åçåé¢å¼ï¼å¯ä»¥è¢«è½¬æ¢æä»»æå ¶ä»ç±»åã
nullptr çä¼å¿ï¼
- æç±»åï¼ç±»åæ¯ typdef decltype(nullptr) nullptr_t;ï¼ä½¿ç¨ nullptr æé«ä»£ç çå¥å£®æ§ã
- 彿°éè½½ï¼å 为 NULL æ¬è´¨ä¸æ¯ 0ï¼å¨å½æ°è°ç¨è¿ç¨ä¸ï¼è¥åºç°å½æ°é载并ä¸ä¼ éçå®åæ¯ NULLï¼å¯è½ä¼åºç°ï¼ä¸ç¥ååªä¸ä¸ªå½æ°å¹é çæ åµï¼ä½æ¯ä¼ éå®å nullptr å°±ä¸ä¼åºç°è¿ç§æ åµã
#include <iostream>
#include <cstring>
using namespace std;
void fun(char const *p) {
cout << "fun(char const *p)" << endl;
}
void fun(int tmp) {
cout << "fun(int tmp)" << endl;
}
int main() {
fun(nullptr); // fun(char const *p)
/*
fun(NULL); // error: call of overloaded 'fun(NULL)' is ambiguous
*/
return 0;
}
# C++é®é¢ææ¥
# linuxç¨åºå´©æºæä¹å®ä½é®é¢ï¼
妿å¼å¯äºcore dumpæä»¶ç转åï¼é£ä¹ç¨åºå´©æºä¹åï¼å°±ä¼çæ core dump æä»¶ï¼è¿éé¢ä¼æç¨åºè¿è¡æ¶çå æ ä¿¡æ¯ï¼ç¶åæä»¬å¯ä»¥ç¨ gdp å·¥å ·å»åæ core dump æä»¶ã
gdb myapp core
å¨ GDB ä¸ï¼ä½¿ç¨ btï¼backtraceï¼å½ä»¤å¯ä»¥æ¥çç¨åºå´©æºæ¶çè°ç¨æ ï¼
(gdb) bt
妿ç¨åºå´©æºé®é¢å¯ä»¥éç°ï¼é¡µå¯ä»¥ä½¿ç¨ GDB ç´æ¥è°è¯ç¨åºãå¨ç¼è¯ç¨åºæ¶ï¼ä½¿ç¨ -g é项添å è°è¯ä¿¡æ¯ãä¾å¦ï¼
gcc -g -o myapp myapp.c
ä½¿ç¨ GDB å¯å¨ç¨åºå¹¶è¿è¡ï¼å½ç¨åºå´©æºæ¶ï¼GDB ä¼åå¨å´©æºçä½ç½®ã
gdb myapp
(gdb) run
ç¨åºå´©æºåï¼ä½¿ç¨ bt å½ä»¤æ¥çè°ç¨æ ï¼æ¾åºé®é¢æå¨ç彿°å代ç è¡ã
æäºç¨åºä¼å¨å´©æºæ¶è¾åºé误信æ¯å°æ åé误è¾åºï¼stderrï¼ï¼é£ä¹è¿æ¶åç´æ¥å»çé误æ¥å¿å°±è¡äºã
cat error.log
# å 忳鲿ä¹é¿å ï¼
å¯ä»¥ä½¿ç¨ä½¿ç¨æºè½æéï¼C++æä¾äºæºè½æéï¼å¦std::shared_ptrãstd::unique_ptrçï¼ï¼å¯ä»¥èªå¨ç®¡ç卿åé çå åãæºè½æéå©ç¨äºRAIIï¼èµæºè·åå³åå§åï¼çååï¼å¨å¯¹è±¡çå½å¨æç»ææ¶èªå¨éæ¾å åï¼é¿å äºæ¾å¼è°ç¨deleteçç¹çåéã
ä¹å¯ä»¥ä½¿ç¨å åæ³æ¼æ£æµå·¥å ·ï¼å¦Valgrindçï¼æ¥åæç¨åºï¼å¨ç¨åºè¿è¡è¿ç¨ä¸æ£æµå åæ³æ¼ï¼å¹¶åæ¶ä¿®å¤ã
# 妿éå°å åæ³æ¼è¿ç§é®é¢ï¼ä½ ä¸è¬æ¯æä¹å»è§£å³ï¼
ææç¹å®ä½ç¶ååå¤çï¼åæ¥æè对æ¹åºè¯¥æ¯æ³è®©æåçè¿ç§å¤çæªæ½â¬ï¸
- å¨ç¨åºä¸å å ¥å¿ è¦çé误å¤ç代ç ï¼é¿å ç¨åºå 为å¼å¸¸æ åµè导è´å åæ³æ¼ã
- ä½¿ç¨æºè½æéçRAIIæºå¶ï¼èªå¨ç®¡çå åï¼é¿å æå¨ç®¡çå åç麻ç¦ååºéé£é©ã
- 使ç¨å ååæå·¥å ·ï¼æ£æµç¨åºä¸çå åæ³æ¼ï¼å¹¶è¿è¡ç¸åºçä¿®å¤ã
# å 忳鲿乿£æµï¼
å¯ä»¥ç¨ Valgrind å·¥å ·ã
é¦å ç䏿®µ C ç¨åºç¤ºä¾ï¼æ¯å¦ï¼
#include <stdlib.h>
int main()
{
int *array = malloc(sizeof(int));
return 0;
}
ç¼è¯ç¨åºï¼gcc -g -o main main.cï¼æ¯åªä¸éè¦å ä¸ -g é项æå¼è°è¯ï¼ä½¿ç¨ IDE çå¯ä»¥ç¨ Debug 模å¼ç¼è¯ã
ä½¿ç¨ Valgrind æ£æµå åä½¿ç¨æ åµï¼
valgrind --tool=memcheck --leak-check=full ./main
ç»æï¼
==31416== Memcheck, a memory error detector
==31416== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==31416== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==31416== Command: ./main_c
==31416==
==31416==
==31416== HEAP SUMMARY:
==31416== in use at exit: 4 bytes in 1 blocks
==31416== total heap usage: 1 allocs, 0 frees, 4 bytes allocated
==31416==
==31416== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1
==31416== at 0x4C2DBF6: malloc (vg_replace_malloc.c:299)
==31416== by 0x400537: main (main.c:5)
==31416==
==31416== LEAK SUMMARY:
==31416== definitely lost: 4 bytes in 1 blocks
==31416== indirectly lost: 0 bytes in 0 blocks
==31416== possibly lost: 0 bytes in 0 blocks
==31416== still reachable: 0 bytes in 0 blocks
==31416== suppressed: 0 bytes in 0 blocks
==31416==
==31416== For counts of detected and suppressed errors, rerun with: -v
==31416== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
å
ççè¾åºä¿¡æ¯ä¸ç HEAP SUMMARYï¼å®è¡¨ç¤ºç¨åºå¨å ä¸åé
å
åçæ
åµï¼å
¶ä¸ç 1 allocs 表示ç¨åºåé
äº 1 次å
åï¼0 frees 表示ç¨åºéæ¾äº 0 次å
åï¼4 bytes allocated 表示åé
äº 4 个åèçå
åã
å¦å¤ï¼Valgrind ä¹ä¼æ¥åç¨åºæ¯å¨åªä¸ªä½ç½®åçå
åæ³æ¼ãä¾å¦ï¼ä»ä¸é¢çä¿¡æ¯å¯ä»¥çå°ï¼ç¨åºåçäºä¸æ¬¡å
åæ³æ¼ï¼ä½ç½®æ¯ main.c æä»¶ç第 5 è¡ï¼
==31416== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1
==31416== at 0x4C2DBF6: malloc (vg_replace_malloc.c:299)
==31416== by 0x400537: main (main.c:5)
# C++代ç å¼å¸¸core dumpä¼çæä¸ä¸ªæ ï¼éé¢å 容æ¯ä»ä¹ï¼
æ å 容就æ¯ç¨åºå´©æºåç âç°åºå½åâï¼è½å¸®ä½ 顺çè°ç¨é¾æ¾å°åªéåºäºé®é¢ï¼ä»¥å彿¶çåéç¶æã彿¶çåéç¶æã主è¦å å«è¿äºä¿¡æ¯ï¼
- 彿°è°ç¨é¾ï¼ä»å´©æºçé£ä¸ªå½æ°å¼å§ï¼ä¸å±å±å¾ä¸åææè°ç¨å®ç彿°ãæ¯å¦ A è°ç¨ Bï¼B è°ç¨ Cï¼C å´©æºäºï¼æ é就伿¾ç¤º C â B â A ç顺åºï¼è½çåº âå´©æºæ¯ä»åªä¸ªå ¥å£ä¸æ¥æ¥èµ°å°è¿éçâã
- æ¯ä¸ªå½æ°çå°åï¼è®°å½æ¯ä¸ªå½æ°å¨å
åä¸çå
·ä½å°åï¼æ¯å¦
0x400520ï¼ï¼ç»åç¼è¯æ¶ç符å·è¡¨ï¼å¦ææ²¡è¢« strip æï¼ï¼å°±è½å¯¹åºå°å ·ä½æ¯åªä¸ªå½æ°ï¼æ¯å¦main()ãfunc()ï¼ã - 彿°çåæ°åå±é¨åéï¼æ¯ä¸ªå½æ°è°ç¨æ¶ä¼ å
¥çåæ°å¼ã以å彿°å
é¨å®ä¹ç临æ¶åéï¼æ¯å¦
int a=5ä¸çaï¼ï¼ä¼ææ ç顺åºä¿åãè¿è½å¸®ä½ ææ¥ âæ¯ä¸æ¯åæ°ä¼ éäºââåé弿¯ä¸æ¯å¼å¸¸äºâã - æ æéä½ç½®ï¼è®°å½å´©æºæ¶æ é¡¶çä½ç½®ï¼åè¯ä½ å½åæ ç¨å°äºåªéï¼ææ²¡ææº¢åºï¼æ¯å¦æ è¢«åæ»¡äºï¼ã
ææ°çå¾è§£æç« é½å¨å ¬ä¼å·é¦åï¼å«å¿è®°å ³æ³¨å¦ï¼ï¼å¦æä½ æ³å å ¥ç¾äººææ¯äº¤æµç¾¤ï¼æ«ç 䏿¹äºç»´ç åå¤ãå 群ãã

â Springé¢è¯é¢ Golangé¢è¯é¢ â
