C++二十三點全面總結

文章導讀:
一、進制
二、整數定義,賦值,初始化
三、標識符原則
四、13種基本數據類型
五、運算符
六、 字面常量 (123) 符號常量(const修飾的變量)
七、隱式類型轉換
八、分支
九、循環
十、數組
十一、指針
十二、多文件
十三、函數
十四、全局變量、局部變量、static
十五、結構體
十六、堆內存
十七、順序表vector
十八、鏈表
十九、庫函數
二十、文件操作相關
二十一、BMP位圖
二十二、EXE文件生成過程
二十三、類(class)

一、進制:
主要以二(計算技術中廣泛採用的一種數制)、十、十六進制爲主

二、整數定義,賦值,初始化
int a;
a = 2;
int b = 1;

三、標識符原則
由字母、下劃線、數字組成;可以使用中文;區分大小寫;
不能使用關鍵字;只能有字母、下劃線開頭;注意望文生義;

四、13種基本數據類型
類型 佔位 取值
bool 1 true false
char 1 -128~127
unsigned char 1 0~255
wchar_t 2 0~65536
short 2 -32738~32737
unsigned short 2 0~65536
int 4 -21億~21億左右
unsigned int 4 0~42億左右
long (32位下和int一樣)
unsigned long(32位下和int一樣)
float 4 (如3.14f)
double 8 (如2.111)
long double (32位下和double一樣)

五、運算符
1算數 ±*/%
2賦值 =
3取字節 sizeof()
4關係 > < >= <= != ==
5邏輯 || && !
6位 >> << ^ ~ & |
7條件 ? :
8自增自減 前置++ 後置++ 前置-- 後置–
9自賦值 += -= *=
10 * 接引用 *p
11::作用域
12& 取地址 也做引用:取別名
13 .點運算符,結構體或類值對象引出內部成員
14 ->地址引出,結構體或類指針對象引出內部成員
15 ,逗號運算符
17 []下標
16自定義等

六、 字面常量 (123) 符號常量(const修飾的變量)
複合數據類型的字面常量
Student(1);
複合數據類型的常量
1)字面常量
2)符號常量

七、隱式類型轉換 前提是參與運算
(1)比大小原則:字節不同,字節大的大;字節相同,精度高的大,無符號大於有符號
(2)參與運算:所有元素不超過int,全部轉爲int再計算,結果爲int;
//最大元素超過int,全部轉爲最大元素類型再計算,結果爲最大元素類型
(3)賦值運算:等號右邊的表達式類型轉化爲等號左邊類型,再參與運算,結果爲左邊類型

八、分支
(1)if else if else
注意:如果在if、esle後有多條語句,則必須用花括號將這些語句括起來,否則只有後跟的第1條語句有效。
if語句中的條件表達式一般爲關係表達式或邏輯表達式,也可以是任意的數值類型。
else總是和離它最近的還沒有配對的可見的if匹配。

浮點數的相等判定 if(a > 0.001f && a < 0.01f)
變量和常量的相等判斷 if(1 == a)
(2)switch case default
注意:switch括號中的表達式只能是整型、字符型枚舉型或布爾型;且case後面的常量表達式的類型必須與其匹配。
以case中的常量表達式值爲入口標號,由此開始順序執行。因此,每個case分支最後應該加break語句。沒有break繼續執行後面的case語句。
case值是語句標號,每個case常量表達式的值必須互不相同。
default語句是可選的(爲了規範,建議寫上)。

九、循環
(1)for(;;)
這裏運用到冒泡算法中就是兩個for循環嵌套
for(int i = Len - 1;i > 0; --i)
{
//由於是升序,希望把大的數據移動到後面
//如果前面數據比較大,那麼需要交換數據
for(int j = 0;j < i; ++j)
{
if(Data[j] > Data[j + 1])
{
int t = Data[j];
Data[j] = Data[j + 1];
Data[j + 1] = t;
}
}
}
(2)while(結果爲bool數據類型的表達式)
一般用於遊戲循環
(3)do{}while(結果爲bool數據類型的表達式)
一般用於輸入時候的判斷
(4)循環中有很多控制語句:break跳出循環、continue結束本次循環

十、數組:
將同一種數據類型的數據按照一定形式有序的組織起來的集合,一個數組有一個統一的數組名字,可以通過這個名字和下標確定數組中的每一個元素
數據類型 數組名[常亮表達式]
注意:下標越界使用。
1)三種定義初始化方式
1.int a[3] = {1,2,3};
2.int b[4] = {1,2};
3.int c[] = {5,6,7,8,9};
2)字符數組:和普通數組無區別
用作字符串時,會在字符串後面添加一個結束符’\0’;
關於字符串的函數有:
strlen(字符數組名) 計算字符數組的長度,不包括結束符
strcat(字符數組名1,字符數組名2) 兩個字符串的連接,連接點爲1的結束符位置
strcmp(字符數組名1,字符數組名2) 兩個字符串的比較,按照字典法挨個字符比較,>返回1,<返回-1,=返回0
strcpy(字符數組名1,字符數組名2) 字符串的拷貝,將2複製到1,前提是1的空間滿足2

十一、指針
專門存放地址的變量,是一種數據類型
數據類型 * 變量名
int * p; //在內存中連續開闢4個字節的內存空間,取名爲p,這段內存中只能存儲(int )類型地址編碼
注意:1)不同數據類型之間不可以賦值,但可以通過強制轉換做到
2)當指針不再使用的時候,一定要歸零,及時歸零可以杜絕野指針的出現
地址:數組名、字符串常量、指針表示的內容、&+變量、函數名
地址的運算(非void類型):1)與整數的±法
2)解引用
,可以得到該指針指向的內容
3)下標

十二、多文件
多個.cpp、.h文件在同一工程下
注意:最好是.cpp、.h文件名一一對應,cpp下寫定義,h下寫聲明(要注意結構體和類)
用到.h只需要聲明一下就好,#include “a.h”

十三、函數
實現特定功能的程序模塊
注意:使用時前面必須有定義或者聲明。
函數類型 函數名()
{
內容
}
int f1(int a,int b = 1)
{
return a++;
}
函數的要素
(一)函數返回值類型
(二)函數名
(三)函數形參列表
(四)函數體

(一)函數返回值類型
1)void類型:這個函數沒有結果,不需要返回。
函數結束的方式:
a,自然結束,執行完函數體,自然結束
b, return結束,!!!return後不允許添加任何表達式,直接分號結束
return的含義是:退出函數
2)非void類型:void*是非void類型,執行完函數之後,這個函數是有
結果的,結果是當前的類型,函數的結束形式只有一種,
return + 結果爲當前類型的表達式(或者結果能隱式類型轉換的表達式)
所有路徑都有返回值。

(二)函數名
1)滿足標識符原則
2)函數在指令內存區的首地址。

(三)函數形參列表
a)空函數形參列表:()函數形參列表爲空,在函數調用的時候,不添加任何參數
()不能缺省,調用方式:函數名();
b)非空函數形參列表
1)單個參數:和普通變量的定義模式一樣。
2)多個個參數:多個形參之間,用逗號間隔。
3)這個參數當前並沒有結果,只有在調用的時候纔有結果,因此這個參數
叫做形參。
4)形參的值是可以發生改變的,因此這個參數必然是變量(內存)
5)形參是在調用的瞬間分配內存,函數結束的時候釋放內存。
6)函數調用的時候,填寫的數值是實際的參數,叫做實參。
7)實參的要求:可以是變量,可以是表達式。
實參和形參之間要求:相同的類型,相同個數,相同的順序。
實參和形參之間是一一對應初始化,如果實參是變量,那麼實參和形參
之間是不同的變量
8)如果實參是表達式,則需要計算結果之後再進行初始化。
9)函數的調用 :函數名(實參);多個實參之間用逗號間隔
(四)函數體
(五)遞歸函數:直接或者間接調用自己的函數:問題描述清楚、代碼可讀性強、結構精簡;但運行效率低,必須有終止條件,能不用就不用遞歸
(六)函數重載:多個函數具有相同的函數名,但參數類型或者參數個數不同,函數返回值類型不作爲區分重載條件

十四、全局變量、局部變量、static
1)全局變量:寫在所有函數之外的變量;在靜態內存區;在主函數運行之前分配內存;在主函數結束之後釋放內存;默認初始化爲零,可以手動 初始化;可讀可寫;變量在使用之前必須定義,或者用extern聲明
2)局部變量:寫在所有函數之內的變量;在棧內存區;執行其定義語句時分配內存;在其所在函數結束時釋放內存;使用時必須有值,可讀可寫;
3)static:1.修飾變量:
static修飾的靜態局部變量只執行初始化一次,直到程序運行結束後才釋放;
static修飾全局變量的時候,這個全局變量只能在本文件中訪問,不能在其它文件中訪問,即便是extern外部聲明也不可以;
static修飾一個函數,則這個函數的只能在本文件中調用,不能被其他文件調用。Static修飾的變量存放在全局數據區的靜態變量區,包括全局靜態變量和局部靜態變量,都在全局數據區分配內存。初始化的時候自動初始化爲0。
4)const關鍵字在C++語言中的作用
可以定義符號常量、常量指針、指針常量,還可以可以修飾函數的參數、返回值,被const修飾的東西都受到強制保護只能進行讀操作不能進行寫操作,可以預防意外的修改數據從而提高程序的健壯性

十五、結構體
是由一系列具有相同類型或不同類型的數據元素構成的數據集合,是一種複合數據類型,元素
也成結構體成員,可以通過.或者->訪問,且每個成員的訪問權限都是默認public
結構體的大小與內存對齊:
1)默認對其方式:VC規定各成員變量存放的起始地址相對於結構的起始地址的偏移量必須爲該變量的類型所佔用的字節數的倍數。
struct MyStruct
{
double dda1;
char dda;
int type;
}; //佔16個字節:8+1+3+4
struct MyStruct1
{
char dda1;
double dda;
int type;
}; //佔24個字節:1+7+8+4+4
2)強制對齊方式:按照pragmapack(n)中的n倍數對齊
#pragmapack(push)//保存對齊狀態
#pragmapack(4)//設定爲4字節對齊
struct test
{
char m1;
double m2;
int m3;
};
#pragmapack(pop)//恢復對齊狀態
//佔16個字節:4+8+4
3)結構體對象的初始化方式
struct MyData
{
//成員變量
int ID;
char Name[64];
char *p;
};
1.成員變量賦值
MyData student;
student.ID = 0;
memcpy(student.Name,“How”,sizeof(“How”));
student.p = NULL;
2.對象賦值
MyData student1;
student1 = student;
3.對象初始化
MyData student4 = student1;
4)結構體聲明
//結構體去掉定義部分,用;結束
//只能定義指針,不能定義對象

十六、堆內存
malloc():動態內存分配,用於在堆內存中申請一塊連續的指定大小的內存塊區域以void*類型返回分配的內存區域地址
new:是一個運算符,調用的是malloc

十七、順序表vector
其實就是一個動態的數組,內存連續,包含了很多的數組操作,使用時包含頭文件#include
std::vector<類型> 表名

十八、鏈表(單向鏈表,循環鏈表)
非連續、非順序的存儲結構,數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的;由一系列結點(鏈表中每一個元素稱爲結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。
使用時包含頭文件#include
std::list<類型> 表名
單鏈表和循環鏈表的去區別在於,尾指針與頭指針是否連接

十九、庫函數
1)字符串相關
size_t strlen(const char *str);
//字符串拷貝,把字符串拷貝到strDestination中
char *strcpy(char *strDestination, const char *strSource );
//字符串連接是以字符串的零作爲參考的。
//字符串連接,把字符串strSource連接到strDestination
char *strcat(char *strDestination,const char *strSource );
//字符串比大小,1:string1 > string2 -1:< 0:==
//字典比大小法
int strcmp( const char *string1, const char *string2 );
//KMP
//查找strSearch在字符串str中首次出現的位置,返回這個位置的地址
char *strstr(const char *str,const char *strSearch );
//如果找不到,返回零
//查找字符strSearch在字符串str中首次出現的位置,返回這個位置的地址
char *strchr(const char *str,int c );
//字符串轉換爲整數
int atoi( const char *_Str);
//整數轉字符串
char * itoa(int _Val,char * _DstBuf, int _Radix);
//格式化字符串
int sprintf(char *buffer,const char *format [,argument] … );//替換模式:%d:整數替換;%s:字符串替換;%f:浮點數替換;%c:字符替換;%p:地址替換

2)數學函數
//需要頭文件 math.h cmath
//三角函數
//正弦:sin
//餘弦:cos
//正切:tan
//絕對值:abs
//算數平方根:sqrt

3)時間函數
time_t time(time_t * _Time);
//格林威治時間1970年1月1日零點零分零秒到當前計算機時間所經歷的秒數
std::cout<< time(NULL)<<std::endl;
時常用於隨機函數調用時給出隨機種子

4)內存相關函數
//內存拷貝函數:把以src首地址的count個字節數據,拷貝到dest
void *memcpy( void *dest,const void *src,size_t count);

二十、文件操作相關
//文件結構體,主要用於和硬盤的中的文件建立聯繫
FILE * fp;
//errno_t fopen_s( FILE** pFile, const char *filename, const char *mode );
//建立讀模式
fopen_s(&fp,“cat.bmp”,“rb”);
if(NULL == fp)
{
std::cout<<“文件名不存在,或者路徑錯誤!”;
system(“pause”);
return;
}

//查找數據個數
//移動文件讀寫指針位置的函數
//SEEK_CUR 文件的當前位置
//SEEK_END 文件結尾
//SEEK_SET 文件開頭
//int fseek( 
//	FILE *stream, 文件指針
//	long offset,  位置偏移
//	int origin ); 具體位置

//把文件讀寫指針移動到文件尾。
fseek(fp,0,SEEK_END);

//獲取文件頭到文件讀寫指針之間間隔的空間字節數。
int ft =  ftell(fp);

//重置文件讀寫指針到文件頭
rewind(fp);
//fseek(fp,0,SEEK_SET);

//爲讀出的文件內容,提供存儲內存
void * p = malloc(ft);
fread(p,1,ft,fp);
//關閉文件
fclose(fp);
fp = NULL;
//釋放堆
free(p);

**二十一、BMP位圖:**位圖文件頭結構體、位圖信息頭結構體、位圖顏色區
1)位圖文件頭結構體 BITMAPFILEHEADER
struct BITMAPFILEHEADER
{
WORD bfType; 位圖文件類型,BMP位圖標誌
DWORD bfSize; 一個特殊值,bitmap file的大小,整個文件的字節數
WORD bfReserved1; 保留字節,一般爲零
WORD bfReserved2; 保留字節,一般爲零
DWORD bfOffBits; 文件頭和信息頭的大小
}
2)位圖信息頭結構體 BITMAPINFOHEADER
struct BITMAPINFOHEADER {
DWORD biSize; 文件信息頭的大小
LONG biWidth; 文件的像素寬(並非實際寬度)
LONG biHeight; 文件的像素高
WORD biPlanes; 調色板模式,老版本調色模式,當前已經不使用,要求設置爲1
WORD biBitCount 表示顏色的位數 24位真彩色
DWORD biCompression;//是否壓縮,不壓縮
DWORD biSizeImage; //設置爲零
LONG biXPelsPerMeter; //後邊的參數和外設相關
LONG biYPelsPerMeter; //如果不打印,一律爲零
DWORD biClrUsed;
DWORD biClrImportant;
}
3)顏色區 剩下的是由8位2進制數組成的顏色數據
注意:biWidth;文件的像素寬並非實際寬度需要進行處理
int W = biWidth;
int BitW = 3 * W;
if(BitW % 4 != 0)
{
BitW += 4 - BitW % 4;
}

二十二、EXE文件生成過程
(一)預編譯階段
預編譯指令起作用階段,宏起作用的階段,在文本文檔中,進行相應的文本替換,主要是.h文件的替換。所有的.h文件並不參與編譯,
僅僅是在文件替換,之後才參與編譯。因此.h文件是否在工程中,並不重要,只需要在指定的位置即可,.h是文本文檔,其實所有的文本文檔格式的文件,都可作爲.h文件使用。
(二)編譯階段
所有的cpp文件進行獨立編譯,生成和文件名相同的.obj文件所有函數的定義,全局變量的定義;
正確編譯的條件:
a)訪問變量之前,必須有其聲明或者定義,注意:.cpp文件是單獨編譯
b)相同作用範圍內存,定義的標識符不允許重複出現。
(三)鏈接階段
所有執行過程中生成的.obj,以及外部提供的.lib dll文件,這些文件鏈接起來,生成exe文件
鏈接成功的前提:
1)在訪問變量或者函數的時候,在所有obj,lib,dll,中找到定義即可
2)相同作用範圍內存,定義的標識符不允許重複出現。

庫文件的分類
1)由操作系統提供的庫,叫做第一方庫文件
2)由編譯環境提供的庫,叫做第二方庫文件
3)由其它程序員直接或間接提供的庫,叫做第三方庫文件。
一般來說,需要手動導入的庫文件,都是第三方庫。

二十三、類(class):封裝,繼承,多態
(一)成員訪問:三種訪問權限
公有的 受保護的 私有的
public protected private
公有訪問權限:該成員可以在外部被對象訪問
受保護的 私有的:外部對象或地址是無法訪問的。但是類內部普通成員函數不受限制,隨意訪問,訪問時系統一般會自動添加一個this指針

static在C++範圍內的使用方法
1)修飾成員變量:不是定義,是個聲明,在使用之前必須在cpp中實現定義,定義模式:數據類型 類名 :: 成員變量名,默認初始化爲零;
靜態成員變量是屬於類的,不屬於對象的,所有的類對象共用一段內存,即使沒有類對象,這段內存也是存在的;
訪問方式有三個 a)對象引出 b)地址引出 c)作用域引出
2)修飾成員函數:被static修飾的成員函數系統將不在提供this指針,靜態成員函數可以調用靜態成員變量或者函數,但是由於沒有this指針, 無法調用普通成員變量或者函數;
普通函數可以調用所有普通成員變量或者普通成員函數
常常利用這個static在類中的特別作用運用於單例的設計模式:該類無論定義了多少對象,所有對象共用一段內存,保證數據單一性,對象可以隨時銷燬。實現單件的前提,不能隨意定義對象,但是可以定義指針。

(二)四大函數:構造、析構、同類賦值構造、拷貝構造函數
class MyData
{
public:
1)構造:一般爲類對象初始化
MyData(){}
2)析構:一般用於類對象的釋放
~MyData(){}
3)同類賦值構造:對=運算符的重載
MyData & operator = (const MyData &that){}
4)拷貝構造:帶參構造
MyData(const MyData &that){}

(三)繼承:使一個類可以從現有的類中派生,而不必定義一個新類,其實就是利用已有的數據類型創建新的數據類型,並保留已有數據類型的
特點,以舊類爲基礎創建新類,新類包括舊類的成員,並且可以添加新的成員,舊類即爲父類,新類即爲派生類或子類
class 子類名 :[繼承方式] 父類名

(四)多態:實現將不同數據類型統一管理
函數前如果添加virtual,那麼這個函數叫做虛函數,如果類中有virtual修飾的函數,那麼系統將會提供一個虛函數表的指針。
pVirtual這個表存儲了所有被virtual修飾函數的地址,利用這個表則可以實現多態
子類對象可以對父類對象賦值,反之不可以。子類地址可以給父類指針賦值。子類引用可以給父類引用賦值。
實現多態的前提:1)有繼承 2)有指針

函數的調用關係
1)在多態(父類指針指向子類對象)的時候,調用的函數取決於對象
2)在非多態的情況之下,取決於調用者的類型

核心應用:不同的數據類型放在一起統一管理。多態強調的不是效率,是管理!!!
虛析構,子類強制重寫析構,保證內存釋放徹底。

(五)友元函數:讓特定的函數或者別的類的所有成員函數隊私有數據成員進行讀寫。本質就是破壞了類的封裝性。

【生成動態庫DLL】
(1)新建項目–動態庫–添加cpp(包含對應頭文件,#include “stdafx.h”,自己想要的函數,類等)
—添加對應頭文件(__declspec(dllexport) void fun();)fun爲想要輸出的函數----生成解決方案,Debug生成了dll和lib文件
()在另一個文件下,添加對應頭文件,並且修改爲(__declspec(dllimport) void fun()?----資源文件中添加lib,Debug下添加dll,即可使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章