volatile
變量如果加了 volatile 修飾奢讨,則會從內存重新裝載內容稚叹,而不是直接從寄存器拷貝內
重載運算符
- 一般情況下,單目運算符最好重載為類的成員函數(shù);雙目運算符則最好重載為類的友元函數(shù)扒袖。
- 以下一些雙目運算符不能重載為類的友元函數(shù):=塞茅、()、[]僚稿、->凡桥。
- 類型轉換函數(shù)只能定義為一個類的成員函數(shù)而不能定義為類的友元函數(shù)。
- 若一個運算符的操作需要修改對象的狀態(tài)蚀同,選擇重載為成員函數(shù)較好缅刽。
- 若運算符所需的操作數(shù)(尤其是第一個操作數(shù))希望有隱式類型轉換,則只能選用友元函數(shù)蠢络。
- 當運算符函數(shù)是一個成員函數(shù)時衰猛,最左邊的操作數(shù)(或者只有最左邊的操作數(shù))必須是運算符類的一 個類對象(或者是對該類對象的引用)。如果左邊的操作數(shù)必須是一個不同類的對象刹孔,或者是一個內部 類型的對象啡省,該運算符函數(shù)必須作為一個友元函數(shù)來實現(xiàn)。
- 當需要重載運算符具有可交換性時髓霞,選擇重載為友元函數(shù)卦睹。
static關鍵字
static關鍵字的使用
靜態(tài)局部變量:作用域在聲明它的這個函數(shù)中,只會被初始化一次方库。
普通全局變量:在本文件內可以被無限制地使用结序。而且其他的源文件中,也可以通過extern關鍵字引用后使用纵潦。
靜態(tài)全局變量:在普通全局的基礎上取消了extern關鍵字的引用徐鹤,即無論怎么樣,只能給本文件的程序使用邀层,其他文件不能使用返敬。(保護代碼模塊化,封閉外部接口)寥院。
靜態(tài)成員變量在類中先做引用聲明劲赠,再做定義性說明。
c++ socket編程
初始化和賦值要注意區(qū)分
protected:受保護的成員對于派生類的成員和友元來說是可訪問的只磷,而private基類成員對于派生類成員和友元是不能訪問的
“malloc在堆上分配的內存塊经磅,使用free釋放內存,而new所申請的內存則是在自由存儲區(qū)上钮追,使用delete來釋放“⒙酰”
C++中字符串常量為了兼容C 可以賦值給char*類型
size_t
size_t:適當?shù)厥褂胹ize_t還會使你的代碼變得如同自帶文檔元媚。當你看到一個對象聲明為size_t類型,你馬上就知道它代表字節(jié)大小或數(shù)組索引,而不是錯誤代碼或者是一個普通的算術值
size_t是一些C/C++標準在stddef.h中定義的刊棕。這個類型足以用來表示對象的大小炭晒。
size_t的真實類型與操作系統(tǒng)有關,在32位架構中被普遍定義為:
typedef unsigned int size_t;
而在64位架構中被定義為:
typedef unsigned long size_t;
size_t在32位架構上是4字節(jié)甥角,在64位架構上是8字節(jié)网严,在不同架構上進行編譯時需要注意這個問題。
而int在不同架構下都是4字節(jié)嗤无,與size_t不同震束;且int為帶符號數(shù),size_t為無符號數(shù)当犯。
Const成員函數(shù)
普通對象可以調用const成員函數(shù)垢村,而const對象可以不能調用非const成員函數(shù)(const對象必須有專供的函數(shù))。
const函數(shù)的使用與分析
在早期某些編譯器會將C++代碼翻譯為C代碼嚎卫,然后使用C編譯器生成可執(zhí)行文件嘉栓。其中翻譯的一個轉化就是:將this指針顯式添加到成員函數(shù)的第一個參數(shù)位置上,并在成員函數(shù)調用時拓诸,自動將對象的地址傳遞給參數(shù)this侵佃。
//原型轉換為C代碼后的樣子
void bark(const Dog*this);
void feed(Dog*this,unsigned add);
//調用時的轉換
dog.feed(2); -----> feed(&dog , 2);
dog.bark(); -----> bark(&dog);
當然實際編譯器不會是這么工作的,這只是幫助理解代碼運作的一種方式奠支。
const關鍵字
指向常量的指針(pointer to const)只能保證不通過這個指針來改變所指向的地址的內容馋辈。
無論是對常量的引用(reference to const)還是指向常量的指針(pointer to const)都是他們的一廂情愿覺得自己指向了一個常量,而不去修改它胚宦。
常量指針(const pointer)只能保證指針本身不會被改變首有,而指向的值是否變化就不得而知了。
new與delete
C++標準規(guī)定:delete空指針是合法的枢劝,沒有副作用井联。
所以我們在Delete指針后賦值為NULL或0是個好習慣。對一個非空指針delete后您旁,若沒有賦NULL烙常,若再次delete的話,就回指向一個不可訪問的空間.
namespace
只在cpp文件中使用namespace鹤盒,不要在頭文件中使用蚕脏。
容器
向一個vector、string或deque插入元素會使所有指向容器的迭代器侦锯、引用和指針失效驼鞭。
因為不同容器使用不同的策略來分配元素空間,在vector或string尾部以外尺碰、deque首尾之外的位置插入會引起整個對象的存儲空間的重新分配挣棕。
nullptr译隘,0,NULL
整數(shù)用 0, 實數(shù)用 0.0, 指針用 nullptr 或 NULL, 字符 (串) 用 '\0'.
整數(shù)用 0, 實數(shù)用 0.0, 這一點是毫無爭議的.
對于指針 (地址值), 到底是用 0, NULL 還是 nullptr. C++11 項目用 nullptr; C++03 項目則用 NULL, 畢竟它看起來像指針洛心。實際上固耘,一些 C++ 編譯器對 NULL 的定義比較特殊,可以輸出有用的警告词身,特別是 sizeof(NULL) 就和 sizeof(0) 不一樣厅目。
字符 (串) 用 '\0', 不僅類型正確而且可讀性好.
編碼
ASCII顯示中文是用的多字節(jié)編碼,用多個字節(jié)來表示中文法严;UNICODE兩個字節(jié)一個字符號损敷。
輸出參數(shù)和返回值
out prameter:當函數(shù)內部不需要做創(chuàng)建操作的時候使用
return value:當函數(shù)內部需要創(chuàng)建時使用,注意內存管理 #TODO:考慮智能指針是否可以做函數(shù)內創(chuàng)建對象的內存管理
C++在new時的初始化的規(guī)律可能為:對于有構造函數(shù)的類渐夸,不論有沒有括號嗤锉,都用構造函數(shù)進行初始化;如果沒有構造函數(shù)墓塌,則不加括號的new只分配內存空間瘟忱,不進行內存的初始化,而加了括號的new會在分配內存的同時初始化為0
范圍for (range for statement)
for (declaration : expression)
statement
若要改變容器內的數(shù)據(jù)苫幢,需要使用引用for(auto &i : v)
范圍for等價于
for (auto beg = v.begin(), end = v.end() ; beg != end; ++beg) {
auto &r = *beg;
r *= 2;
}
mutable 關鍵字
const意思是“這個函數(shù)不修改對象內部狀態(tài)”访诱。為了保證這一點,編譯器也會主動替你檢查韩肝,確保你沒有修改對象成員變量——否則內部狀態(tài)就變了触菜。
mutable意思是“這個成員變量不算對象內部狀態(tài)”。
比如哀峻,你搞了個變量涡相,用來統(tǒng)計某個對象的訪問次數(shù)(比如供debug用)。它變成什么顯然并不影響對象功用剩蟀,但編譯器并不知道:它仍然會阻止一個聲明為const的函數(shù)修改這個變量催蝗。把這個計數(shù)變量聲明為mutable,編譯器就明白了:這個變量不算對象內部狀態(tài)育特,修改它并不影響const語義丙号,所以就不需要禁止const函數(shù)修改它了。
作者:invalid s
鏈接:https://www.zhihu.com/question/64969053/answer/226142449
來源:知乎
lambda捕獲列表
-
空
沒有使用任何函數(shù)對象參數(shù)缰冤。 -
=
函數(shù)體內可以使用Lambda所在作用范圍內所有可見的局部變量(包括Lambda所在類的this)犬缨,并且是值傳遞方式(相當于編譯器自動為我們按值傳遞了所有局部變量)。 -
&
函數(shù)體內可以使用Lambda所在作用范圍內所有可見的局部變量(包括Lambda所在類的this)棉浸,并且是引用傳遞方式(相當于編譯器自動為我們按引用傳遞了所有局部變量)怀薛。 -
this
函數(shù)體內可以使用Lambda所在類中的成員變量。 -
a
將a按值進行傳遞迷郑。按值進行傳遞時乾戏,函數(shù)體內不能修改傳遞進來的a的拷貝迂苛,因為默認情況下函數(shù)是const的三热。要修改傳遞進來的a的拷貝鼓择,可以添加mutable修飾符。 -
&a
將a按引用進行傳遞就漾。 -
a
,&b
將a按值進行傳遞呐能,b按引用進行傳遞弟断。 -
=
,&a
,&b
除a和b按引用進行傳遞外良拼,其他參數(shù)都按值進行傳遞坤学。 -
&
,a
,b
除a和b按值進行傳遞外米间,其他參數(shù)都按引用進行傳遞刨摩。
判斷平臺
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
//define something for Windows (32-bit and 64-bit, this part is common)
#ifdef _WIN64
//define something for Windows (64-bit only)
#else
//define something for Windows (32-bit only)
#endif
#elif __APPLE__
#include <TargetConditionals.h>
#if TARGET_IPHONE_SIMULATOR
// iOS Simulator
#elif TARGET_OS_IPHONE
// iOS device
#elif TARGET_OS_MAC
// Other kinds of Mac OS
#else
# error "Unknown Apple platform"
#endif
#elif __linux__
// linux
#elif __unix__ // all unices not caught above
// Unix
#elif defined(_POSIX_VERSION)
// POSIX
#else
# error "Unknown compiler"
#endif
dll
導出類的時候最好用純虛接口的模式痹兜;dll 接口最好不要把stl或者模板容器傳來傳去的再登。
動態(tài)庫中的全局變量方篮,在被其他進程使用時有缆,會拷貝一份象踊,所以多個進程使用同一個動態(tài)庫中的全局變量也不會相互影響。也不會改變動態(tài)庫中該變量的值棚壁。類似于fork的COW技術
如果某動態(tài)庫中有一個全局變量杯矩,程序a使用的這個動態(tài)庫,程序b也使用了這個動態(tài)庫袖外,那么程序a和b中的全局變量是一個嗎史隆?也就是說,進程間使用動態(tài)庫時曼验,共享全局變量嗎泌射?答題是:是一個,共享鬓照,但寫時拷貝熔酷,給程序員的感覺是:不共享。