Thinking in C 第2版第一卷讀書筆記

2021-08-23 13:59:52 字數 3957 閱讀 9013

《thinking in c++》pdf電子書

c++中先編譯,後連線:

編譯:將原始碼編譯為**;

連線:將庫函式和各種自定義函式依次連線成為乙個可執行檔案。

c++中

include

不再使用

.h字尾

#include

變在了#include

。#include

呼叫程式(控制台方式):

system(「

程式名」);

。#include ifstream in(「

檔名」);//

開啟檔案以備讀取

ifstream out(「

檔名」);//

開啟檔案以備寫入。

#include vector

是乙個類似

list

的容器,是范型的。

定義指標函式:

void (*funcptr)()

,注意:

void *funcptr()

是返回void*

的函式。

right-left guideline

:對指標採用先右結合,後左結合的解讀方法。

可能釋放資源要注意,可能有的指標會指向已經釋放的位址。陣列c

的長度sizeof c/sizeof *c

:sizeof c

是總長,

sizeof *c

是第一元素的長度。

匿名:可以匿名

union

、引數。

預設情況下

const:在c

中是外部鏈結級而

c++中是檔案內部鏈結級。所以要在定義

const

變數之外的檔案中使用

const

,那麼要在定義和引用時都聲名

extern

,如:extern int a = 1;//

定義extern int a;//

聲名。在

c中總是給

const

分配空間,而

c++中只有無法編譯時確定

const

值時才被迫為其分配空間。

const int* x; int const* x;//

指向常量的指標,

*先和右邊結合。

int* const x;//

常量指標

int const*const x;

óconst int* const x;//

指向常量的常量指標

字元陣列指標(

char* p = 「abc」;

)型別實際上是常量字元陣列。如果想使陣列不是常量,那麼使用陣列形式的定義

char p = 「abc」;

常量不能做左值。函式返回常量不能作為非常量的右值(

int* ip = w();//

不合法,

w()返回

const int*

)。類中聲名成員函式為常函式,

const

關鍵字放在函式名

()的後面。

不改變類成員的函式都應聲名為常函式。

const

類物件只能呼叫

const

成員函式,

const

成員函式只能修改

mutable

成員變數(如

mutable int i;

)。int function(const t& a){}//

強制不允許改變

a的內容,如果函式內修改

a,則進行拷貝構造。

volatile

:編譯時不優化。用法類似

const

。只有volatile

成員函式可以訪問

volatile

成員變數。

定義class

時,在class

定義內直接給出函式定義的函式自動成為

inline

函式,而無須使用關鍵字。如不想使用內聯方式,則單獨定義函式。

inline

關鍵字不起作用的兩種情況:

1.函式體過於複雜;

2.函式位址被明引或暗引。

using declares//

指明名空間內具體的乙個函式之類。

using directive//

引用名空間。

static const

陣列的定義必須放在類定義外,

static const

型別中,只有

int的定義可以放在類定義內,並且

int陣列也必須要類定義外定義,其餘內建和自定義型別都不可在類定義內定義。

static initialization dependency

:靜態初始化依賴,當依賴者比被依賴者先初始化時會出錯:

1.別使用靜態依賴

2.將靜態引用全部列入乙個中間檔案

3.以上兩種還無法解決此問題:

a)使用靜態初始化標頭檔案初始化靜態型別,在要使用的地方引用此

.h檔案。這時這個

.h檔案中的物件只在本檔案中可用,再有其他檔案引用此

.h檔案時,因為要引用的型別是

static

的,編譯器會為其他檔案分配單獨的引用型別例項。

b)將靜態型別包裝到函式當中,使用之前呼叫函式強制初始化(因為靜態型別只初始化一次,注意:此時函式的實現不可在

.h檔案中採用內聯方式,因為內聯函式會為每乙個呼叫它的物件複製乙個函式例項,使得靜態型別不止一次初始化)。(推薦)

c++中呼叫

c寫的函式應使用如下方式聲名:

extern 「c」

,或者extern 「c」

,extern 「c」

函式聲名

引用必須定義時初始化。

int x = 0; int& a = x;//

此時表示a是

x的乙個別名,兩者是等價的。

引用方式傳遞引數:實際上是傳遞的物件的乙個引用,函式中可以改變原物件的值。而

const

型別無法以引用方式傳遞(因為它沒有位址,所以無法引用),所以要將函式形式引數聲名為

const

型別。編譯器在需要時會構造臨時物件,這種物件的生命期短到不會引發物件間的衝突。

類內有類(組合

composite

)的情況下,內部類必須有外部類呼叫的建構函式。換句話說,編譯器不會為內部類生成預設建構函式。當組合進行

composite a; composite b = a;

時,composite

及其內部類的拷貝建構函式都會被呼叫(如果沒有的話,編譯器會生成位拷貝型的拷貝建構函式)。所以最好為每個類自定義拷貝建構函式(

x (x&)

)以得到類的控制權。

將拷貝建構函式定義為

private

型別,可以避免系統自動生成拷貝建構函式。

對類內函式使用指標及引用類內函式,最好將其封裝在類內。

子類中重寫(重定義或修改簽名)父類中有過載函式(包括靜態)的眾函式之一時,會導致這個函式的其它過載在繼承類中隱藏。

子類使用父類中

private

型別的方法:在

public

模組中使用語句

using

父類名::

函式名(不帶括號)。

物件導向程式設計語言的三大重要特性:

1.data abstraction; 2. inheritance; 3. polymorphism.

物件切割(

object slicing

),在傳遞物件時我們通常採用傳位址,當傳值時就會發生這樣的現象,較大的物件傳給較小的類

by value

時,就會被截斷。

純虛析構函式(

pure virtual destructor

)必須提供定義,因為它比一般函式特殊。

在析構函式內部呼叫的函式,只呼叫本地版本,虛機制會被略過,以確保安全。

Thinking in C 第2版第一卷讀書筆記

thinking in c pdf電子書 c 中先編譯,後連線 編譯 將原始碼編譯為 連線 將庫函式和各種自定義函式依次連線成為乙個可執行檔案。c 中 include 不再使用 h字尾 include 變在了 include include 呼叫程式 控制台方式 system 程式名 include...

《死亡之旅》 第2版

2005年06月29日 16 03 00 如果你把這本書當作 敏捷軟體開發 這樣的普適的軟工書來讀,希望從裡面找到一些對日常專案有裨益的提議,就不會有什麼收穫。因為這本書只教人如何採取保守主義,實用主義的策略,挺過死亡之旅式的專案而沒有損傷 這是個有趣的話題。因為死亡之旅式的專案一般比較難看,所以很...

《死亡之旅》 第2版

如果你把這本書當作 敏捷軟體開發 這樣的普適的軟工書來讀,希望從裡面找到一些對日常專案有裨益的提議,就不會有什麼收穫。因為這本書只教人如何採取保守主義,實用主義的策略,挺過死亡之旅式的專案而沒有損傷 這是個有趣的話題。因為死亡之旅式的專案一般比較難看,所以很少書籍會從這裡面去總結 最佳實踐 大家更願...