未完每日更新
第二章:變量和基本類型
2.4 const
//file1.cc// int counter;
//file2.cc// extern int counter;
但是在全局作用域聲明的const變量是定義該對(duì)象文件的局部變量。
如有需要,可以用extern const int counter = ……在file1中定義
2.6 typedef與define的區(qū)別
- define是C語(yǔ)言中定義的語(yǔ)法,是預(yù)處理指令,在預(yù)處理時(shí)進(jìn)行簡(jiǎn)單而機(jī)械的字符串替換,不作正確性檢查
typedef是關(guān)鍵字,在編譯時(shí)處理,有類型檢查功能。用typedef定義數(shù)組、指針、結(jié)構(gòu)等類型會(huì)帶來(lái)很大的方便,不僅使程序書寫簡(jiǎn)單,也使意義明確,增強(qiáng)可讀性。 - define沒(méi)有作用域的限制,只要是之前預(yù)定義過(guò)的宏,在以后的程序中都可以使用,而typedef有自己的作用域。
.#define INTPTR1 int*
typedef int* INTPTR2;
INTPTR1 p1, p2;
INTPTR2 p3,p4;
含義分別為,聲明一個(gè)指針變量p1和一個(gè)整型變量p2
聲明兩個(gè)指針變量p3、p4
第三章:標(biāo)準(zhǔn)庫(kù)數(shù)據(jù)類型
3.1 命名空間using的聲明
3.1.1
#include包含文件時(shí),相當(dāng)于頭文件中的文本成為我們編寫的文件的一部分。
如果在頭文件中放置using聲明,相當(dāng)于在包含該頭文件的每個(gè)程序都放入了同一個(gè)using。
3.2 標(biāo)準(zhǔn)庫(kù)String類型
3.2.1 對(duì)象的操作
string s1 默認(rèn)構(gòu)造函數(shù) s1為空字符串
s1.empty()
s.size()
isalnum(c) 如果c是字母或者數(shù)字,則true
3.2.2 size_type類型
s.size()的操作返回的是size_type類型的值,是unsigned類型的,保證能儲(chǔ)存足夠大且任意的字符串
string類型與其他庫(kù)類型都定義了一些配套類型,通過(guò)配套類型能保證與庫(kù)與機(jī)器無(wú)關(guān)。
用int的問(wèn)題是表示范圍太小,一個(gè)文本可能的字?jǐn)?shù)可能會(huì)超過(guò)32757
下標(biāo)也用size_type類型的值
3.2.3 賦值
string s1 ,s2 ="hello"
s1= s2;
先把S1占用的相關(guān)的內(nèi)存釋放掉,然后再分配S1給足夠存放S2副本的內(nèi)存空間,最后再?gòu)?fù)制
3.2.4 盡可能采用cname
C標(biāo)準(zhǔn)庫(kù)頭文件命名形式為name.h,C++版本則為cname
cname頭文件中定義的都在命名空間std內(nèi)
3.3 Vector類型
3.3.1
如果vector保存的是含有構(gòu)造函數(shù)類型的元素,將用該類型的默認(rèn)構(gòu)造函數(shù)來(lái)初始化
3.3.2 vector操作
v.push_back(t)
size()返回vector類定義的size_type的值
通過(guò)下標(biāo)來(lái)賦值時(shí)不會(huì)添加任何元素
3.3.3
迭代器end指向末尾元素的下一個(gè),如果vector為空,begin返回與end相同。
3.3.4 vector的擴(kuò)容
為了能用索引訪問(wèn),vector的元素儲(chǔ)存是連續(xù)的
不連續(xù)的容器如list,是一種鏈表
vector的動(dòng)態(tài)擴(kuò)容:
- 預(yù)留存儲(chǔ)區(qū),用于存放新的元素
- 舊存儲(chǔ)空間中的元素被賦值到新的存儲(chǔ)空間里面去
- 當(dāng)vector不得不重新分配存儲(chǔ)空間時(shí),采用容量加倍的策略
capacity成員函數(shù):返回容器的容量大小
reserve成員函數(shù):改變capacity,不改變size
3.3.5 vector的resize和reverse
resize()函數(shù)和容器的size息息相關(guān)。調(diào)用resize(n)后,容器的size即為n。
至于是否影響capacity,取決于調(diào)整后的容器的size是否大于capacity。
第四章:指針
4.0 void* 指針
void*可以指向不指向確定的類型,而不應(yīng)該理解為void*指針能指向任何類型的數(shù)據(jù)。
如果要訪問(wèn)實(shí)際存在的數(shù)據(jù),必須將void*指針強(qiáng)轉(zhuǎn)成為指定一個(gè)確定的數(shù)據(jù)類型的數(shù)據(jù)。
不允許使用void*指針操作它所指向的對(duì)象。
4.1 數(shù)組
4.1.1
非const變量以及要到運(yùn)行時(shí)才知道其值的const變量(調(diào)用某個(gè)函數(shù)獲得)不能作為數(shù)組的維數(shù)。
4.1.2
當(dāng)使用字符串字面值來(lái)初始化新數(shù)組時(shí),將在數(shù)組中加入空字符。
char ca[]="C++" ca的維數(shù)是4
4.1.3
與vector不同,一個(gè)數(shù)組不能用另一個(gè)數(shù)組初始化
4.1.4
用下標(biāo)訪問(wèn)元素時(shí),vector::size_type作為vector下標(biāo),數(shù)組下標(biāo)為size_t
4.2 指針
string *sp=&s
sp hold the address of s
4.2.1 注意
定義指針的時(shí)候用int *p1, *p2
因?yàn)槿?code>string* p1,p2p1是指針,但p2不是,容易歧義
若指針的值為0,表面它不指向任何對(duì)象,
很多運(yùn)行時(shí)錯(cuò)誤均源于使用了未初始化的指針
把int型變量賦予指針是非法的
4.2.2 importance 指針操作
*sp = "goodbyle" 解引修改的是指針?biāo)笇?duì)象的值
string s2 ="hello" sp =&s2 如果使用解引的操作則修改的是指針的本身。
4.2.3 指針和引用的區(qū)別
引用必須初始化,且一經(jīng)初始化,就始終指向一個(gè)特定對(duì)象
給引用賦值修改的是該引用所關(guān)聯(lián)的對(duì)象的值,并不是使引用與另一個(gè)對(duì)象關(guān)聯(lián)
第五章:表達(dá)式
5.11 new 與 delete
new 表達(dá)式返回的是新創(chuàng)建的對(duì)象的指針
int *pi = new int這種語(yǔ)句pi沒(méi)有初始化
如果內(nèi)存耗盡,new失敗會(huì)拋出bad_alloc的異常.
垂懸指針:delete p以后,p仍然保存著地址,但是地址已經(jīng)被釋放了 ,應(yīng)當(dāng)立即將指針置為0
第五章:表達(dá)式
5.8 sizeof
sizeof的返回類型為size_t,應(yīng)用在表達(dá)式上返回返回結(jié)果的長(zhǎng)度
作用在數(shù)組上返回 元素長(zhǎng)度*元素個(gè)數(shù)
等價(jià)于sizeof(int),因?yàn)?的類型為int
sizeof(char)=1
變量名可以不用括號(hào)括?。簊izeof a
數(shù)據(jù)類型必須用括號(hào)括起來(lái):sizeof(int)
sizeof與strlen()比較,在計(jì)算字符數(shù)組時(shí),sizeof包含'\0',strlen()不包含'\0'
32位系統(tǒng)下指針的sizeof是4字節(jié),64位下是8字節(jié)
32位系統(tǒng)下的sizeof(int)是4字節(jié)
數(shù)組作為形參時(shí),數(shù)組名的sizeof是4個(gè)字節(jié)
對(duì)于C字符串,需要牢記C/C++中一個(gè)漢字占兩個(gè)字節(jié)
一個(gè)char一個(gè)字節(jié)
第七章:函數(shù)
7.9 函數(shù)指針
bool (*pf)(const string &, const string &) 函數(shù)指針pf指向兩個(gè)const形參和返回結(jié)果為布爾類型的函數(shù)
typedef bool (*cmpFcn)(const string &, const string &)
cmpFcn簡(jiǎn)化了函數(shù)指針的定義
函數(shù)指針的賦值可以直接用函數(shù)名,也可以在函數(shù)名上加取址符
調(diào)用:
cmpFcn pf = lengthCompare;
pf("hi","bye"); 隱式調(diào)用
(*pf)("hi","bye") 顯式調(diào)用
int (*ff(int))(int* int);
從里往外看:
ff(int)函數(shù)返回一個(gè)int (*)(int*, int )類型的函數(shù)指針
第九章:容器和算法
9.6 String
9.6.1 memcpy 與 strcpy的區(qū)別
- 1、復(fù)制的內(nèi)容不同。strcpy只能復(fù)制字符串,而memcpy可以復(fù)制任意內(nèi)容,例如字符數(shù)組、整型、結(jié)構(gòu)體、類等。
- 2、復(fù)制的方法不同。strcpy不需要指定長(zhǎng)度,它遇到被復(fù)制字符的串結(jié)束符"\0"才結(jié)束,所以容易溢出。memcpy則是根據(jù)其第3個(gè)參數(shù)決定復(fù)制的長(zhǎng)度。
3、用途不同。通常在復(fù)制字符串時(shí)用strcpy,而需要復(fù)制其他類型數(shù)據(jù)時(shí)則一般用memcpy
第十二章:類
12.5 友元
將一個(gè)類設(shè)為友元,該友元類的所有成員函數(shù)都可以訪問(wèn)。
friend在類中的聲明可以再public、protected和private的如何一個(gè)控制域中,而不影響其效果。
class Node
{
private:
// ...
friend class BinaryTree; // class BinaryTree can now access data directly
};
12.6 static 類成員
static獨(dú)立于類的任意對(duì)象而存在
12.6.1 static與全局變量
- static的名字在類的作用域中
- static可以是私有的
12.6.2 定義
static必須在類的定義體的外部定義,在定義時(shí)初始化。
double Account::AAA = initRate();
盡管initRate()是私有的,但AAA的定義在類的作用域中,所以仍然可以訪問(wèn).
第十七章:用于大型程序的工具
17.2 命名空間
17.2.1
命名空間由它的分離定義部分的總和構(gòu)成,一個(gè)命名空間可以分散在多個(gè)文件中。 (在多個(gè).h文件中)
這意味著可以用分離的接口文件和實(shí)現(xiàn)文件構(gòu)成命名空間。
17.2.2 全局命名空間
定義在全局作用域的名字(在任意類、函數(shù)或者命名空間外部聲明的名字)是定義在全局命名空間中的,全局命名空間是隱式的,可以用::member_name來(lái)引用全局命名空間的成員,也可以直接使用
17.2.3 namespace的作用域
對(duì)于manip函數(shù),blip的成員就像聲明在全局作用域中
namespace blip {
int bi = 16, bj = 17, bk = 23;
}
int bj = 0;
void manip() {
//對(duì)于manip函數(shù)
// blip的成員就像聲明在全局作用域中
using namespace blip;
bi;//bi是16
//但是 全局作用域存在另一個(gè)名為bj的對(duì)象
//必須顯示地指出用的是哪一個(gè)
::bj;//0
blip::bj;//17
//對(duì)局部變量沒(méi)有二義性
//用局部變量的值
int bk =16;
}
TODO
構(gòu)造函數(shù)的default 與 delete
class MyClass
{
public:
MyClass()=default;
MyClass(const MyClass& )=delete;
......
}