1. 程式人生 > >【C++】常見關鍵字的使用場景及用法

【C++】常見關鍵字的使用場景及用法

自動變數型別

int,float,double,short,char,bool(參考基本資料長度格式化輸出

 

STL資料型別

string:字串操作,可以通過下標訪問某個字元。

listsetmap:都有點像連結串列,不可以通過下標直接訪問。

vector:陣列功能的擴充套件,可以通過下標來訪問物件。

 

include和extern

include:#include <stdio.h>包含標頭檔案,就相當於把這個標頭檔案中所有內容都copy到原始檔中

extern:從某個檔案中匯入某個函式或變數

 

struct和union

struct:結構體,每個變數都會被分配不同的記憶體空間。

union:共享記憶體,就是幾個變數都能訪問同一段記憶體。

 

const和static

const:他是封禁的作用,主要分封禁地址和封禁星號。

static:它修飾的變數或函式表明只能被初始化一次,然後其他所有人都共用這段記憶體的內容。

 

define和typedef的異同

define:#define INTPTR1 int* 沒什麼坑,但一般用於定義別名和常量

typedef:typedef int* INTPTR2有很多坑,特別是指標的別名時,別想當然,最好自己測試下。

 

class

用於申明一個類,下面是類中出現的關鍵字:

(1)private,只能自己訪問

(2)protected,子類可以訪問

(3)public,所有可以訪問

(4)friend,你是我朋友,你能訪問我所有的

(5)單冒號:(a)繼承;(b)初始化

(6)父類指標指向子類物件:雖然父類和子類都被編譯,但父類指標只能訪問父類自己的內容,子類你可訪問不了。

父類指標最多隻能呼叫子類對父類中重寫的函式:但是你如果想訪問使用父類指標來訪問子類中的函式,可以在父類中宣告與子類命名引數完全相同的函式,並在函式前使用virtual修飾符,那麼就可以呼叫子類中被重寫的函數了。

(7)構造:類中使用,一般不需要自己定義,但如果有功能需要實現就可以自定義。

(8)析構:類中使用,一般不需要自己定義,但如果在類中使用了new或malloc來申請堆記憶體,那麼在析構的時候一定要delete或free。(new,delete;malloc,free這2組都是用來申請堆記憶體)

析構有時需要加virtual:因為如果你定義了一個父類指標指向子類物件,那麼在析構的時候你改呼叫子類的解構函式還是父類的解構函式?不管呼叫哪個都有可能造成記憶體釋放不完全。所以就需要在父類的解構函式前加上virtual修飾符,這樣他就會將父類和子類都析構。

(9)純虛擬函式(virtual):被用來規範介面的,就是在一個純虛類中只申明實現功能,其他類自己去實現這個功能,最後通過純虛類將實現功能整合到一起。

(10)拷貝建構函式:拷貝構造使用格式固定,一般不用自己寫,除非需要拷貝指標。

 

雙冒號

作用域的限定,具體可分為

(1)::a,前面直接加雙冒號表示全域性變數;

(2)類的成員函式或成員變數的訪問

class Mytest()
{
public:
    void Test();
};

void Mytest::Test()
{
    printf("Test.\n");
}

(3)名稱空間(涉及關鍵字namespace和using),比如std::cout等

(4)靜態型別函式和型別變數的訪問

class Mytest()
{
public:
    static int a;
}

Mytest::a = 3;

 

函式模板和類模板

函式模板

template <typename T>
T findmax (T arr[], int len)
{
    T val = arr[0];
    ...
}

類模板

template <typename T>
class MyTest()
{
public:
    T Sum(T a, T b)
    {
        return a+b;
    }
};

 

宣告類在被使用在定義之前

這個宣告,有時稱為前向宣告(forward declaraton),在宣告之後、定義之前,類A是一個不完全型別(incompete type),即已知A是一個型別,但不知道包含哪些成員。
不完全型別(incomplete type)只能以有限方式使用。不能定義該型別的物件。不完全型別只能用於定義指向該型別的指標及引用,或者用於宣告(而不是定義)使用該型別作為形參型別或返回型別的函式。