基础知识(2)
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 全特化
模版函数特化
模版函数泛化
请按任意键继续. . .
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2018-06-15 某些数组和字符串类型转换(转)
2017-06-15 C++虚继承的概念(转)
2017-06-15 C++类的大小(转)
2017-06-15 C++中sizeof(struct)怎么计算?(转)
2017-06-15 C++ 虚函数表解析(转)
2017-06-15 binary-tree-level-order-traversal I、II——输出二叉树的数字序列
2017-06-15 Convert Sorted List to Binary Search Tree——将链表转换为平衡二叉搜索树 &&convert-sorted-array-to-binary-search-tree——将数列转换为bst