1. 程式人生 > >深入理解C++11 第二章相容性穩定性 學習筆記

深入理解C++11 第二章相容性穩定性 學習筆記

1 __func__預定義識別符號 基本功能為返回所在函式的名字 我的VS2013上試了一下,發現C++環境中貌似需要用__FUNCTION_,結果一樣 上程式碼
#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;

const char* hello(){
    return __FUNCTION__; //__func__
}

const char* world(){
    return __FUNCTION__;//__func__
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << hello() << "," << world() << endl;

    return 0;
}
函式輸出 hello world 2 C++11 標準中定義了與#pragma功能相同的操作符_Pragma 其用法與sizeof等操作符一樣 區別:_Pragma可以在巨集中展開,而#pragma不可以,_Pragma用起來更加靈活 3 C99中得到變長引數巨集定義 __VA_ARGS__ 4 C++11整型引入 long long   tips:要檢視平臺上long long型別大小可以去檢視 <limit.h> 檔案中的LLONG_MIN 和 LLONG_MAX 5 C++11規定,擴充套件的整型必須和標準的整型一樣,有符號型和無符號型佔用相同大小空間。 6 巨集__cplusplus 判斷是否為C++編譯環境 7 斷言 assert巨集 執行時斷言  可用 NDUBUG 禁用assert巨集
#include "stdafx.h"
#include <cassert>

char *ArrayAlloc(int n) {
    assert(n > 0);
    return new char[n];
}

int _tmain(int argc, _TCHAR* argv[])
{
    char* a = ArrayAlloc(0);

    return 0;
}
8 C++11 新引入的static_assert 編譯期斷言  接收兩個引數,第一個引數為斷言表示式,第二個為編碼者自定義的警告資訊。 注:static_assert斷言表示式的結果必須是在編譯時期可以計算的表示式,即必須是常量表達式。 9 異常 C++11中不再使用 throw(...) {...}, 被新的noexcept異常宣告取代 noexcept 表示其修飾的函式不會丟擲異常,如果noxcept修飾的函式丟擲了異常,編譯期會直接呼叫std::terminate() 來終止程式執行。寫法為: void fun() noexcept; void fun() noexcept(常量表達式); 示例程式碼:
#include "stdafx.h"
#include <iostream>
using namespace std;

void Throw(){
    throw 1;
}

void NoBlockThrow(){
    Throw();
}

void BlockThrow() noexcept {
    Throw();
}

int _tmain(int argc, _TCHAR* argv[])
{
    try {
        Throw();
    } 
    catch (...) {
        cout << "Found Throw" << endl;
    }

    try {
        NoBlockThrow();
    }
    catch (...) {
        cout << " Throw is not blocked" << endl;
    }

    try {
        BlockThrow();
    }
    catch (...) {
        cout << "Found Throw 1" << endl;
    }

    return 0;
}
noexcept作為操作符時可用於template template<class T> void fun() noexcept(noexcept (T())) {} 這裡面的第二個noexcept為操作符,意義為 fun是否為一個noexcept函式將由T是否為一個noexcept函式決定。 10 非靜態成員的sizeof 在C++11中,對非靜態成員使用sizeof 是合法的。 11 擴充套件friend語法 在C++11中,宣告一個類為另一個類的友元時,不再需要使用class關鍵字。 這使得為類模板宣告友元成為可能。 12 C++11 新增using定義類型別名 作用與typedef一樣。 13 final/override 控制 C++中有一個特點,就是基類宣告為virtual的函式,之後的過載版本都不需要再宣告該函式為virtual.(這條特性有利有弊啊) override: 如果派生類在虛擬函式宣告時使用了override描述符,那麼該函式必須過載其基類中的同名函式,否則程式碼無法編譯通過。(override用來做輔助檢查工作的) 14模板函式的預設模板引數 在C++11中模板和函式一樣,可以有預設引數了。 類模板在為多個預設引數指定預設值得時候需要“從右往左”,函式模板不需要。 15 外部模板 template<typename T>void  fun(T) {} extern template void fun<int>(int); C++11 引入此特性的目的是減輕編譯器壓力,減少冗餘程式碼。
16 C++11中不再對區域性和匿名型別做模板實參加限制。 在C/C++中,即使是匿名型別的宣告,也需要獨立的表示式語句。