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