第一章 對象導言
主要介紹了什麼是C++語言、OOP的基本思想。
對於C++的基本內容給出了一些介紹,並建議對比C++、Java、Python語言,更好的理解面向對象的思想
這裏提到了XP編程,尤其建議測試驅動開發與結對編程
另外,這裏兩次提到了重載,分別是Overriding & OverLoading
Overriding指子類對父類的成員函數的不同實現
Overloading指相同的函數名稱,不同的參數
第二章 對象的創建與使用
C++語言主要的設計目的是:
輔助進行大型軟件開發,追求運行速度快(因此 C++只進行靜態類型檢查)
聲明(Declatation)與定義(Definition)的區別:
聲明:告訴編譯器一個標識符,“這個函數或變量他的模塊像什麼”
定義:告訴編譯器,“在這裏建立變量或函數”,它爲名字分配存儲空間
標準C++的include
#include <iostream>
由於不同的編譯器廠商選用了不同的文件擴展名,不同OS對文件名的限制不一致,標準C++統一去掉了文件擴展名
注意:新的包含格式與老的效果不一樣,使用.h的文件是老的、非模板化的版本,而沒有.h的文件是新的模板化版本。如果在同一程序中混用這兩種形式,可能會遇到問題。
注:可以使用perl或Python可自動完成爲程序員庫打包的一部分工作,可參考www.Perl.org或www.Python.org
名字空間: using namespace std;
所有標準C++庫都封裝在一個名字空間中,即std。 上面語句意味着打開std名字空間,使它的所有名字都可用
如果使用#include <xx.h>,編譯器會自動添加using namespace std語句
Vector
vector是一個模板 (template),它可以有效地用於不同的類型。我們可以創建Shape的vector、CFile的vector、string的vector.用模板幾乎可以創建任何事物的類
吧類型命輸入到尖括號內,讓編譯器知道vector所用的類。 所以string的vector表示爲 vector<string>,如果想在這個vector中加入其他類型,編譯器會報錯
第三章 C++中的C
C++的引用與指針僅僅是語法上的不同表達方法,這個有時候也會稱爲“語法糖”。在函數語言中常用到這個概念。
靜態變量:
靜態變量與普通變量的區別有兩個主要方面:一是變量的初始化靜態變量只會初始化一次,普通局部變量每次函數執行後都會初始化;二是變量的作用域不同,static變量限定了本文件或本函數才能訪問。而對於頭文件的static全局變量,是C++語法中不推薦的使用方法。
static對函數的修飾作用與變量相似,static修飾class,後面給出。
顯示類型轉換:
static_cast, const_cast, dynamic_case, reinterpret_cast
double dvar = 3.14159265;
long lvar = static_cast<long>(dvar);
make文件編寫:
這塊的東西較多,書上介紹的不多,網上有很多資料
第四章 數據抽象
C++的struct:
與C的語法不同,C++可以在struct內部定義函數,一個struct可以沒有任何數據成員而存在函數,這個語法的實現就是class的基礎。
爲了解決訪問struct的函數的功能,C++引入了::操作符。
C++編譯器:
最早的C++編譯器cfront 由AT&T開發,它輸出的是C代碼,然後再由C編譯器編譯。 所以,必然有方法用C語言描述C++語法。
頭文件:
頭文件中,不能使用 using directive指令,這會引起意外的關閉namespace
第五章 隱藏實現
友元:
友元是爲了允許顯示的不屬於當前結構的一個函數或其它對象訪問當前結構中的數據。
友元定義的要求:友元必須在一個結構內聲明。如:(注意X和Y的聲明順序)
class & struct:
各方面都是一樣的,除了class的成員默認是private的,struct成員默認是public的。
第六章 初始化與清楚
封裝和訪問控制在改進庫的易用性與安全性方面取得了重大進展,安全性包括初始化和清楚兩個方面。
構造函數:
當才C++編譯器對對象分配內存的時候,悄悄地在對象的定義處插入了構造函數調用,傳遞到構造函數的第一個參數就是this指針,this指針指向一段沒有初始化的地址,構造函數的作用就是初始化該內存塊。
C++ 中,定義和初始化是集爲一體的,不能只取其一。
構造函數和析構函數沒有返回類型(與返回值是void的還不一樣)
默認構造函數:
當且僅當,一個結構中(class or struct)沒有構造函數時,編譯器會自動創建一個,但是編譯器創建的構造函數的作用僅僅時可以定義對象。一般我們還是要自己來定義構造函數。
析構函數:
析構函數不帶任何參數
當對象超出其作用域時,編譯器自動調用析構函數。注意:setjmp()和longjmp()構成的非局部跳轉(nonlocal jump),可能導致析構函數不會執行。
其它:
require.h可用來檢視程序員的錯誤,代替函數assert(),asert()對失敗操作的輸出不及require(),具體怎麼用??
int a[5] = {1,2}; //第1、2個參數根據顯示給出的定義,其餘補零
int b[5]; //初始化情況不可預料