第一篇:c++知識點總結
C++知識點總結
Day01
一、名字空間(標準庫中的標識符都定義在std名字空間中)
1、名字空間的定義
namespace 名字空間名{ 名字空間成員 }
2、名字空間指令
using namespace 名字空間名;
3、名字空間聲明
using 名字空間名::標示符;
4、無名名字空間
namespace { 名字空間成員;}
5、無名名字空間的聲明
::標示符
二、C++的結構、聯合和枚舉
1、C++的結構里面可以定義函數
2、C++里定義結構型變量的時候可以省略struct關鍵字
3、C++中的聲明聯合類型的變量可以不加union關鍵字,支持匿名聯合
4、C++的枚舉是一個獨立的數據類型,而不是整數類型。
三、C++的bool類型
bool類型變量只可以取true或false
四、C++的函數
1、函數支持重載
重載:在同一個作用域中,函數名相同,參數表不同的函數之間構成重載關系。函數原型:返回類型+函數名+參數表
函數簽名:函數名+參數表 //c++中,同一作用域中,函數簽名必須是唯一的。
2、函數指針
函數指針的類型決定其具體指向的重載版本,而不是由實參的類型決定。
3、extern “C”
通過extern “C”指示編譯器以C語言的方式處理C++源文件中的C函數(不做函數名置換)。
5、缺省參數
如果為函數的一個參數指定了缺省值,那么該參數右面的所有參數必須都有缺省值。注意:缺省參數只能用在函數的聲明中。
6、啞元
借助啞元參數保證函數的向后兼容。借助啞元實現函數的重載。
7、內聯
內聯函數保持了函數的特性,同時避免了函數調用的開銷。
inline關鍵字僅僅表示希望該函數被編譯為內聯,通常情況下,大函數和遞歸函數不會被處理為內聯。
五、內存分配
1、new/delete操作符
如果內存是以數組的形式分配的,那么也應該按照數組的方式釋放——delete[]。
如果new失敗,這時會拋出bad_alloc異常,程序應該捕獲并處理該異常,否則進程將被系統殺死。
Day02
一、引用&
1、引用實際上是一個變量的別名。
2、引用必須在聲明的同時初始化
3、引用一旦初始化,再不能引用其他變量
4、只有const型引用才能引用常量
5、不能對常引用做賦值操作
二、C++中的類型轉換
1、靜態類型轉換: static_cast<類型>(變量);需要編譯器對類型轉換安全性進行檢查; 將void*轉換為具體類型的指針。
在源類型和目標類型之間只要有一個方向上可以做隱式類型轉換,那么在兩個方向上就都可以做靜態類型轉換。
2、動態類型轉換:dynamic_cast<類型>(變量);用于在具有多態特性的父子類之間的轉換。
3、常量類型轉換:const_cast<類型>(變量);去除指針或者引用上的const屬性。
4、重解釋類型轉換:reinterpret_cast<類型>(變量);允許對任意類型的指針進行轉換。在指針和整型之間進行轉換。
三、類和對象
1、類的聲明和定義可以分開、類的成員變量、類的成員函數。
2、類的訪問控制
1)public:公有成員,誰都可以訪問。
2)private:私有成員,只有自己才能訪問。
3)protected:保護成員,只有自己和自己的子類可以訪問
訪控限定符
| 訪控屬性
| 自己
| 子類 | 其它--------------public
|
公有
|
Ok | Ok | Ok protected
|
保護
|
Ok | Ok | No private
|
私有
|
Ok | No | No 注意:類的缺省訪控屬性是私有,而結構體的缺省訪控屬性是公有。
3、構造函數
1)如果一個類中沒有定義任何構造函數,系統就會自動提供一個默認的無參構造函數。2)如果為一個類定義了構造函數,系統就不會在為該類提供任何構造函數了。3)構造函數可以重載 4)構造函數初始化列表:
1>需要對類類型的成員變量做初始化; 2>含有引用或常量型成員;
4、對象的創建與銷毀 1)在棧中創建對象
類名 對象名(構造參數);// 隱式構造
類名 對象名 = 類名(構造參數);// 顯式構造 2)在棧中創建對象數組
類名 數組名[元素個數] = {類名(構造參數),...};3)在堆中創建對象
類名* 對象指針 = new 類名(構造參數);4)在堆中創建對象數組
類名* 對象數組指針 = new 類名[元素個數];Day03 類和對象(下)
一、this指針
1、一般而言,關鍵字this是一個指針。對于一般成員函數,它指向調用該成員函數的對象,而對于構造函數,它則指向這個正在被構造的對象。
2、在構造函數中可以通過this指針區分成員變量和局部變量(包括參數)。
3、基于this指針的自身引用還被用于支持多重串聯調用的場合。
4、將this指針作為函數的參數,實現對象間的交互。
二、常量型成員函數和常量型對象
1、常量型成員函數中的this指針為常量型,以此防止對成員變量的意外修改。對常量型對象(包括指針和引用),只能調用其常量型成員函數。
2、被聲明為mutable的成員變量可以在常量型成員函數中被修改。
3、常量型成員函數和具有相同簽名的非常量型成員函數構成重載關系。
4、當常量型成員函數與非常量型成員函數構成重載關系時,非常量對象會優先選擇非常量型成員函數。
三、析構函數
1、沒有參數,不能重載。
構造順序:創建成員變量->構造函數體 析構順序:析構函數體->銷毀成員變量
2、缺省析構函數
1>對于未定義析構函數的類,系統會提供缺省析構函數,該析構函數負責銷毀該類的成員變量。
2>缺省析構函數不負責釋放動態分配的資源。
3、對于動態分配的資源,必須通過自己定義的析構函數進行釋放。
4、析構函數是釋放的資源不僅限于內存資源。
四、拷貝構造函數
1、拷貝構造:用一個已有的對象去構造另一個同類型的副本對象。
2、拷貝構造是通過拷貝構造函數實現的。class 類名 {
類名(const 類名& 源對象引用){
從源對象到當前對象的復制;
} };
3、如果沒有為一個類提供自定義的拷貝構造函數,系統就會提供一個缺省的拷貝構造函數,實現從源對象到目標對象的復制。
4、某些情況下系統提供的缺省拷貝構造函數可能無法滿足具體的應用需求。這時就有必要提供自定義的拷貝構造函數。
5、拷貝構造發生的時機 1>構造對象副本;
2>以對象作為函數的參數和返回值; 3>以對象的方式捕獲異常。
五、拷貝賦值運算符
1、拷貝賦值:用一個已有的對象賦值給另一個同類型的副本對象。
2、拷貝賦值是通過拷貝賦值函數實現的。class 類名 {
類名& operator=(const 類名& 源對象引用){
從源對象到當前對象的復制;
} };
3、如果沒有為一個類提供自定義的拷貝賦值函數,系統就會提供一個缺省的拷貝賦值函數,實現從源對象到目標對象的復制。
4、某些情況下系統提供的缺省拷貝賦值函數可能無法滿足具體的應用需求。這時就有必要提供自定義的拷貝賦值函數。
六、靜態成員
1、靜態成員是屬于類的,唯一的,可為該類對象所共享。
2、靜態成員函數只能訪問靜態成員。
3、非靜態成員函數既能訪問靜態成員,也能訪問非靜態成員。
4、靜態成員變量必須在類外定義并初始化。
5、既可以通過類也可以通過對象訪問靜態成員,但最好通過類。
6、靜態成員同樣受類的訪問控制屬性的影響。
Day04
一、指向成員變量的指針
1、定義語法:成員變量類型 類名::*指針變量名;string Student::*pstrName;//pstrName是指向Student類中string類型的成員變量的指針
2、賦值即初始化語法:指針變量名= &類名::成員變量名;pstrName = &Student::m_strName;// pstrName指向Student類的m_strName成員變量
3、解引用語法:對象.*指針變量名 或者 對象指針->*指針變量名 Student student(...);cout << student.*pstrName << endl;Student* pStudent = &student;cout << pStudent->*pstrName << endl;
二、指向成員函數的指針
1、定義語法:成員函數返回類型(類名::*指針變量名)(形參表);void(Student::*pfuncSetName)(const string&);
2、賦值和初始化語法:指針變量名 = &類名::成員函數名;pfuncSetName = &Student::SetName;
3、解引用語法:(對象.*指針變量名)(...)、(對象指針->*指針變量名)(...)Student student(...);//創建對象(student.*puncSetName)(...);Student* pStudent = &student;//創建對象指針(pStudent->*pfuncSetName)(...);
三、對于靜態成員,可以使用普通指針訪問,不需要成員指針。
四、操作符重載
1、操作符的通用語法
1)雙目操作符:<左操作數><操作符><右操作數>,L#R。
2)單目操作符:<操作數><操作符>或<操作符><操作數>,O#或#O
2、被重載操作符的操作數中至少有一個是類類型。
3、重載操作符不會改變優先級。
4、重載操作符無法改變操作數的個數。
5、除“()”以外所有操作符函數都不能含有缺省參數。
6、所謂重載操作符實際上就是定一個提供操作符運算法則的函數(成員函數或全局函數)。
五、雙目操作符重載
L#R 全局函數:operator#(L, R),如果需要可定義為友元。成員函數:L.operator#(R)
六、單目操作符重載
#O 全局函數:operator#(O)成員函數:O.opertor#()取負運算“-“
七、輸入輸出操作符重載
一般情況下,輸入輸出操作符比較適合通過全局(友元)函數來實現,避免修改標準C++庫的iostream類。
重載輸出運算符函數形式:
ostream& operator<<(ostream& os, const 類名& 對象引用){
輸出對象的內容;
return os;} 重載輸出運算符函數形式:
istream& operator>>(istream& is, 類名& 對象引用){
輸入對象的內容;
return is;}
八、不允許重載的操作符
::
-作用域解析.取字節數 typeid針對鍵盤設備的輸入流對象針對顯示器設備的輸出流對象針對出錯設備的輸出流對象-stderr
3、文本I/O 1)文本文件的格式化I/O 2)文件位置
A.get和put位置 B.隨機讀寫 3)非格式化I/O
4、二進制I/O
第二篇:C、C++總結
1、類:類是一種抽象的數據結構,用來描述對象的屬性,是將不同數據類型的數據以及與這些數據相關的操作封裝在一起的集合體。(封裝性)
一個類的對象所占空間的大小由它的數據成員所占據的空間總和決定;當類有virtual函數時,再加上4個字節的大小。
2、面向過程與面向對象程序設計的不同:
(1)過程是基于算法的,而對象是基于類的;
(2)過程是以函數(過程)的設計來實現的,而對象是以類的設計來實現的;
(3)過程通過數據流圖(流程圖)來體現的,而對象是通過類圖(用例圖)來體現的;(4)過程需要將步驟一步一步的具體化,而對象則只注重類的設計,不管實現方法。
3、面向對象的四大特點:抽象、封裝、繼承、多態
4、訪問控制權限:
(1)public公有型:外部可以訪問
(2)protected 保護型:除了本類、子類與友元可訪問外其它的都不能訪問(3)private 私有型:除了本類外,外部的都不能訪問
5、類與對象的區別:
(1)二者的定義不同:類是不同類型數據及其相關操作的集合,對象則是類的實例化(2)類是個類型,不占空間,但對象占空間。
(3)類是類型而不是數據對象,每個類的對象都是該類數據成員的拷貝
6、繼承與派生的目的:(1)實現代碼的重用
(2)使已存在的類不需修改地適應新應用 7.繼承的特點:
(1)每個派生類代表基類的特定版本
(2)基類的屬性和方法,派生類必須擁有(構造與析構不會被繼承)8.繼承的3種方式:public,private,protected
9、多態:是指發出同樣的消息被不同類型的對象接收后導致完全不同的行為(1)多態的條件:
○1有兩個是父子關系的類 ○2有同名的虛函數
○3有父類指針或引用調用子類對象(2)多態的實現:
函數的重載 運算符重載 虛函數
1、static有什么用途?(請至少說明兩種)關鍵字static的作用是什么?
定義靜態變量 1.限制變量的作用域 2.設置變量的存儲域
C和C++中static用法(1)C中:
○1當一個變量被定義成static型時,表明該變量是一個靜態變量,存儲在靜態存儲區中,只能被定義初始化一次;特別的當全局變量被定義成static型時,還表明該變量不能被外部文件所引用
○2當一個函數被聲明為static型時,表明該函數是一個靜態函數,不能被外部文件所調用
1(2)C++的類中:
○1當類的數據成員被聲明為static型時,表明該成員是一個能被所有對象共享的數據成員,不與任何具體對象掛勾
○2 當類的成員函數被聲明為static型時,表明該成員是靜態成員函數。
2、引用與指針有什么區別? 1)引用必須被初始化,指針不必。
2)引用初始化以后不能被改變,指針可以改變所指的對象。2)不存在指向空值的引用,但是存在指向空值的指針。
3、描述實時系統的基本特性
在特定時間內完成特定的任務,實時性與可靠性
4、全局變量和局部變量在內存中是否有區別?如果有,是什么區別? 全局變量儲存在靜態數據庫,局部變量在堆棧 5 什么是平衡二叉樹?
左右子樹都是平衡二叉樹 且左右子樹的深度差值的絕對值不大于1
6、堆棧溢出一般是由什么原因導致的? 沒有回收垃圾資源
7、什么函數不能聲明為虛函數? constructor 8 冒泡排序算法的時間復雜度是什么? O(n^2)
9、Internet采用哪種網絡協議?該協議的主要層次結構? tcp/ip 應用層/傳輸層/網絡層/數據鏈路層
10、Internet物理地址和IP地址轉換采用什么協議? ARP(Address Resolution Protocol)(地址解析協議)
11、.IP地址的編碼分為哪倆部分?
IP地址由兩部分組成,網絡號和主機號。不過是要和“子網掩碼”按位與上之后才能區分哪些是網絡位哪些是主機位。
12、分別給出BOOL,int,float,指針變量 與“零值”比較的 if 語句(假設變量名為var)
BOOL型變量:if(!var)int型變量: if(var==0)float型變量:
const float EPSINON = 0.00001;
if((x >=-EPSINON)&&(x <= EPSINON)
指針變量:
if(var==NULL)
13、不能做switch()的參數類型是: switch的參數不能為實型/
14、局部變量能否和全局變量重名?
答:能,局部會屏蔽全局。要用全局變量,需要使用“::” /
15、如何引用一個已經定義過的全局變量? 答:extern
16、全局變量可不可以定義在可被多個.C文件包含的頭文件中?為什么? 答:可以,在不同的C文件中以static形式來聲明同名全局變量。
17、語句for(;1 ;)有什么問題?它是什么意思?
答:和while(1)相同。
18、do??while和while??do有什么區別?
答:前一個循環一遍再判斷,后一個判斷以后再循環
18、static全局變量與普通的全局變量有什么區別?static局部變量和普通局部變量有什么區別?static函數與普通函數有什么區別?
static全局變量與普通的全局變量有什么區別:static全局變量只初使化一次,防止在其他文件單元中被引用;static局部變量和普通局部變量有什么區別:static局部變量只被初始化一次,下一次依據上一次結果值;
static函數與普通函數有什么區別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝。
程序的局部變量存在于(堆棧)中,全局變量存在于(靜態區)中,動態申請數據存在于(堆)中。
19、sizeof(...)是運算符,它的功能是:獲得保證能容納實現所建立的最大對象的字節大小;strlen(...)是函數,要在運行時才能計算。參數必須是字符型指針(char*)。它的功能是:返回字符串的長度。20、隊列和棧有什么區別? 隊列先進先出,棧后進先出
21、在c語言庫函數中將一個字符轉換成整型的函數是atool()嗎,這個函數的原型是什么?
函數名: atol 功 能: 把字符串轉換成長整型數
用 法: long atol(const char *nptr);
22、對于一個頻繁使用的短小函數,在C語言中應用什么實現,在C++中應用什么實現? c用宏定義,c++用inline
25、直接鏈接兩個信令點的一組鏈路稱作什么? PPP點到點連接
26、軟件測試都有那些種類? 黑盒:針對系統功能的測試
白合:測試函數功能,各函數接口
27.確定模塊的功能和模塊的接口是在軟件設計的那個隊段完成的? 概要設計階段
28/TCP/IP通信建立的過程怎樣,端口有什么作用? 三次握手,確定是哪個應用程序使用該協議 29/進程和線程的差別。
線程是指進程內的一個執行單元,也是進程內的可調度實體.與進程的區別:(1)調度:線程作為調度和分配的基本單位,進程作為擁有資源的基本單位
(2)并發性:不僅進程之間可以并發執行,同一個進程的多個線程之間也可并發執行
(3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但可以訪問隸屬于進程的資源.(4)系統開銷:在創建或撤消進程時,由于系統都要為之分配和回收資源,導致系統的開銷明顯大于創建或撤消線程時的開銷。30、測試方法
人工測試:個人復查、抽查和會審
機器測試:黑盒測試和白盒測試
31、Heap與stack的差別。Heap是堆,stack是棧。
Stack的空間由操作系統自動分配/釋放,Heap上的空間手動分配/釋放。Stack空間有限,Heap是很大的自由存儲區
C中的malloc函數分配的內存空間即在堆上,C++中對應的是new操作符。
1、軟件測試(英語:software testing),描述一種用來促進鑒定軟件的正確性、完整性、安全性和質量的過程。換句話說,軟件測試是一種實際輸出與預期輸出間的審核或者比較過程。軟件測試的經典定義是:在規定的條件下對程序進行操作,以發現程序錯誤,衡量軟件質量,并對其是否能滿足設計要求進行評估的過程。流程:1.軟件測試流程 :需求了解--測試計劃--測試設計--測試用例編寫--測試執行--bug管理跟蹤--測試報告生成
2.bug就是測試過程中發現的程序缺陷,可以指需求上的,也可以指功能、性能上的
3.bug提交有多種方式,可以通過測試管理工具來管理bug,比如QC等 4.bug的生命周期: 發現bug(open)--修復bug(fixed)--關閉bug(closed)4.軟件測試方法:是指測試軟件性能的方法。包括有:白盒測試、黑盒測試、動態測試(單元測試、集成測試、系統測試、驗收測試、回歸測試等。)
5.測試工具:三類軟件測試工具: Mercury測試工具,Rational測試工具,Segue測試工具,qtp自動化測試工具和AutoRunner工具
6.測試內容:負載壓力、功能測試、白盒測試、測試管理、測試輔助。
2、算法(Algorithm)是一系列解決問題的清晰指令,即能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。圖像處理算法工程師
1、一個算法的優劣可以用空間復雜度與時間復雜度來衡量。
2、一個算法應該具有以下五個重要的特征: 有窮性、確定性、輸入、輸出、可行性。
3、冒泡排序(BubbleSort)一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。基本概念是:依次比較相鄰的兩個數,將小數放在前面,大數放在后面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數放后。然后比較第2個數和第3個數,將小數放前,大數放后,如此繼續,直至比較最后兩個數,將小數放前,大數放后。此第一趟結束,將最大的數放到了最后。在第二趟:仍從第一對數開始比較(因為可能由于第2個數和第3個數的交換,使得第1個數不再小于第2個數),將小數放前,大數放后,一直比較到倒數第二個數(倒數第一的位置上已經是最大的),第二趟結束,在倒數第二的位置上得到一個新的最大數(其實在整個數列中是第二大的數)。如此下去,重復以上過程,直至最終完成排序。由于在排序過程中總是小數往前放,大數往后放,相當于氣泡往上升,所以稱作冒泡排序。
4快速排序:基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
算法的時間復雜度是一個函數,它定量描述了該算法的運行時間。一個程序的空間復雜度是指運行完一個程序所需內存的大小。
第三篇:c++課程設計總結
課程設計總結
經過一個學期對《C++程序設計》的學習,我學習到了基本的理論知識,了解到了C++語言程序設計的思想,這些知識都為我的課程實踐和進一步的學習打下了堅實的基礎。在為期近兩周的C++課程設計中,我體會頗多,學到了很多東西。我加強了對C++程序設計這門課程的認識,并且復習了自己以前學習到的知識。這些都使得我對計算機語言的學習有了更深入的認識!總之,通過這次課程設計,我收獲頗豐,相信會為自己以后的學習和工作帶來很大的好處。像職工信息表這樣的程序設計,經歷了平時在課堂和考試中不會出現的問題和考驗。而這些問題,這并不是我們平時只靠課本,就可以輕易解決的。所以,鍛煉了我們挑戰難題,學會用已掌握的知識去解決具體問題的能力,進一步培養了獨立思考問題和解決問題的能力。特別是學會了在Visual C++中如何調試程序的方法。當然,老師的指導和同學的幫助也是不可忽視的,他們給了我許多提示和幫助,教會了我編譯復雜程序的方法。
在老師和同學的幫助下,通過自己的努力,終于完成了這次職工信息表的簡單課程設計。我經過這段時間的編程,對其中的艱辛,我是深有體會。從剛開始的選擇程序、理解程序到后來的調試程序以及改進程序這個過程中,我遇到了各種各樣的困難和挫折。但是我堅定信念,對自己充滿了信心,想盡一切辦法克服重重困難。
通過課程設計的訓練,我進一步學習和掌握了對程序的設計和編寫,從中體會到了面向對象程序設計的方便和巧妙。懂得了在進行編寫一個程序之前,要有明確的目標和整體的設計思想。另外某些具體的細節內容也是相當的重要。這些寶貴的編程思想和從中摸索到的經驗都是在編程的過程中獲得的寶貴財富。這些經驗對我以后的編程會有很大的幫助的,我要好好利用。
雖然這次課程設計是在參考程序的基礎之上進行的,但是我覺得對自己是一個挑戰和鍛煉。我很欣慰自己能在程序中加入自己的想法和有關程序內容,也就是對它的程序改進了一番改進,并有創新。但是我感覺自己的創新還不夠典型,總之還不是很滿意。另外由于時間的緊迫和對知識的了解不夠廣泛,造成了系統中還存在許多不足,功能上還不夠完善。以后我會繼續努力,大膽創新,爭取能編寫出透射著自己思想的程序。這次課程設計讓我充分認識到了自己的不足,認識到了動手能力的重要性。我會在以后的學習中更加努力鍛煉自己,提高自己,讓自己寫出更好更完善的程序,為以后的編程打好基礎!
總而言之,這次C++程序設計實踐讓我收獲很大。
計算機科學與技術13-2班
2010年7月4日
第四篇:C和C++總結
1C中分為這幾個存儲區: 棧,堆,全局區(靜態區)—靜態變量,常量區
C++中分為這幾個存儲區:棧,堆(new創建,delete結束或者操作系統自動回收),全局區(靜態區),自由存儲區-(malloc創建,free結束),常量存儲區,2看到一本書上寫了進程通信方式有如下:
1)信號 ——軟中斷,2)管道
3)文件和記錄鎖定
4)消息隊列
5)信號量
6)共享內存
Unix的啟動順序排序。
第一步:通過/boot/vm進行啟動 linux內核
第二步:init /etc/inittab
第三步:啟動相應的腳本,并且打開終端
rc.sysinit
rc.d(里面的腳本)
rc.local
第四步:啟動login登錄界面 login
第五步:在用戶登錄的時候執行sh腳本的順序:每次登錄的時候都會完全執行的/etc/profile.d/file
/etc/profile
/etc/bashrc
/root/.bashrc
/root/.bash_profile
Linux中查看目錄大小的命令:du –sh filename
修改文件屬性的命令是:chmod 777 file-R
切換為其他用戶身份的命令是:du
第一次:第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,并進入SYN_SEND狀態,等待服務器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。
第二次:第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包
ACK(ack=k+1),此包發送完畢,客戶端和服務器進入established狀態,完成三次握手
指令用途
#空指令,無任何效果
#include包含一個源代碼文件
#define定義宏
#undef取消已定義的宏
#if如果給定條件為真,則編譯下面代碼
#ifdef如果宏已經定義,則編譯下面代碼
#ifndef如果宏沒有定義,則編譯下面代碼
#elif如果前面的#if給定條件不為真,當前條件為真,則編譯下面代碼
#endif結束一個#if……#else條件編譯塊
#error停止編譯并顯示錯誤信息
static全局變量與普通的全局變量有什么區別:static全局變量只初使化一次,防止在其他文件單元中被引用;
static局部變量和普通局部變量有什么區別:static局部變量只被初始化一次,下一次依據上一次結果值;
static函數與普通函數有什么區別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝
第五篇:C++程序設計總結
第一章面向對象編程原理
?近五十年間,軟件技術經歷了多個階段的發展演變 ? 目前為止最流行的技術還是面向過程編程(POP)
? 面向過程編程采用了自頂向下的設計方案,問題被看做多個執行任務的序列。為完成這些任務,須實現一些函數。
? 面向過程有兩大不足,即:(1)數據可在程序內自由遷移,程序內任何函數都會引起數據的更改,增加了數據的脆弱性。(2)它并不能很好地建模現實世界。
? 為了克服面向過程編程中的不足,人們發明了面向對象編程(OOP)。它采用自底向上的編程方案,在程序開發中,把數據視為重要元素,不允許數據在系統內自由遷移。它還將數據和函數緊密綁定于成為類的數據結構中,函數可操作類中的數據。此特性稱為數據封裝。
? 在面向對象編程中,問題被視為一系列稱為對象的實體的集合。對象是類的實例; ? 將數據與程序的直接訪問隔絕,這稱為數據隱藏。
? 數據抽象指的是,將各種必要特性合并,而不引入背景細節。? 繼承是這樣的一個過程,即某類的對象得到另一類對象的屬性。
? 多態指的是,一個名稱,多種形態。在程序中,我們可以借此定義多個同名函數。此特性亦可重載運算符,這樣一來,同一個運算符在不同的實例下,會有不同的行為。? 動態綁定指的是,給定過程的代碼,直到運行期被調用時才確定。? 消息傳遞涉及對象名,函數(消息)名以及發送的信息。
? 與傳統的編程技術相比,面向對象技術具有諸多優勢——最顯著的當屬重用技術。? 在實時系統等幾乎所有的計算機領域,面向對象編程的應用程序都已受到重視。? 不少語言都支持面向對象編程,流行的語言包括C++、Smalltalk和Java。
第二章C++入門
? C++是C語言的超級
? C++在C語言的基礎上,添加了一些面向對象的特性,諸如對象、繼承、函數重載和運算符重載。這些特性加強了程序的清晰性,可擴展性,使程序容易維護。
? C++可用于開發各種系統,諸如編輯器、編譯器、數據庫、通信系統以及其他更多復雜的實際系統。
? C++支持交互式輸入輸出,并引入了新的注釋符號//,可用于注釋單句。它也支持C語言的注釋風格。
? 和C程序一樣,所有C++程序的執行入口都是main()函數,并以return()語句作為結束。頭文件iostream應包含于所有使用輸入輸出操作的程序開頭。? 所有標準C++程序都要包含using namespace std指令
? 典型的C++程序包括四個基本部分:也就是頭文件包含部分、類聲明部分、成員函數部分和主程序部分
? 和C程序一樣,C++程序可用于任何文本編輯器創建
? 大多數編譯器提供了集成開發運行環境。流行的編譯器系統有UNIX AT&T C++、Turbo C++和微軟公司的Visual C++
第三章符號、表達式和控制結構
? C++有不同的符號,包括關鍵字、標識符、常量、字符串和操作符 ? 標識符指的是變量名、函數名、數組名、類名等 ? C++中增加了void的一個用途,可用于聲明通用指針
? C++中枚舉數據類型略有不同,枚舉類型名稱為新的類型名。這樣我們就可以聲明枚舉類型的變量
? 在C++中,字符數組的大小應比字符串的實際長度大1 ? C++增加了指針常量和常量指針的概念,對于前者我們不能修改賦予它的地址值,對于后者,我們不能修改它指向的內容。
? 在C++的內存管理和多態實現中,指針被廣泛地使用。
? C++中提供了const修飾符,用于聲明常量,常量也是變量,只是其值不可變更。const修飾符默認修飾整型。
? C++的變量類型檢查非常嚴格,它不允許不同類型變量之間的賦值。類型轉換是打破此規的唯一辦法。
? C++允許我們在程序中隨處聲明變量,而且可以利用聲明處的表達式,在運行期完成初始化。
? 引用變量給之前定義的變量提供了一個別名。它們都指向內存中的同一個數據對象。所以,改變其中一個的值,另一邊量的值也會隨之改變。
? 引用變量必須在聲明時初始化,這建立了它和要引用的變量之間的對應關系。? 作用于解析操作符(::)的主要用于類,以識別成員函數所屬的類
? 除了malloc()、calloc()、free()函數外,C++提供了兩個一元操作符,即new和delete,以更好和更方便地分配和釋放內存
? C++也提供了操縱器,來格式化輸出數據。最常用的操縱器為endl和setw ? C++支持七種表達式類型。表達式中數據類型混用時,C++使用特定規則,自動地進行類型轉換。
? 使用類型轉換操作符,C++也可顯示地進行變量和表達式的類型轉換
? 和C語言一樣,C++也支持三種基本的控制結構,也就是順序結構,分支結構和循環結構,并使用各種控制語句實現它們,比如if、if…else、switch、do…while、while以及for。
第四章C++中的函數
? 在程序的不同處,調用函數可減少程序的大小。
? 在C++中,main()函數向操作系統返回一個整型值。因為函數的返回值類型默認是整型,所以main()函數中的關鍵字int是可選的。而如果沒有返回語句,大部分C++編譯器會提示一個警告。
? 函數原型向編譯器提供了函數的細節,比如參數的數目和類型,以及返回值的類型。? C++的引用變量使我們可以傳引用參數給函數。函數也可以返回引用變量。
? 當函數聲明為內聯時,編譯器用相應的函數代碼替換了函數調用。一般情況下,小函數才使用內聯。
? 編譯器可能會忽略函數的內聯聲明,如果函數聲明太長或過于復雜,編譯器將按常規函數編譯它。
? 當函數聲明時,C++允許我們把默認值賦給函數參數。這種情況下,我們可以無需指明所有參數,便可調用函數。默認參數總是由右到左添加。? C++中,函數的參數可聲明為常量,表示函數不可更改此變量。
? C++允許函數重載,也就是說,我們可以定義多個同名函數。通過檢查參數數目和類型編譯器會準確地匹配函數調用和函數代碼。
? C++支持兩種新的函數類型,亦即友元函數和虛函數。
? C++標準庫支持很多數學庫函數,使用它們可以完成許多數學計算。
第五章 類和對象
? 類是結構體數據類型的擴展,一個類有多個成員變量和成員函數。? 默認情況下,類的成員是私有的,而結構體的成員是公用的。
? 只有成員函數可以訪問私有數據成員和私有函數。但是類外可以訪問公用成員。? 在C++中,類變量稱為對象。利用對象并使用點操作符,我們可以訪問類的公用成員。? 我們可以在類內或類外定義成員函數。成員函數和常規函數的區別在于,成員函數的頭
部有一個隸屬標識符,以表明所屬類。
? 對象聲明時,內存空間才會分配。每一對象的成員變量空間單獨分配,而成員函數的空間則統一分配。
? 類的一個成員變量可聲明為靜態成員,一般用于維護整個類的通用值。? 靜態成員變量必須定義于類外。
? 靜態成員函數可訪問聲明在同類的靜態成員,調用靜態成員函數時需要用到類名。? C++允許我們使用對象數組。? 對象可用作函數自變量。
? 友元函數不在友元聲明類的作用域類,它可以訪問累的所有私有數據。? 函數可以返回對象。
? 如果成員函數不改變類內的任何數據,我們可以將其聲明為常量成員函數,只要在函數原型中加上關鍵詞const(聲明和定義都要加)。
? 我們也可以在函數內定義和使用類。這種類稱為局部類。
第六章構造函數和析構函數
? C++提供了一種稱為構造函數的特殊成員函數,它能幫助對象在創建時完成初始化。這一過程被稱為對象的自動初始化。? 構造函數名和類名一致。
? 構造函數通常用來初始化變量,以及分配內存。? 和常規函數一樣,構造函數也可以被重載。
? 當對象同時被創建和初始化時,復制構造函數被調用。? 我們可以聲明一個常量對象,其數據值不能改變。
? C++還提供另一種成員函數,稱為析構函數。當對象不再需要時,會調用這種函數來銷毀對象。
第七章運算符重載和類型轉換
? 運算符重載是C++的重要特性之一。又被稱為編譯時多態性。
? 使用重載特性,我們可以對兩個用戶自定義數據類型,比如說對象,執行相加的操作,使用的語法就和基本數據類型一樣。
? 我們可以重載幾乎所有C++的運算符,下面幾個是例外:
? 類成員訪問符(.,.*)。? 作用域解析符(::)。
? 大小運算符(sizeof)。? 條件運算符(?:)。
? 運算符重載是通過一種稱為運算符函數的特殊函數完成的,該函數定義了運算符的特定任務。
? 運算符重載時有一些限制。運算符函數必須是非靜態的成員函數或者友元函數。重載的運算符必須有至少一個用戶自定義類型的操作數。
? 編譯器不支持用戶自定義數據類型的自動類型轉換,我們可以使用自定義的轉換運算符函數,以實現自定義數據類型的自動類型轉換。? 轉換運算符函數應符合下列條件:
? 必須是類成員。? 必須不指定返回值。? 必須沒有參數。
第八章繼承:類的擴展
? 從舊類派生一個新類的機制被稱為繼承。繼承提供了可重用性的概念。通過繼承,C++的類可以被重用。
? 派生類繼承了基類的一部分或所有特性。? 只有一個基類的派生類被稱為單繼承。? 可從多個類繼承,這被稱為多繼承。? 可從另一派生類繼承類,這被稱為多級繼承。
? 當某類的屬性被多于一個類繼承時,這被稱為層次繼承。? 不管是在公用模式還是私有模式,類的私有成員都不可被繼承。
? 以公用模式繼承的保護成員仍為派生類的保護成員,而以私有模式繼承的保護成員,則變成派生類的私有成員。
? 友元函數和友元類的成員函數可直接訪問私有和保護數據。
? 派生類的成員函數只能直接訪問保護和公用數據。不過他們可通過基類的成員函數訪問私有數據。
? 多路繼承可能引起祖父基類的繼承成員的重復。通過將共同的基類設為虛基類,我們可以避免祖父基類成員的重復。
? 在多繼承中,基類的創建次序與他們在派生類中的聲明次序一致。? 類可包含其他類的對象。這被稱為包含關系或嵌套。