C++語言程序設計關鍵概念筆記
- 一級目錄
- 結構化程序設計
- 面向對象的方法
- 對象
- 類
- 封裝
- 繼承
- 多態
- 面向對象的軟件開發
- 信息的表示與存儲
- 信息存儲單位
- 原碼反碼補碼
- 程序開發
- 變量
- 符號常量
- sizeof
- 值傳遞與引用傳遞
- 內聯函數
- 帶默認形參的函數
- 函數重載
- 類
- 對象
- 類成員函數初始值
- 內聯成員函數
- 構造函數
- 構造函數重載:有參數和無參數
- 複製構造函數
- 析構函數
- 類組合
- 前向引用聲明
- UML語言(Unified Modeling Language)
- 結構體
- 聯合體union
- 位域
- 作用域
- 對象的生存期
- 類的靜態成員
- 類的友元friend
- 共享數據的保護
- c++ 多文件結構與編譯預處理
- 編譯預處理
- 數組
- 對象數組
- 指針
- 指針數組 數組指針
- 指針作爲函數形參
- 指針型函數 指向函數的指針
- 對象指針
- this指針
- 指向類的非靜態成員 & 靜態成員 指針
- 動態內存分配
- 被封裝的數組對象Vector
- 深複製與淺複製
- 字符數組存儲字符串
- string類(操作符、成員函數等)
一級目錄
結構化程序設計
思路:
- 自頂向下逐步求精
- 程序結構按功能劃分爲形成樹狀結構的若干基本模塊
- 各模塊功能簡單且獨立
- 模塊內部由順序、選擇和循環3種基本結構
- 模塊實現的具體方法是子程序
面向對象的方法
首先他將數據以及對數據的操作方法放在一起,作爲一個相互依存、不可分離的整體——對象。對同類型對象抽象出其共性,形成類。類中的大多數數據,只能用本類的方法進行處理。類通過一個簡單的外部接口與外界發生關係,對象與對象之間通過消息進行通信。
對象
系統用來描述客觀事物的一個實體,有一組屬性和一組行爲構成。
類
具有相同屬性和服務的一組對象的集合。
封裝
把對象的屬性和服務結合成一個獨立的系統單位,並儘可能的隱蔽對象的內部細節。
繼承
特殊類的對象擁有其一般類的全部屬性與服務,稱作特殊類對一般類的繼承。
多態
在一般類中定義的屬性或行爲,被特殊的類繼承之後,可以具有不同的數據類型或表現出不同的行爲。
面向對象的軟件開發
面向對象的軟件工程
- 分析
- 設計
- 編程
- 測試
- 維護
信息的表示與存儲
信息:控制信息、數據信息
控制信息:指令、控制字
數據信息:數值信息、非數值信息
數值信息:定點數、浮點數
非數值信息:字符數據、邏輯數據
信息存儲單位
位bit、字節byte、字word、機器字長
原碼反碼補碼
反碼:原碼符號位不變,其餘取反;補碼=反碼+1
程序開發
源碼、目標程序、翻譯程序、彙編程序、編譯程序、解釋程序
程序編輯:.cpp
程序編譯:.obj 錯誤爲語法錯
程序連接:.exe 錯誤爲連接錯
變量
一般聲明變量時完成變量定義(分配內存單元),聲明外部變量例外。
符號常量
聲明時一定要賦值
const float PI = 3.14;
const float PI;
PI = 3.14;錯誤
sizeof
計算某類型對象所佔字節數
值傳遞與引用傳遞
值傳遞: int i 實參傳形參,形參的變化不會影響實參
引用傳遞: int &i 可以認爲該形參爲實參的另一個別名,影響實參值
內聯函數
不是調用函數,而是在編譯時將函數體嵌入此部分
inline double exam()
{
return 1.5+1.5;
}
void main()
{
double a=exam();//a=1.5+1.5
}
帶默認形參的函數
有默認形參的函數必須在形參最後
int add(int x = 0, int y = 0) //正確
int add(int x = 0, int y) //錯誤
函數重載
功能相近的函數在相同的作用域以相同函數名定義,形成重載。
重載函數的形參必須不同:個數不同或者類型不同
類型不同
int add(int a, int b);
int add(flaot a, float b);
個數不同
int add(int a, int b);
int add(int a, int b, int c);
類
類的成員包括數據成員和函數成員,訪問控制屬性有三種:
公有類型(public):定義了類的外部接口
私有屬性(private):只能由本類的成員函數訪問。若定義緊跟類名,則可以省略。
保護屬性(protect):與私有屬性類似,差別在於繼承過程對產生的新類的影響。
就像沒有報時和調整時間的時鐘,沒有任何接口的類無法使用。故要設計必要的外部接口。
對象
對象所佔的內存空間只用於存放數據成員,函數成員不在每一個對象中存儲。函數代碼只佔據一份空間。
類成員函數初始值
寫在類定義裏,不可寫在類外的函數裏。
內聯成員函數
減少調用開支,提高執行效率,但是會增加編譯後的代碼長度。
分爲隱式聲明和顯式聲明
構造函數
也是類的成員函數,將對象初始化爲一個特定的狀態,與類名相同,且沒有返回值。在被構建時自動調用。
若類中定義了構造函數並且帶有形參,則實例化時必須給出初始值,否則會產生錯誤。
構造函數重載:有參數和無參數
class clock()
{
public:
clock(int a, int b, int c);
clock()
{
hour = 0;
mintue = 0;
second = 0;
}
void settime();
private:
int hour, mintue, second;
}
//其他函數省略
int main()
{
clock c1(0,0,0);
clock c2;
}
複製構造函數
public clock(clock &c) //類內
clock::clock(clock &c) //類外
{
hour=c.hour;
}
析構函數
對象消失釋放內存
public:
~clock(){}
類組合
類的組合描述就是一個類中內嵌另一個類的對象作爲成員的情況,並且在創建對象時首先被自動創建。既要對本類逇基本類型數據成員進行初始化,又要對內嵌對象進行初始化。
前向引用聲明
類a中用到類b,類b在後面定義,則對類b進行前向聲明class b;
UML語言(Unified Modeling Language)
public | private | protect |
---|---|---|
+ | - | # |
對象下面畫橫線
依賴關係、作用關係(關聯)、包含關係(聚集和組合)
註釋
結構體
c++:結構體和類相似,有數據成員、函數成員,構造函數、析構函數、可以控制訪問權限,可以繼承支持多態等。唯一區別在於結構體與類具有不同的默認訪問控制屬性:類中未指定的成員其屬性爲private;結構體中方未指定的類型爲公有類型
c++爲什麼引入結構體:保持和c的兼容性(c中結構體只有定義數據成員,不能定義函數成員;c中屬性爲公有)
c中structure一詞用來描述面向對象的抽象數據類型不貼切,加上c的struct根深蒂固,故選擇class一詞。
故一般用struct則數據成員一般都是公有屬性
聯合體union
聯合體的全部數據成員貢獻同一組內存單元,並且成員至多隻有一個是有意義的。一般存儲共有數據不定義函數
union name()
{
公有成員
protected:
保護型成員
private:
私有成員
}
位域
一種允許將類中的多個數據成員打包,從而使不同成員可以共享相同的字節機制
作用域
對象的生存期
靜態生存期 static
動態生存期
類的靜態成員
靜態數據成員
靜態函數成員
類的友元friend
提供了不同類或者對象的成員函數之間、類的成員函數與一般函數之間進行的數據共享機制。
共享數據的保護
常對象
常成員函數
常數據成員
常引用
c++ 多文件結構與編譯預處理
編譯預處理
#include
#define
#undef
#if #endif
#ifdef
#ifndef
defined
數組
數組越界錯誤
行優先存儲:每行元素是按照列下標由小到大次序存放
當數組初始化未定義值,靜態生存期的數組被賦予0;動態生存期的數組每個初始值是不確定的。
聲明爲常量的數組必須給定初值。
使用數組名作爲函數參數,傳入的是地址。對函數形參的操作直接影響到實參的相應元素。
對象數組
數組裏每個都是對象
Clock a[2];
指針
數組名稱實際就是不能被賦值的指針。
可以聲明指向常量的指針,聲明指針類型的常量
空指針
int * p;
*p = 0;
or
int * p = NULL;
把數組作爲函數形參,等價於把指向數組元素的指針作爲形參
void f(int p[]);
void f(int p[3]);
void f(int *p)
指針數組 數組指針
指針數組:數組裏每個元素都是指針
數組指針:指向數組的指針
指針作爲函數形參
指針型函數 指向函數的指針
指針函數:函數類型是指針,返回指針型結果
函數指針:指向函數的指針。存放指向函數的地址
對象指針
指向對象的指針,存放指向對象的指針地址。
this指針
用於指向正在被成員函數操作的對象
指向類的非靜態成員 & 靜態成員 指針
動態內存分配
內存泄漏:用new分配的內存必須delete加以釋放,否則會導致分配的內存無法回收,使得程序佔據的內存越來越大
被封裝的數組對象Vector
深複製與淺複製
字符數組存儲字符串
每個字符一個字節,末尾\0
char str[8]={'p','r','o','g','r','a','m','\0'};
char str[8]= "program";
char str[] = "program";