ð¡ å ³äº
ð
ð¡ 䟧蟹
ð
ð ä»åº
- â C/C++
- âïž Effective
- ðŠ STL
- ãœïž
æ° æ® ç»æ - â¡ïž
ç®æ³ - â Problems
- ð»
æäœ ç³» ç» - âïž è®¡ç®
æº çœç» - ð© çœç»çŒçš
- ðŸ
æ° æ® åº - ð 讟计
æš¡ åŒ - âïž éŸæ¥
è£ èœœåº - ð 乊ç±
- ð± C/C++ åå±
æ¹å - ð¯ å€ä¹
å· é¢çœç« - ð
é¢ è¯é¢ç® ç»éª - ð
æè æ¶éŽå²äœ - ð
å æš - ð¬ 莡ç®
è - ð License
ä¿® 饰åé ïŒè¯Žæ该åé äžå¯ ä»¥è¢«æ¹ åïŒä¿® 饰æéïŒå 䞺æå åžž éç æ éïŒpointer to constïŒå èªèº« æ¯ åžž éç æ éïŒåžž é æ éïŒconst pointerïŒïŒä¿® 饰åŒçš ïŒæå åžž éç åŒçš ïŒreference to constïŒïŒçš äºåœ¢å ç±»åïŒå³ é¿å äº æ·èŽïŒå é¿å äº åœæ° 对åŒç ä¿® æ¹ ïŒä¿® 饰æååœæ° ïŒè¯Žæ该æååœæ° å äžèœ ä¿® æ¹ æ ååé ã
æ éæå åžž éç æ éïŒpointer to constïŒèªèº« æ¯ åžž éç æ éïŒåžž é æ éïŒconst pointerïŒ
åŒçš æå åžž éç åŒçš ïŒreference to constïŒæ²¡ æ const referenceïŒå 䞺åŒçš åª æ¯ å¯¹è±¡ç å«åïŒåŒçš äž æ¯ å¯¹è±¡ïŒäžèœ çš constä¿® 饰
ïŒäžºäº
æ¹äŸ¿ è®°å¿å¯ 以æ³æ ïŒè¢« constä¿® 饰ïŒåš constå é¢ ïŒç åŒäžå¯ æ¹ åïŒåŠäžæ䜿 çšäŸ åäž ç p2
ãp3
const
// ç±»
class A
{
private:
const int a; // åžž 对象æ åïŒå¯ ä»¥äœ¿çš å å§ å å è¡š æ è
ç±»å
å å§ å
public:
// æé åœæ°
A() : a(0) { };
A(int x) : a(x) { }; // å å§ å å è¡š
// constå¯çš äºå¯¹é 蜜åœæ° ç åºå
int getValue(); // æ®é æ ååœæ°
int getValue() const; // åžžæ ååœæ° ïŒäž åŸ ä¿® æ¹ ç±»äžç ä»» äœ æ° æ® æ åçåŒ
};
void function()
{
// 对象
A b; // æ®é 对象ïŒå¯ 以è°çš å
šéš æ ååœæ°
const A a; // åžž 对象ïŒåª èœ è°çšåžžæ ååœæ°
const A *p = &a; // æ éåé ïŒæå åžž 对象
const A &q = a; // æå åžž 对象ç åŒçš
// æ é
char greeting[] = "Hello";
char* p1 = greeting; // æ éåé ïŒæå å 笊 æ° ç»åé
const char* p2 = greeting; // æ éåé ïŒæå å 笊 æ° ç»åžžé ïŒconst å é¢ æ¯ charïŒè¯Žææå ç å 笊 ïŒcharïŒäžå¯ æ¹ åïŒ
char* const p3 = greeting; // èªèº« æ¯ åžž éç æ éïŒæå å 笊 æ° ç»åé ïŒconst å é¢ æ¯ p3ïŒè¯Žæ p3 æ éèªèº« äžå¯ æ¹ åïŒ
const char* const p4 = greeting; // èªèº« æ¯ åžž éç æ éïŒæå å 笊 æ° ç»åžžé
}
// åœæ°
void function1(const int Var); // äŒ éè¿æ¥ç å æ° åš åœæ° å
äžå¯ å
void function2(const char* Var); // å æ° æ éææ å
容 䞺垞é
void function3(char* const Var); // å æ° æ é䞺垞 é
void function4(const int& Var); // åŒçš å æ° åš åœæ° å
䞺垞é
// åœæ° è¿ å åŒ
const int function5(); // è¿ å äž äžªåžžæ°
const int* function6(); // è¿ å äžäžªæååžžéçæéåéïŒäœ¿çš ïŒconst int *p = function6();
int* const function7(); // è¿ å äžäžªæååéçåžžæéïŒäœ¿çš ïŒint* const p = function7();
const |
|
---|---|
é¢å€ |
çŒè¯ |
æ ç±» |
|
#undef |
ä¿® 饰æ®é åéïŒä¿® æ¹ åéç å åšåºå å çåœ åšæ ïŒäœ¿ åéå åšåšé æåºïŒåš mainåœæ° è¿è¡å å°±åé äº ç©º éŽïŒåŠææ å å§ åŒå°±çš å å§ åŒåå§ å å®ïŒåŠæ没 æ å å§ åŒç³»ç»çšé» 讀åŒå å§ å å®ãä¿® 饰æ®é åœæ° ïŒè¡šæ åœæ° ç äœçš èåŽïŒä» åšå® ä¹è¯¥åœæ° ç æ 件 å æèœ äœ¿çš ãåš å€ äºº åŒå项ç®æ¶ïŒäžºäºé²æ¢ äž ä»äºº åœå 空 éŽéç åœ æ° é å ïŒå¯ 以å°åœæ° å®äœ 䞺 staticãä¿® 饰æååé ïŒä¿® 饰æååé 䜿 ææ ç å¯¹è±¡åª ä¿å äž äžªè¯¥åéïŒèäžäž éèŠ çæ 对象就å¯ä»¥è®¿é®è¯¥æ åãä¿® 饰æååœæ° ïŒä¿® 饰æååœæ° 䜿 åŸ äž éèŠ çæ 对象就å¯ä»¥è®¿é®è¯¥åœæ° ïŒäœ æ¯ åš staticåœæ° å äžèœ 访é®é é ææåã
this
æ éæ¯äžäžªéå«äºæ¯äžäžªééææååœæ°äžçç¹æ®æéãå®æå è°çšè¯¥æååœæ° ç é£ äžªå¯¹è±¡ ãåœ å¯¹äžäžªå¯¹è±¡è°çšæååœæ°æ¶ïŒçŒè¯çš åº å å° å¯¹è±¡ç å° å èµç»this
æ éïŒç¶ å è°çšæ ååœæ° ïŒæ¯æ¬¡ æ ååœæ° å å æ° æ® æ åæ¶ïŒéœ éåŒäœ¿çš this
æ éãåœ äžäžªæååœæ°è¢«è°çšæ¶ïŒèª åšåå®äŒ éäžäžªéå«çåæ°ïŒè¯¥åæ° æ¯ äžäžªæåè¿äžªæååœæ°æåšç对象çæéãthis
æ é被éå«å° 声æ 䞺:ClassName *const this
ïŒè¿æå³ ç äžèœ ç»this
æ éèµåŒïŒåš ClassName
ç±»çconst
æ ååœæ° äž ïŒthis
æ éçç±»å䞺ïŒconst ClassName* const
ïŒè¿è¯Žæ äžèœ 对this
æ éææå ç è¿ç§å¯¹è±¡æ¯ äžå¯ ä¿® æ¹ ç ïŒå³ äžèœ 对è¿ç§å¯¹è±¡ ç æ° æ® æ åè¿è¡ èµåŒæäœ ïŒïŒthis
并äžæ¯ äžäžªåžžè§åéïŒèæ¯äžªå³åŒïŒæ以 äžèœ ååŸ this
ç å° å ïŒäžèœ &this
ïŒãåš ä»¥äž åºæ¯äž ïŒç»åžžéèŠ æŸåŒåŒçš this
æ éïŒ- 䞺å®ç°å¯¹
象 ç éŸåŒåŒçš ïŒ - 䞺é¿
å 对åäžå¯¹è±¡è¿è¡èµåŒæäœïŒ åš å®ç°äžäºæ°æ®ç»ææ¶ïŒåŠlist
ã
- 䞺å®ç°å¯¹
çžåœ äºæå èåœæ° é é¢ ç å 容 å åš è°çšå èåœæ° å€ïŒçžåœ äºäžçš æ§è¡è¿å ¥åœæ° ç æ¥ éª€ïŒçŽæ¥ æ§è¡åœæ° äœ ïŒçžåœ äºå®ïŒåŽæ¯å® å€ äº ç±»åæ£æ¥ïŒçæ£ å ·æ åœæ° ç¹æ§ ïŒ- çŒè¯
åš äžè¬äžå èå å«åŸªç¯ãéåœãswitchç å€ææäœ ç å èåœæ° ïŒ åš ç±»å£°æ äž å® ä¹çåœæ° ïŒé€ äº è åœæ° ç å ¶ä»åœæ° éœäŒ èª åšéåŒ å° åœ æ å èåœæ° ã
inline
// 声æ 1ïŒå inlineïŒå»º è®®äœ¿çš ïŒ
inline int functionName(int first, int second,...);
// 声æ 2ïŒäž å inlineïŒ
int functionName(int first, int second,...);
// å® ä¹
inline int functionName(int first, int second,...) {/****/};
// ç±»å
å® ä¹ïŒéåŒå
è
class A {
int doA() { return 0; } // éåŒå
è
}
// ç±»å€å® ä¹ïŒéèŠ æŸåŒå
è
class A {
int doA();
}
inline int A::doA() { return 0; } // éèŠ æŸåŒå
è
å° inlineåœæ° äœ å€å¶å° inlineåœæ° è°çšç¹ å€ïŒ- 䞺æ
çš inlineåœæ° äž ç å±éš åéåé å å 空 éŽïŒ å° inlineåœæ° ç ç èŸå ¥å æ° å è¿ å åŒæå° å° è°çšæ¹æ³ ç å±éš åé空 éŽäžïŒ- åŠæ inline
åœæ° æ å€ äžªè¿å ç¹ ïŒå° å ¶èœ¬å䞺 inlineåœæ° 代 ç åæ«å°Ÿ ç å æ¯ ïŒäœ¿çš GOTOïŒã
äŒç¹
å èåœæ° å å® åœæ° äžæ ·å°åšè¢«è°çšå€è¿è¡ä»£ç å±åŒïŒç å» äº å æ° åæ ãæ 垧åŒèŸäžåæ¶ ïŒç»æè¿ å ç ïŒä»èæ é« çš åº è¿è¡é床 ãå èåœæ° çž æ¯ å® åœæ° æ¥ è¯ŽïŒåš 代 ç å±åŒæ¶ïŒäŒ åå®å š æ£æ¥æ èª åšç±»å 蜬æ¢ïŒå æ®é åœæ° ïŒïŒèå®å® ä¹åäž äŒ ãåš ç±»äžå£°æ å æ¶å®ä¹çæ ååœæ° ïŒèª åšèœ¬å 䞺å èåœæ° ïŒå æ€å èåœæ° å¯ ä»¥è®¿é®ç±»ç æ ååé ïŒå® å® ä¹åäžèœ ãå èåœæ° åš è¿è¡æ¶å¯è°è¯ïŒèå®å® ä¹äžå¯ 以ã
代 ç èšèãå èæ¯ä»¥ä»£ç èšèïŒå€å¶ïŒäžºä»£ä»·ïŒæ¶ é€ åœæ° è°çšåžŠæ¥ç åŒéãåŠææ§è¡åœæ° äœå 代 ç çæ¶éŽïŒçž æ¯ äºåœæ° è°çšç åŒéèŸå€§ïŒé£ ä¹æç ç æ¶ è·äŒåŸå°ãåŠäžæ¹é¢ ïŒæ¯ äžå€å èåœæ°çè°çšéœèŠå€å¶ä»£ç ïŒå° 䜿 çš åº ç æ»ä»£ç éå¢å€§ ïŒæ¶è æŽ å€ ç å å 空 éŽã- inline
åœæ° æ æ³é ç åœæ° åºå级èå 级ãinlineåœæ° ç æ¹ åéèŠ é æ° çŒè¯ïŒäž å non-inlineå¯ ä»¥çŽæ¥ éŸæ¥ã æ¯ åŠ å èïŒçš åº åäžå¯ æ§ ãå èåœæ° åª æ¯ å¯¹çŒè¯åšç 建 è®®ïŒæ¯ åŠ å¯¹åœæ° å èïŒå³å®æåšäºçŒè¯åšã
Are "inline virtual" member functions ever actually "inlined"?
è åœæ° å¯ ä»¥æ¯å èåœæ° ïŒå èæ¯å¯ 以修饰èåœæ° ç ïŒäœ æ¯ åœ è åœæ° è¡š ç°å€ææ§ç æ¶åäžèœ å èãå èæ¯åš çŒè¯æ 建 è®®çŒè¯åšå èïŒèèåœæ° ç å€ ææ§åš è¿è¡æ ïŒçŒè¯åš æ æ³ç¥é è¿è¡æ è°çšåªäžªä»£ ç ïŒå æ€èåœæ° è¡š ç°äžºå€ ææ§æ¶ïŒè¿è¡æ ïŒäžå¯ 以å èãinline virtual
å¯ äžå¯ä»¥å èçæ¶åæ¯ïŒçŒè¯åš ç¥é æ è°çšç å¯¹è±¡æ¯ åªäžªç±»ïŒåŠBase::who()
ïŒïŒè¿åªæ åš çŒè¯åš å ·æ å®é 对象èäžæ¯ 对象ç æ éæåŒçš æ¶æäŒ åçã
#include <iostream>
using namespace std;
class Base
{
public:
inline virtual void who()
{
cout << "I am Base\n";
}
virtual ~Base() {}
};
class Derived : public Base
{
public:
inline void who() // äž å inlineæ¶éåŒå
è
{
cout << "I am Derived\n";
}
};
int main()
{
// æ€å€ç è åœæ° who()ïŒæ¯ é è¿ç±»ïŒBaseïŒç å
·äœ 对象ïŒbïŒæ¥ è°çšç ïŒçŒè¯æ éŽå°±èœ ç¡®å®äº ïŒæ以 å®å¯ä»¥æ¯å
èçïŒäœ æ ç»æ¯åŠ å
èåå³äºçŒè¯åš ã
Base b;
b.who();
// æ€å€ç è åœæ° æ¯ é è¿æéè°çš ç ïŒå ç°å€ææ§ïŒéèŠ åš è¿è¡æ¶æéŽæèœ ç¡®å®ïŒæ以 äžèœ 䞺å
èã
Base *ptr = new Derived();
ptr->who();
// å 䞺Baseæ è ææåœæ° ïŒvirtual ~Base() {}ïŒïŒæ以 delete æ¶ïŒäŒ å
è°çšæŽŸç ç±»ïŒDerivedïŒææåœæ° ïŒå è°çšåº ç±»ïŒBaseïŒææåœæ° ïŒé²æ¢ å
å æ³æŒã
delete ptr;
ptr = nullptr;
system("pause");
return 0;
}
volatile int i = 10;
- volatile å
³é®
å æ¯ äžç§ç±»å修饰笊ïŒçš å®å£°æ ç ç±»ååé衚瀺 å¯ ä»¥è¢«æ äºçŒè¯åšæª ç¥ç å çŽ ïŒæäœ ç³» ç»ã硬 件 ãå ¶å®çº¿çšç ïŒæŽæ¹ ãæ以 äœ¿çš volatileå è¯çŒè¯åšäž åºå¯¹è¿æ ·ç 对象è¿è¡äŒåã - volatile å
³é®
å 声æ ç åéïŒæ¯æ¬¡ 访é®æ¶éœå¿ é¡»ä»åå äž ååº åŒïŒæ²¡ æ 被 volatileä¿® 饰çåéïŒå¯èœ ç± äºçŒè¯åšç äŒåïŒä» CPUå¯ å åš äž å åŒïŒ - const
å¯ ä»¥æ¯ volatile ïŒåŠåªè¯»çç¶ æå¯å åš ïŒ æ éå¯ä»¥æ¯ volatile
<assert.h>
ïŒCïŒã<cassert>
ïŒC++ïŒNDEBUG
include <assert.h>
assert()
#define NDEBUG // å äž è¿è¡ïŒå assert äž å¯çš
#include <assert.h>
assert( p != NULL ); // assert äž å¯çš
- sizeof 对æ°ç»ïŒ
åŸ å° æŽ äžªæ°ç»æå 空 éŽå€§å° ã - sizeof 对æéïŒ
åŸ å° æ éæ¬èº« æ å 空 éŽå€§å° ã
讟å®ç»æ
#pragma pack(n)
#pragma pack(push) // ä¿å 对éœç¶ æ
#pragma pack(4) // 讟å®äžº 4 å è对éœ
struct test
{
char m1;
double m4;
int m3;
};
#pragma pack(pop) // æ¢å€å¯¹éœç¶ æ
Bit mode: 2; // mode å 2 äœ
ç±»å¯ä»¥å°å
¶ïŒ
äœ å åš å å äž ç åž å± æ¯ äž æº åš æ å ³çäœ å ç ç±»åå¿ é¡»æ¯ æŽ å æ æ 䞟类å ïŒåžŠç¬Šå· ç±»åäž ç äœ å ç è¡ äžºå°å å ·äœ å®ç°èå®å å° å è¿ç®ç¬Š ïŒ&ïŒäžèœ äœçš äºäœå ïŒä»» äœ æ ééœæ æ³æå ç±»çäœ å
被 externéå® ç åœæ° æ åéæ¯ extern ç±»åç 被 extern "C"
ä¿® 饰çåéå åœæ° æ¯ æç § C è¯èšæ¹åŒ çŒè¯å éŸæ¥ç
extern "C"
extern "C"
extern "C"
#ifdef __cplusplus
extern "C" {
#endif
void *memset(void *, int, size_t);
#ifdef __cplusplus
}
#endif
// c
typedef struct Student {
int age;
} S;
// c
struct Student {
int age;
};
typedef struct Student S;
æ€æ¶ S
struct Student
ïŒ
åŠå€è¿å¯ä»¥å®ä¹äž struct Student
void Student() {}
ã
struct Student {...};
ïŒStudent me;
æ¶ïŒçŒè¯Student
Student
ä¹å¯ä»¥struct Student
ïŒåŠäžïŒ
// cpp
struct Student {
int age;
};
void f( Student me ); // æ£ ç¡®ïŒ"struct" å
³é®å å¯ çç¥
Student
Student
typedef struct Student {
int age;
} S;
void Student() {} // æ£ ç¡®ïŒå® ä¹å "Student" åª ä»£è¡š æ€åœæ°
//void S() {} // é误ïŒç¬Šå· "S" å·² ç»è¢«å® ä¹äžºäž 䞪 "struct Student" ç å«å
int main() {
Student();
struct Student me; // æ è
"S me";
return 0;
}
æ»ç
æ æ¬ èŽšçäžäžªåºå«å°±æ¯é»è®€ç访é®æ§å¶é» 讀ç继æ¿è®¿é®æéãstructæ¯ publicç ïŒclassæ¯ privateç ã- struct
äœ äžºæ°æ® ç»æç å®ç°äœ ïŒå®é»è®€çæ° æ® è®¿é®æ§ å¶ æ¯ publicç ïŒè classäœ äžºå¯¹è±¡ ç å®ç°äœ ïŒå®é»è®€çæ ååé 访é®æ§ å¶ æ¯ privateç ã
èåïŒunionïŒ
é» è®€è®¿é®æ§å¶ 笊 䞺 publicå¯ ä»¥å«æ æéåœæ° ãææåœæ° äžèœ å«æ åŒçš ç±»åç æ åäžèœ 继æ¿èª å ¶ä»ç±»ïŒäžèœ äœ äžºåºç±»äžèœ å«æ è åœæ° å¿å unionåš å® ä¹æåš äœçš å å¯ çŽæ¥ è®¿é® unionæ åå¿å unionäžèœ å å« protectedæ åæ privateæ åå šå± å¿å èåå¿ é¡»æ¯ é æïŒstaticïŒç
union
#include<iostream>
union UnionTest {
UnionTest() : i(10) {};
int i;
double d;
};
static union {
int i;
double d;
};
int main() {
UnionTest u;
union {
int i;
double d;
};
std::cout << u.i << std::endl; // èŸåº UnionTest èåç 10
::i = 20;
std::cout << ::i << std::endl;