1、c++11新特性:
- “语法糖”:
nullptr
,auto
自动类型推导,范围for循环,初始化列表, lambda表达式等 - 右值引用和移动语义
- 智能指针
- C++11多线程编程:
thread
库及其相配套的同步原语mutex
,lock_guard
,condition_variable
, 以及异步std::furture
(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()
而不能通过赋值
(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 全特化
模版函数特化
模版函数泛化
请按任意键继续. . .