除去布爾型和擴(kuò)展的字符型外,其他整型可以劃分為帶符號(hào)的和無符號(hào)的兩種。帶符號(hào)類型可以表示正數(shù)、負(fù)數(shù)或0,無符號(hào)類型則僅能表示大于等于0的值。
float與double※如果表達(dá)式里既有帶符號(hào)類型又有無符號(hào)類型,當(dāng)這個(gè)帶符號(hào)類型取值為負(fù)時(shí)會(huì)出現(xiàn)異常,因?yàn)閹Х?hào)數(shù)會(huì)自動(dòng)轉(zhuǎn)換成無符號(hào)數(shù)。所以切勿混用帶符號(hào)與無符號(hào)類型。
unsigned u = 10, u2 = 42 ,u - u2 = 4294967264
10, 10u, 10L, 10uL, 012, 0xC:整形字面值,無符號(hào)整形字面值,長(zhǎng)整形字面值,無符號(hào)長(zhǎng)整形字面值,八進(jìn)制整形字面值,十六進(jìn)制整形字面值;
int month = 09, day = 07; 八進(jìn)制整形,八進(jìn)制中沒有9,所以會(huì)報(bào)錯(cuò)。
1024f;非法,整形字面值不可加后綴f;
'A’與"A"float最小尺寸為6位有效值,double最小尺寸為10位有效值。
布爾類型轉(zhuǎn)換時(shí)前者代表單獨(dú)的字符A
==※==后者代表了一個(gè)字符的數(shù)組,包含兩個(gè)字符:一個(gè)是字母A,另一個(gè)是空字符(‘\0’)
初始化與賦值非布爾類型值賦給布爾類型值時(shí),初始值為0,結(jié)果為false。除此之外為true
布爾類型值賦給非布爾類型值時(shí),初始值為false,結(jié)果為0。初始值true,結(jié)果為1
初始化初始化不是賦值
初始化:創(chuàng)建變量時(shí)賦予其一個(gè)初始值
賦值:把對(duì)象的當(dāng)前值擦除,用一個(gè)新的值來替代
定義于函數(shù)體內(nèi)的內(nèi)置類型的對(duì)象如果沒有初始化,則其值未定義,如果試圖拷貝或者訪問此類值將引發(fā)錯(cuò)誤。(所以建議初始化每一個(gè)內(nèi)置類型的變量)
而類的對(duì)象如果沒有顯式地初始化,則其值由類決定。(例如string類如果沒有指定初值則生成一個(gè)空串)
int i = { 3.14 }; 非法,不能執(zhí)行強(qiáng)制轉(zhuǎn)換,因?yàn)榇嬖趤G失信息的風(fēng)險(xiǎn)
int i = 3.14;合法,已強(qiáng)制轉(zhuǎn)換。
聲明規(guī)定了變量的類型和名字,定義不僅這樣,還會(huì)申請(qǐng)存儲(chǔ)空間,也有可能直接賦初始值。
extern int i; //聲明i,但無定義(如果賦初始值就是定義了)
int j; // 聲明并定義j
變量能被多次聲明,但只能被定義一次
含義是在編譯階段檢查類型
用戶自定義的類名一般以大寫字母開頭 Sales_item
復(fù)合類型 引用與指針一旦定義了引用,就無法令其再綁定到另外的對(duì)象
引用是其他對(duì)象的別名。指針本身就是對(duì)象(所以它本身也有自己的地址),存放其他對(duì)象的地址
※因?yàn)橐貌皇菍?duì)象,沒有實(shí)際地址,所以不能定義指向引用的指針
int *p1 = nullptr; int *p1 = NULL; //等價(jià)于int *p1 = 0
int *p1 = 0; //直接將p1初始化為字面常量0來生成空指針
推薦使用nullptr
pi = &ival;//pi的值被改變,此時(shí)pi里是ival的地址,pi指向了ival
*pi = 0; //ival的值被改變,指針pi并沒有改變
任何非0指針對(duì)應(yīng)的bool都是true;if(pi)
建議 int *p這種寫法
int ival = 1024;
int *pi = &ival;
int **ppi = π
遇到復(fù)雜的指針和引用時(shí),建議從右向左閱讀
指向指針的引用int i = 42;
int *p;
int *&r = p;// r是一個(gè)對(duì)指針p的引用
r = &i;// 因?yàn)閞是引用了一個(gè)指針,所以給r賦值&i就是令p指向i
*r = 0; // 解引用r得到i,將i的值改為0;
為什么沒有指向引用的指針?因?yàn)橐帽旧砭筒皇且粋€(gè)對(duì)象。
2022-11-26 星期六 小雨 constconst對(duì)象一旦創(chuàng)建后其值就不能再改變,所以const對(duì)象必須初始化
如果想在多個(gè)文件之間共享const對(duì)象,就必須在變量的定義之前加extern關(guān)鍵字
int errNumb = 0;
int *const curErr = &errNumb; // curErr將一直指向errNumb(此時(shí)可以通過指針修改errNumb的值)
const double pi = 3.14;
const double *const pip = π // pip是一個(gè)指向常量對(duì)象的常量指針(都不可修改)
const int *p; //合法,指向常量的指針可以不初始化。
onst int *const p3; //不合法,常量指針未初始化;
第三章 字符串、常量和數(shù)組
命名空間操作符(::)的意思是:編譯器應(yīng)從操作符左側(cè)名字所示的作用域中尋找右側(cè)那個(gè)名字
※頭文件里的內(nèi)容會(huì)拷貝到所有引用它的文件中,所有應(yīng)該避免在頭文件中使用using聲明
在用cin讀取string對(duì)象時(shí),會(huì)自動(dòng)忽略開頭的空白,并在下一個(gè)空白處停止
如果輸入" Hello World “,那么輸出將是"Hello”
要解決這個(gè)問題可以使用getline(cin, s),當(dāng)遇見換行符時(shí)停止
※string中的size()函數(shù)返回的其實(shí)是一個(gè)unsigned無符號(hào)的int值。所以,對(duì)于表達(dá)式s.size()< n來說,如果n是一個(gè)負(fù)值,則這個(gè)表達(dá)式的結(jié)果幾乎100%是true,因?yàn)樨?fù)值n會(huì)自動(dòng)轉(zhuǎn)換成一個(gè)比較大的無符號(hào)值。
所以如果一個(gè)表達(dá)式里已經(jīng)有了size()函數(shù)就不要再使用int了,這樣可以避免混用int和unsigned可能帶來的問題
C++中,字符串字面值與string是不同的類型,string s = “hello” + ","是錯(cuò)誤的。必須保證每個(gè)加號(hào)兩側(cè)的運(yùn)算對(duì)象至少有一個(gè)是string。
不管什么時(shí)候,只要對(duì)string對(duì)象使用了下標(biāo),都要確認(rèn)這個(gè)下標(biāo)處有值
小tips:
for (decltype(s.size()) index=0; index != s.size(); index++ ) {}
題目:
string s;
cout<< s[0]<< endl;
//合法,定義后就占用一個(gè)字節(jié),包含’\0’。
vectorvector中只能存放同一種類型對(duì)象
vector不能存放引用,因?yàn)橐貌皇菍?duì)象
vectorv1(10, 1); // 有10個(gè)元素,每個(gè)值都是1
vectorv1{10, 1}; // 有2個(gè)元素,分別是10,1
vectorsvec(10, "null"); //正確,創(chuàng)建了一個(gè)包含10個(gè)元素為“null”的vector對(duì)象。
范圍for語句體內(nèi)不應(yīng)改變其所遍歷序列的大小
只能對(duì)已確認(rèn)存在的元素執(zhí)行下標(biāo)操作(否則常常會(huì)出現(xiàn)緩沖區(qū)溢出buffer overflow)
迭代器begin成員指向容器中第一個(gè)元素,而end返回容器尾元素的后一個(gè)元素(即不存在的元素)
當(dāng)容器為空時(shí),begin和end返回的是同一個(gè)迭代器,即尾后迭代器
要理解數(shù)組聲明的含義,最好是從數(shù)組的名字開始,由內(nèi)向外依次閱讀
int ia[txt_size()]; 當(dāng)txt_size()是constexpr時(shí)正確;否則錯(cuò)誤
string sa[10];
int ia[10];
int main() {string sa2[10];
int ia2[10];
}
sa:空字符串;
ia:0;
sa2:空字符串;
ia2:不確定值。
string nums[] = {"one", "two", "three"};
string *p = &nums[0];
string *p2 = nums; //等價(jià)于 p2 = &nums[0]
// 通常情況下,使用數(shù)組類型的對(duì)象其實(shí)是使用一個(gè)指向該數(shù)組首元素的指針
使用數(shù)組類型的對(duì)象,其實(shí)就是使用一個(gè)指向該數(shù)組首元素的指針
int ia[] = {0, 1, 2, 3, 4};
auto ia2(ia); // ia2是一個(gè)整型指針,指向ia的第一個(gè)元素
但是如果使用decltype時(shí)轉(zhuǎn)換不會(huì)發(fā)生、
decltype(ia) ia3 = {0, 1, 2, 3, 4}; //此時(shí)ia3是一個(gè)含有5個(gè)整數(shù)的數(shù)組
要特別注意:尾后指針不能執(zhí)行解引用和遞增操作
C++程序應(yīng)該盡量使用vector和迭代器,而避免使用內(nèi)置數(shù)組和指針
應(yīng)該盡量使用string,而避免使用C風(fēng)格的基于數(shù)組的字符串
嚴(yán)格地說,C++中并沒有多維數(shù)組,只有數(shù)組的數(shù)組。
int ia[3][4]; //大小為3的數(shù)組,每個(gè)元素是含有4個(gè)整數(shù)的數(shù)組
使用for循環(huán)多維數(shù)組時(shí),除最內(nèi)層循環(huán)外,其他循環(huán)的控制變量應(yīng)該為引用類型(否則可能會(huì)出現(xiàn)轉(zhuǎn)換為指向數(shù)組首元素指針的情況)
int ia[3][4]; //大小為3的數(shù)組,其中每個(gè)元素都是含有4個(gè)整數(shù)的數(shù)組
int (*p)[4] = ia; // p指向含有4個(gè)整數(shù)的數(shù)組
p = &ia[2]; // p指向ia的尾元素
int *ip[4]; // 整型指針的數(shù)組
int (*ip)[4]; //指向含有4個(gè)整數(shù)的數(shù)組
第四章:表達(dá)式
算術(shù)運(yùn)算符當(dāng)優(yōu)先級(jí)相同時(shí),按照從左向右的順序組合
bool b = true;
bool c = -b; // c依舊是true;因?yàn)閎參與運(yùn)算后值被轉(zhuǎn)為1,而-1不等于0,所以轉(zhuǎn)為bool后為true
參與取模運(yùn)算%的運(yùn)算對(duì)象必須為整數(shù)類型
const char *cp = "Hello World";
if (cp && *cp)
當(dāng)指針cp不為空時(shí),才判斷解引用cp的值。
我們知道,cp不為空,&&左側(cè)為true;*cp為’H’,右側(cè)也為真,所以if語句為真。
避免使用后置遞增/遞減,因?yàn)楹笾冒姹拘枰獙⒃贾荡鎯?chǔ)起來以便于返回這個(gè)未修改的內(nèi)容
成員訪問運(yùn)算符解引用運(yùn)算符的優(yōu)先級(jí)低于點(diǎn)運(yùn)算符
ptr->men 等價(jià)于 (*ptr).men;
2022-11-28 周一 陰
位運(yùn)算強(qiáng)烈建議僅將位運(yùn)算符用于處理無符號(hào)類型
左移運(yùn)算符<< 在右側(cè)插入值為0的二進(jìn)制位
右移運(yùn)算符 >>行為取決于左側(cè)運(yùn)算對(duì)象的類型
如果是無符號(hào)型,在左側(cè)插入值為0的二進(jìn)制位
如果是帶符號(hào)型,在左側(cè)插入值為0的二進(jìn)制位或插入符號(hào)位的副本
位求反運(yùn)算符 `:0置1,1置0
位異或運(yùn)算符^:兩個(gè)中只有1個(gè)1則為1,否則為0
cout<< 10< 42; //錯(cuò)誤,試圖比較cout和42!
sizeofsizeof(obj); //這種情況返回存儲(chǔ)obj所占空間的大小
sizeof obj; //這種情況返回obj類型 所占空間的大小
int x[10]; int *p = x;
cout<< sizeof(x)/sizeof(*x)<< endl; // 40/4=10,數(shù)組所占的字節(jié)數(shù)/數(shù)組類型int所占的字節(jié)數(shù),就是數(shù)組的個(gè)數(shù);
cout<< sizeof(p)/sizeof(*p)<< endl; // 4/4=1,指針?biāo)嫉淖止?jié)數(shù)/int所占的字節(jié)數(shù)。
類型轉(zhuǎn)換int val = 3.14 + 3; // 3會(huì)轉(zhuǎn)換為double,然后執(zhí)行浮點(diǎn)數(shù)加法運(yùn)算,再將double轉(zhuǎn)為int賦予val
3.1415L + 'a'; // 'a'提升為int,然后int轉(zhuǎn)為long double
cval + fval; // cval提升為int,然后int轉(zhuǎn)為float
fval = ui - ival * 1.0; // ival->double,ui->double,double->float;
強(qiáng)烈建議避免強(qiáng)制類型轉(zhuǎn)換
第五章: 語句在switch中,哪怕default沒用,也最好加上
魯棒是Robust的音譯,也就是健壯和強(qiáng)壯的意思。它也是在異常和危險(xiǎn)情況下系統(tǒng)生存的能力。
局部靜態(tài)對(duì)象:即使其所在的函數(shù)執(zhí)行結(jié)束對(duì)它也沒有影響,它直到程序終止才被銷毀。
在C++中,建議使用引用類型的形參代替指針類型的形參。而且,當(dāng)函數(shù)無需改變引用形參的值時(shí),最好將形參聲明為常量引用
const int &r = 42; //正確
int &r = 42; // 錯(cuò)誤,不能用字面值初始化一個(gè)非常量引用
char *argv[];等同于 char **argv;
不要返回局部對(duì)象的引用或指針
如果main函數(shù)結(jié)尾處沒有return語句,編譯器將隱式地插入一條返回0的return語句
重載:名字相同,形參列表不同
void print(const int*);
void print(const int[]);
void print(const int[10]);
// 這三者等價(jià),而[10]只是表示我們期望數(shù)組含有多少元素,實(shí)際不一定
通常應(yīng)該在函數(shù)聲明中指定默認(rèn)實(shí)參,并將該聲明放在頭文件中
構(gòu)造函數(shù)無論何時(shí),只要類的對(duì)象被創(chuàng)建,就會(huì)執(zhí)行構(gòu)造函數(shù)
struct 于class的區(qū)別
vector: 可變大小數(shù)組。訪問快,在尾部之外位置插入/刪除元素慢
deque:雙端隊(duì)列。訪問快,在頭尾位置插入/刪除元素快
list: 雙向鏈表。只支持雙向的順序訪問。任何位置插入/刪除都很快
forward_list: 單向鏈表。只能單向順序訪問。在任何位置插入/刪除都很快
array:固定大小數(shù)組。訪問快,不能添加/刪除元素
string:與vector基本一樣,但只能保存字符。訪問快,在尾部插入/刪除快
通常情況下,使用vector是最好的選擇
如果要求隨機(jī)訪問元素:vector或deque
如果要求在中間插入/刪除元素:list或forward_list
如果要求在頭尾插入/刪除元素且不在中間位置插入/刪除元素:deque
迭代器迭代器范圍:左閉右開
向一個(gè)vector、string或deque插入元素會(huì)使所有指向容器的迭代器、引用和指針失效
調(diào)用swap后,元素本身并未交換,也就意味著指向容器的迭代器、引用和指針都依然有效(除string外)
每次改變?nèi)萜鞯牟僮髦蠖紤?yīng)該重新定位迭代器,特別是vector、string和deque;
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧