C++編程規範和編譯過程詳解

前言:由於c++基礎打得不牢,因此準備花點時間再學一下c++的基礎知識,主要是看網易雲課堂裏面的免費課程,把一些知識點作個筆記記下來。ios

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~c++

1:編程規範編程

1        頭文件瀏覽器

1.1    使用頭文件保護
使用#define進行頭文件保護,而不使用微軟的#pragma once。
爲了保證惟一性,頭文件保護的命名須要基於項目代碼路徑,好比Project\Src\Area\File.h 則文件的保護應該像這樣:
#ifndefine         PROJECT_SRC_AREA_FILE_H
#define              PROJECT_SRC_AREA_FILE_H
…
#endif

 1.2    頭文件依賴安全

使用前置聲明減小頭文件的所要包含的文件數量,也就減小了須要從新編譯文件的概率。
對於須要在頭文件裏使用其餘文件中定義的類時,若是隻是使用類的聲明而不是具體定義,應該是用前置聲明代替包含整個文件,以下:
使用class SomeClass;
不使用 #include 「SomeClass」。
 
1.3    包含頭文件的順序
順序以下:C庫、C++庫、其餘庫.h、項目內的.h,若是次文件是cpp文件,那麼要首先包含其對應的頭文件,而後再按前述順序。每一個層級用空行分隔,同一層級的文件順序按英文字母前後順序排列,以下:
#include「MyFile.h」  (若是次文件是cpp文件,首先包含本身的頭文件)
 
#include<stdio.h>
#include<unistd.h>
 
#include<iostream>
#include<map>
#include<string>
 
#include「lib/Alpha.h」
#include「lib/Beta.h」
#include「other/zoo.h」
 
#include「bar.h」
#include「foo.h」

 2        做用域多線程

2.1    全局變量
儘可能不要使用全局變量,根據經驗,全局變量起的做用每每僅是一個靜態變量。若是非要使用全局變量,考慮使用單例模式代替。
多線程中使用的全局變量,不要使用class類型(包括STL容器),避免class內部的實現非線程安全而致使bug。
 
3        類
3.1    聲明順序
成員前後順序:typedef、enum、常量、構造析構函數、成員函數,成員變量。
域前後順序:public、protected、private。
 
好比:
Class MyClass
{
public:
        
public:
         voidFoo();
 
protected:
         voidBar();
 
private:
         voidFunc();
 
public:
         intm_nCommonVar;
 
private:
         intm_nMyVar;
};

3.2    構造函數函數

構造函數只負責簡單的初始化功能,若是須要進行有意義的初始化,請使用Init()函數。
*嚴禁在構造函數中調用虛函數。
 
3.3    拷貝構造函數
僅須要拷貝一個對象時才定義拷貝構造函數,不然明確在private域中使用聲明DISALLOW_COPY_AND_ASSIGN,避免編譯器隱式聲明的拷貝構造函數致使的不肯定行爲。以下:
private:
DISALLOW_COPY_AND_ASSIGN(MyClass);

3.4    結構體和類編碼

只有數據時,使用結構體,不然使用類。
 
3.5    繼承
儘可能使用組合代替繼承。
若是類中有一個virtual函數,則析構函數必須聲明爲virtual。
全部繼承必須爲public,私有繼承使用其它實現方式替代。
 
3.6    多重繼承
儘可能避免使用多重繼承,除非是COM。
 
3.7    模板
儘可能不要使用模板,肯定使用模板時確保一年後回頭你還能看懂你的代碼,而且調試這段模板無壓力。
 
3.8    操做符重載
儘可能避免使用操做符重載。
 
4        其它特性
4.1    異常處理
不要使用異常處理。
 
4.2    RTTI(運行時類型識別)
不要使用RTTI,也就是dynamic_cast,非要使用只能說明設計有缺陷。
緣由:dynamic_cast會失敗,並且不安全,難維護。
 
4.3    前置自增和自減
不考慮結果使用的狀況下,儘可能使用++i代替i++,由於++i效率更高。
 
4.4    const使用
儘可能使用const修飾變量。                                                    
 
5        註釋
5.1    頭文件註釋
頭文件開頭部分必須使用註釋,說明此文件的做者、做用等信息。
便可證實你有多叼,也可以讓後人叼你。
格式以下:
/************************************************************************
*
* @description: XLBrowserAppSupport的Lua接口封裝
*
* @author:      Gaoyunxiang
* @date:        2015.11.10
*
* @last modified author:
* @last modified date:
*
* @ copyright Xunlei Network 2015 -
*
*************************************************************************/

5.2    類註釋spa

聲明類以前須要使用類註釋,說明此類的使用用途及注意事項
以下:
// 瀏覽器類。
// 實現瀏覽器的經常使用功能,如導航等。
// 需由瀏覽器工廠類來建立實例。
class Browser{};

 

5.3    函數註釋
重要或難理解的函數,須要在函數聲明前加上註釋。
好比:
// 作加法
// nVar1:第一個加數
// nVar2:第二個加數
// 返回值:相加結果
int Add(int nVar1, int nVar2);

  

5.4    邏輯註釋線程

對於很難理解、重要、實現精彩的部分必須加上註釋。
 
5.5    TODO註釋
對於那些來不及實現、暫未實現、須要去實現的地方加上TODO註釋。
以下:
// TODO: Fly to the moon.
 
6        編碼風格
6.1    命名規則
儘可能不要使用縮寫,嚴禁使用不明單詞的縮寫。
類名:大寫字母開頭,每一個單詞首字母大寫。
函數名:大寫字母開頭,每一個單詞首字母大寫
變量名:首字母(一般爲前綴)小寫,用下劃線分割
 
6.2    變量前綴
前綴爲小寫,後面第一個字母爲大寫
前綴的結尾爲_時(如m_..),後面第一個字母爲小寫
short/int/size_t..,加n,如int nVal =1;
long,加l
float/double..,加f
bool/BOOL..,加b
DWORD,加dw
char*,加sz,如char *szVal= 「abc」;
wchar_t*,加wsz
string,加str
wstring,加wstr
指針,加p
long指針,加lp
函數指針,加pfunc
vector,加vec
list,加list
map,加map
句柄類,加h
類成員變量,加m_,如HWND m_hParentWnd= 0x66666666;
全局變量,加g_
靜態變量,加s_
常量,所有字母大寫
類名,加C
 
6.3    縮進和換行
使用空格代替table,在VS裏將table設置成4個空格。每一個級別進行4個空格的縮進。
不要連續使用多於一次的換行。
 
6.4    花括號
另起一行使用。
 
6.5    條件、循環、開關等語句
關鍵字後面加空格再使用。
好比:
If ();
while ();
switch語句後的case:部分加做用域{}。
7        其它注意事項
7.1    堆分配和釋放
new/delete等堆操做,必須成對出現。
儘可能聽從誰分配誰釋放的原則。
 
7.2    引用計數
AddRef()/Release()必須成對出現。
儘可能聽從誰分配誰釋放的原則。
 
7.3    指針、句柄使用完釋放後必須設置成NULL。
7.4    函數功能要單一,避免耦合多功能,嚴禁CreateAndNavigate這種函數。
7.5    指針的空值比較使用NULL,而不是0。
7.6    浮點數的零值比較嚴禁使用== 0。
7.7    避免直接使用微軟二次定義的數據類型,好比DWORD,使用其原始的unsigned long,方便跨平臺。
 
2:C++的編譯和執行

流程圖以下: 

 

 從.cpp文件到.exe文件能夠用   g++ -o  HelloWorld  HelloWorld.cpp 一步到位生成HelloWorld.exe可執行文件。下面圖是整個過程按照上圖的拆分,瞭解一下便可。

 

 

 3:課程做業

 

 

 

 1 /*
 2  *  文件名: Charpter2
 3  *  描  述: 輸出寒冰射手.艾希的詳細信息
 4  *  做  者:劉雷
 5  *  時  間:2019/10/9
 6  *  版  權:version 1.0
 7  */
 8 #include <iostream>
 9 
10 using namespace std;
11 
12 int main()
13 {
14     cout << "名稱:寒冰射手.艾希" << endl;
15     cout << "傷害:56\t\t攻擊距離:600" << endl;
16     cout << "護甲:15.5(+3.4)\t魔抗:30(+0.0)\n"
17          << "生命值:395(+79)\t生命回覆:0.9(+0.11)\n"
18          << "法力值:280(+32)\t法力回覆:1.26(+0.08)\n"
19          << "移速: 325\t\t" << "定位:ADC 輔助\n"
20          << "點券:450" << endl;
21     return 0;
22 }

相關文章
相關標籤/搜索