C++Primer

未完每日更新

第二章:變量和基本類型

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;
  ......
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容