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