天天看點

基礎知識(2)

1、c++11新特性:

  • “文法糖”:​

    ​nullptr​

    ​, ​

    ​auto​

    ​自動類型推導,範圍for循環,初始化清單, lambda表達式等
  • 右值引用和移動語義
  • 智能指針
  • C++11多線程程式設計:​

    ​thread​

    ​庫及其相配套的同步原語​

    ​mutex​

    ​lock_guard​

    ​condition_variable​

    ​, 以及異步​

    ​std::furture​

(1)auto:auto聲明的變量必須要初始化,否則編譯器不能判斷變量的類型。auto不能被聲明為傳回值,auto不能作為形參,auto不能被修飾為模闆參數。關于效率: auto實際上實在編譯時對變量進行了類型推導,是以不會對程式的運作效率造成不良影響。另外,auto并不會影響編譯速度,因為編譯時本來也要右側推導然後判斷與左側是否比對。

(2)lambda表達式是匿名函數,可以認為是一個可執行體functor,文法規則如下:

[捕獲區](參數區){代碼區};
auto add = [](int a, int b) {return a + b};      

(3)右值引用是C++11新特性,它實作了轉移語義和完美轉發,主要目的有兩個方面:消除兩個對象互動時不必要的對象拷貝,節省運算存儲資源,提高效率;能夠更簡潔明确地定義泛型函數。C++中的變量要麼是左值、要麼是右值。通俗的左值定義指的是非臨時變量,而左值指的是臨時對象。左值引用的符号是一個&,右值引用是兩個&&

(4)移動語義:轉移語義可以将資源(堆、系統對象等)從一個對象轉移到另一個對象,這樣可以減少不必要的臨時對象的建立、拷貝及銷毀。

(5)智能指針:為防止記憶體洩露等問題,用一個對象來管理野指針,使得在該對象構造時獲得該指針管理權,析構時自動釋放(delete).

  • shared_ptr,基于引用計數的智能指針,會統計目前有多少個對象同時擁有該内部指針;當引用計數降為0時,自動釋放
  • weak_ptr,基于引用計數的智能指針在面對循環引用的問題将無能為力,是以C++11還引入weak_ptr與之配套使用,weak_ptr隻引用,不計數
  • unique_ptr: 遵循獨占語義的智能指針,在任何時間點,資源智能唯一地被一個unique_ptr所占有,當其離開作用域時自動析構。資源所有權的轉移隻能通過​

    ​std::move()​

    ​而不能通過指派

(6):override關鍵字,可以防止C++因你試圖重載一個繼承函數,但拼寫名字錯誤建立一個新的不必要的成員函數。

(7)final:此關鍵字阻止函數被應用它的類重載

2、模闆的泛化、全特化、偏特化、類模闆、函數模闆:

  1. 模闆特化按對象類型(類和全局函數)分為兩種: 類模闆的特化和全局模闆函數的特化;
  2. 按特化的類型分全特化和偏特化(也就是多個模闆參數可以標明隻特化一個或者多個),全局模闆函數的特化不支援偏特化;
  3. 全局模闆函數的特化需要關注幾個重要元素函數傳回值 函數名 形參類型、個數和順序,eg:template T max_(const T &, const T &)
  4. 類模闆的特化需要關注幾個重要元素類名,形參類型和個數,形參的順序倒不重要了;
  5. 模闆特化,任何針對模闆參數進一步進行條件限制設計的特化版本。《泛型思維》
  6. 全特化就是全部特化,即針對所有的模闆參數進行特化。《c++ primer》
  7. 偏特化就是部分特化,即針對部分模闆參數進行特化。《c++ primer》
  8. 全特化和偏特化的定義不是很嚴格,是以有的時候不容易讓人了解。
#include <iostream>
using namespace std;

namespace templateTest{

    //模版泛化
    template<typename T>
    class iterator_traits
    {
    public:
        iterator_traits()
        {
            cout << "模版泛化" << endl;
        }

        ~iterator_traits()
        {

        }
    };

    //偏特化
    template<typename T>
    class iterator_traits<T*>
    {
    public:
        iterator_traits()
        {
            cout << "模版偏特化,特化正常指針" << endl;
        }

        ~iterator_traits()
        {

        }
    };

    //偏特化
    template<typename T>
    class iterator_traits<const T*>
    {
    public:
        iterator_traits()
        {
            cout << "模版偏特化,特化const指針" << endl;
        }

        ~iterator_traits()
        {

        }
    };

    //全特化
    template<>
    class iterator_traits<int>
    {
    public:
        iterator_traits()
        {
            cout << "模版全特化int類型" << endl;
        }

        ~iterator_traits()
        {

        }
    };
};

//泛化
template<class U, class T>
class Test
{
public:
    Test()
    {
        cout << "Test 泛化" << endl;
    }
};

//偏特化
template< class T>
class Test<int,T>
{
public:

    Test()
    {
        cout << "Test 偏特化" << endl;
    }
};

//全特化
template<>
class Test<int, char>
{
public:

    Test()
    {
        cout << "Test 全特化" << endl;
    }
};
template<typename T>
void max(const T& t1, const T & t2)
{
    cout << "模版函數泛化"<< endl;

}

//其實函數模版不存在偏特化,隻有全特化
template<>
void max<int>(const int& t1, const int& t2)
{
    cout << "模版函數特化" << endl;
}

void main()
{
    templateTest::iterator_traits<int> t1;
    templateTest::iterator_traits<float> t2;
    templateTest::iterator_traits<int *> t3;
    templateTest::iterator_traits<const int *> t4;  
    Test<int, int> t5;
    Test<float, int> t6;
    Test<int, char> t7;
    max(5, 10);
    max(5.5, 10.5);
    system("pause");
}      
模版全特化int類型
模版泛化
模版偏特化,特化正常指針
模版偏特化,特化const指針
Test 偏特化
Test 泛化
Test 全特化
模版函數特化
模版函數泛化
請按任意鍵繼續. . .      

繼續閱讀