1、c++11新特性:
- “文法糖”:
, nullptr
自動類型推導,範圍for循環,初始化清單, lambda表達式等auto
- 右值引用和移動語義
- 智能指針
- 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、模闆的泛化、全特化、偏特化、類模闆、函數模闆:
- 模闆特化按對象類型(類和全局函數)分為兩種: 類模闆的特化和全局模闆函數的特化;
- 按特化的類型分全特化和偏特化(也就是多個模闆參數可以標明隻特化一個或者多個),全局模闆函數的特化不支援偏特化;
- 全局模闆函數的特化需要關注幾個重要元素函數傳回值 函數名 形參類型、個數和順序,eg:template T max_(const T &, const T &)
- 類模闆的特化需要關注幾個重要元素類名,形參類型和個數,形參的順序倒不重要了;
- 模闆特化,任何針對模闆參數進一步進行條件限制設計的特化版本。《泛型思維》
- 全特化就是全部特化,即針對所有的模闆參數進行特化。《c++ primer》
- 偏特化就是部分特化,即針對部分模闆參數進行特化。《c++ primer》
- 全特化和偏特化的定義不是很嚴格,是以有的時候不容易讓人了解。
#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 全特化
模版函數特化
模版函數泛化
請按任意鍵繼續. . .