C++primer5th筆記-創(chuàng)新互聯(lián)

目錄
  • 2022年11月25日 周五 陰
    • 第一、二章:變量和基本類型
      • 基本內(nèi)置類型
        • unsigned
        • float與double
        • 'A'與"A"
        • 布爾類型轉(zhuǎn)換時
        • 初始化與賦值
        • 初始化
        • 聲明與定義
      • 復(fù)合類型
        • 引用與指針
        • 指向指針的指針
        • 指向指針的引用
  • 2022-11-26 星期六 小雨
      • const
    • 第三章 字符串、常量和數(shù)組
      • 命名空間
      • string
      • vector
      • 迭代器
  • 2022-11-27 星期日 小雨
      • 數(shù)組
        • 指針和數(shù)組
        • 多維數(shù)組
    • 第四章:表達式
      • 算術(shù)運算符
        • 成員訪問運算符
  • 2022-11-28 周一 陰
      • 位運算
        • sizeof
        • 類型轉(zhuǎn)換
      • 第五章: 語句
    • 第六章:函數(shù)
        • 函數(shù)基礎(chǔ)
        • 數(shù)組形參
        • 構(gòu)造函數(shù)
    • 2022年11月30日 周三 雪
      • 第九章:順序容器
        • 迭代器

創(chuàng)新互聯(lián)于2013年創(chuàng)立,先為隆化等服務(wù)建站,隆化等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為隆化企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。2022年11月25日 周五 陰 第一、二章:變量和基本類型 基本內(nèi)置類型 unsigned

除去布爾型和擴展的字符型外,其他整型可以劃分為帶符號的和無符號的兩種。帶符號類型可以表示正數(shù)、負數(shù)或0,無符號類型則僅能表示大于等于0的值。

如果表達式里既有帶符號類型又有無符號類型,當(dāng)這個帶符號類型取值為負時會出現(xiàn)異常,因為帶符號數(shù)會自動轉(zhuǎn)換成無符號數(shù)。所以切勿混用帶符號與無符號類型。
unsigned u = 10, u2 = 42 ,u - u2 = 4294967264
10, 10u, 10L, 10uL, 012, 0xC:整形字面值,無符號整形字面值,長整形字面值,無符號長整形字面值,八進制整形字面值,十六進制整形字面值;
int month = 09, day = 07; 八進制整形,八進制中沒有9,所以會報錯。
1024f;非法,整形字面值不可加后綴f;

float與double

float最小尺寸為6位有效值,double最小尺寸為10位有效值。

'A’與"A"

前者代表單獨的字符A
==※==后者代表了一個字符的數(shù)組,包含兩個字符:一個是字母A,另一個是空字符(‘\0’)

布爾類型轉(zhuǎn)換時

非布爾類型值賦給布爾類型值時,初始值為0,結(jié)果為false。除此之外為true
布爾類型值賦給非布爾類型值時,初始值為false,結(jié)果為0。初始值true,結(jié)果為1

初始化與賦值

初始化不是賦值
初始化:創(chuàng)建變量時賦予其一個初始值
賦值:把對象的當(dāng)前值擦除,用一個新的值來替代

初始化

定義于函數(shù)體內(nèi)的內(nèi)置類型的對象如果沒有初始化,則其值未定義,如果試圖拷貝或者訪問此類值將引發(fā)錯誤。(所以建議初始化每一個內(nèi)置類型的變量)
而類的對象如果沒有顯式地初始化,則其值由類決定。(例如string類如果沒有指定初值則生成一個空串)

int i = { 3.14 }; 非法,不能執(zhí)行強制轉(zhuǎn)換,因為存在丟失信息的風(fēng)險
int i = 3.14;合法,已強制轉(zhuǎn)換。

聲明與定義

聲明規(guī)定了變量的類型和名字,定義不僅這樣,還會申請存儲空間,也有可能直接賦初始值。

extern int i;	//聲明i,但無定義(如果賦初始值就是定義了)
int j; 			// 聲明并定義j

變量能被多次聲明,但只能被定義一次

含義是在編譯階段檢查類型

用戶自定義的類名一般以大寫字母開頭 Sales_item

一旦定義了引用,就無法令其再綁定到另外的對象

復(fù)合類型 引用與指針

引用是其他對象的別名。指針本身就是對象(所以它本身也有自己的地址),存放其他對象的地址
因為引用不是對象,沒有實際地址,所以不能定義指向引用的指針

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指針對應(yīng)的bool都是true;if(pi)
建議 int *p這種寫法

指向指針的指針
int  ival = 1024;
int *pi = &ival;
int **ppi = π

遇到復(fù)雜的指針和引用時,建議從右向左閱讀

指向指針的引用
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 星期六 小雨 const

const對象一旦創(chuàng)建后其值就不能再改變,所以const對象必須初始化
如果想在多個文件之間共享const對象,就必須在變量的定義之前加extern關(guān)鍵字

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ù)組 命名空間

操作符(::)的意思是:編譯器應(yīng)從操作符左側(cè)名字所示的作用域中尋找右側(cè)那個名字
頭文件里的內(nèi)容會拷貝到所有引用它的文件中,所有應(yīng)該避免在頭文件中使用using聲明

string

在用cin讀取string對象時,會自動忽略開頭的空白,并在下一個空白處停止
如果輸入" Hello World “,那么輸出將是"Hello”
要解決這個問題可以使用getline(cin, s),當(dāng)遇見換行符時停止

string中的size()函數(shù)返回的其實是一個unsigned無符號的int值。所以,對于表達式s.size()< n來說,如果n是一個負值,則這個表達式的結(jié)果幾乎100%是true,因為負值n會自動轉(zhuǎn)換成一個比較大的無符號值。
所以如果一個表達式里已經(jīng)有了size()函數(shù)就不要再使用int了,這樣可以避免混用int和unsigned可能帶來的問題
C++中,字符串字面值與string是不同的類型,string s = “hello” + ","是錯誤的。必須保證每個加號兩側(cè)的運算對象至少有一個是string。

不管什么時候,只要對string對象使用了下標,都要確認這個下標處有值
小tips:

for (decltype(s.size()) index=0;  index != s.size(); index++ ) {}

題目:

string s;
cout<< s[0]<< endl;
//合法,定義后就占用一個字節(jié),包含’\0’。
vector

vector中只能存放同一種類型對象
vector不能存放引用,因為引用不是對象

vectorv1(10, 1);	// 有10個元素,每個值都是1
vectorv1{10, 1};	// 有2個元素,分別是10,1
vectorsvec(10, "null");	//正確,創(chuàng)建了一個包含10個元素為“null”的vector對象。

范圍for語句體內(nèi)不應(yīng)改變其所遍歷序列的大小

只能對已確認存在的元素執(zhí)行下標操作(否則常常會出現(xiàn)緩沖區(qū)溢出buffer overflow)

迭代器

begin成員指向容器中第一個元素,而end返回容器尾元素的后一個元素(即不存在的元素)
當(dāng)容器為空時,begin和end返回的是同一個迭代器,即尾后迭代器

2022-11-27 星期日 小雨 數(shù)組

要理解數(shù)組聲明的含義,最好是從數(shù)組的名字開始,由內(nèi)向外依次閱讀
int ia[txt_size()]; 當(dāng)txt_size()是constexpr時正確;否則錯誤

string sa[10];
int ia[10];
int main() {string sa2[10];
    int ia2[10];
}

sa:空字符串;
ia:0;
sa2:空字符串;
ia2:不確定值。

指針和數(shù)組
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時轉(zhuǎn)換不會發(fā)生、
decltype(ia) ia3 = {0, 1, 2, 3, 4};	//此時ia3是一個含有5個整數(shù)的數(shù)組

要特別注意:尾后指針不能執(zhí)行解引用和遞增操作

C++程序應(yīng)該盡量使用vector和迭代器,而避免使用內(nèi)置數(shù)組和指針
應(yīng)該盡量使用string,而避免使用C風(fēng)格的基于數(shù)組的字符串

多維數(shù)組

嚴格地說,C++中并沒有多維數(shù)組,只有數(shù)組的數(shù)組。
int ia[3][4]; //大小為3的數(shù)組,每個元素是含有4個整數(shù)的數(shù)組
使用for循環(huán)多維數(shù)組時,除最內(nèi)層循環(huán)外,其他循環(huán)的控制變量應(yīng)該為引用類型(否則可能會出現(xiàn)轉(zhuǎ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ù)組
第四章:表達式 算術(shù)運算符

當(dāng)優(yōu)先級相同時,按照從左向右的順序組合

bool b = true;
bool c = -b;	// c依舊是true;因為b參與運算后值被轉(zhuǎn)為1,而-1不等于0,所以轉(zhuǎn)為bool后為true

參與取模運算%的運算對象必須為整數(shù)類型

const char *cp = "Hello World";
if (cp && *cp)
當(dāng)指針cp不為空時,才判斷解引用cp的值。
我們知道,cp不為空,&&左側(cè)為true;*cp為’H’,右側(cè)也為真,所以if語句為真。

避免使用后置遞增/遞減,因為后置版本需要將原始值存儲起來以便于返回這個未修改的內(nèi)容

成員訪問運算符

解引用運算符的優(yōu)先級低于點運算符

ptr->men 等價于 (*ptr).men;
2022-11-28 周一 陰 位運算

強烈建議僅將位運算符用于處理無符號類型
左移運算符<< 在右側(cè)插入值為0的二進制位
右移運算符 >>行為取決于左側(cè)運算對象的類型
如果是無符號型,在左側(cè)插入值為0的二進制位
如果是帶符號型,在左側(cè)插入值為0的二進制位或插入符號位的副本
位求反運算符 `:0置1,1置0
位異或運算符^:兩個中只有1個1則為1,否則為0

cout<< 10< 42;	//錯誤,試圖比較cout和42!
sizeof
sizeof(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ù)。
類型轉(zhuǎn)換
int val = 3.14 + 3;	//	3會轉(zhuǎn)換為double,然后執(zhí)行浮點數(shù)加法運算,再將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;

強烈建議避免強制類型轉(zhuǎn)換

第五章: 語句

在switch中,哪怕default沒用,也最好加上
魯棒是Robust的音譯,也就是健壯和強壯的意思。它也是在異常和危險情況下系統(tǒng)生存的能力。

第六章:函數(shù) 函數(shù)基礎(chǔ)

局部靜態(tài)對象:即使其所在的函數(shù)執(zhí)行結(jié)束對它也沒有影響,它直到程序終止才被銷毀。
在C++中,建議使用引用類型的形參代替指針類型的形參。而且,當(dāng)函數(shù)無需改變引用形參的值時,最好將形參聲明為常量引用

const int &r = 42;	//正確
int &r = 42;	// 錯誤,不能用字面值初始化一個非常量引用
char *argv[];等同于 char **argv;

不要返回局部對象的引用或指針
如果main函數(shù)結(jié)尾處沒有return語句,編譯器將隱式地插入一條返回0的return語句
重載:名字相同,形參列表不同

數(shù)組形參
void print(const int*);
void print(const int[]);
void print(const int[10]);
// 這三者等價,而[10]只是表示我們期望數(shù)組含有多少元素,實際不一定

通常應(yīng)該在函數(shù)聲明中指定默認實參,并將該聲明放在頭文件中

構(gòu)造函數(shù)

無論何時,只要類的對象被創(chuàng)建,就會執(zhí)行構(gòu)造函數(shù)
struct 于class的區(qū)別

2022年11月30日 周三 雪 第九章:順序容器
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)萜鞯牟僮髦蠖紤?yīng)該重新定位迭代器,特別是vector、string和deque;

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站欄目:C++primer5th筆記-創(chuàng)新互聯(lián)
文章URL:http://muchs.cn/article2/cdjsic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、外貿(mào)建站動態(tài)網(wǎng)站、靜態(tài)網(wǎng)站、ChatGPT、手機網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營