C++冷知識(1)

func()等價於func(void)

也就是說在C++中,參數列表爲空意味着不接受任何參數。之因此要注意這一點是由於在C語言中,參數列表爲空意味着參數不肯定。二者的語義是有巨大差異的,做爲學了C再學C++的人來講,是須要注意的一點。函數

void指針沒法隱式轉換爲其它類型指針

須要經過static_cast<T*>語法來顯式轉換,一樣也是跟C中的語法不一致,C語言中是容許void指針直接賦值給其它類型指針的。一個最好的體現二者區別的例子就是C和C++中對NULL宏定義的不一樣:指針

#undef NULL
#ifdef __cplusplus
    // C++
    #define NULL 0
#else
    // C
    #define NULL ((void *)0)
#endif

char不必定等於signed char

實際上,C++標準中沒有規定char類型的符號,依賴於具體的實現,這一點和其它的整型類型都不一樣。因此要使用char類型來進行小整數運算的時候最好明確指定其符號。code

const全局變量默認做用域爲當前cpp文件

爲了能在頭文件中定義const全局變量,C++規定const全局變量默認具備內部連接屬性,若要將其做用域擴大到全工程,那麼須要在定義處手動加上extern關鍵字:對象

// 這兩行全局變量定義等價
const int MAX = 233;
static cosnt int MAX = 233;

建立struct union enum對象時沒必要帶上這幾個關鍵字

在C語言中是須要帶上相應的關鍵字的,在C++中這幾種類型和class類型同樣,只須要寫類型名便可:作用域

struct Foo {
    int count;
};

// ok
Foo foo;

忽略參數的處理

有時候不須要處理函數調用傳進來的一些參數,但若是放置沒有用的參數無論可能會引發編譯警告甚至錯誤,這個時候就須要手動指定忽略參數的處理:io

// 方法一
void func(int n, int m) {
    // 忽略參數m
    (void)m;

    std::cout << n << std::endl;
}

// 方法二
void func(int n, int) {
    std::cout << n << std::endl;
}
相關文章
相關標籤/搜索