导图社区 cPlusPlus 11和14
自己整理的c 11和14 主要信息深度解读,包括:模板类templates引入、大挂号初始化、initializer_list)explicit加入多个初始化函数支持、for (decl : coll) { statement }、=default,=delete、模板化名using。
自己整理C++11和14的重点:当调用到P p1={11,12,13}时编译器会报错,因为等于号为赋值操作等号右边编译器会隐式转换 拆分initializer_list为特化函数优先调用而 P p2{11,12,13} 编译器通过 因为:{11,12,13}类型为编译器指定的initializer_list,直接调用初始化。
社区模板帮助中心,点此进入>>
论语孔子简单思维导图
《傅雷家书》思维导图
《童年》读书笔记
《茶馆》思维导图
《朝花夕拾》篇目思维导图
《昆虫记》思维导图
《安徒生童话》思维导图
《鲁滨逊漂流记》读书笔记
《这样读书就够了》读书笔记
妈妈必读:一张0-1岁孩子认知发展的精确时间表
c++ 11和14
模板类templates引入...
泛化是指参数类型不定(template类型),特化是指参数类型一定(例如:int、string等)
template <typename T,typename... Types> void print(const T& firstArg,const Types&... args){ qDebug() << firstArg <<sizeof... (args); print(args...); }
模板函数调用优先级:特化 》泛化 当查找到传入参数有相应特定函数时,优先调用
大挂号初始化(initializer_list)
基本用法
int* p{} 等价于 int* p = nullptr
int p{} 定价与 int p = 0
p(int a,int b)中 调用1:p(11,6); 调用2:P{33,7};
初始化数组等容器 list<int> p{11,32}
底层代码由initializer_list 实现,默认赋值如 = 为浅拷贝 指向同一块地址
拓展用法
min(),max()支持大括号初始化 所以支持任意多的数比较大小, 如 min({11,12,16,18,19}) 结果为11
explicit加入多个初始化函数支持
例如:class P { public: P(int a,int b){} P(initializer_list<int>){} explicit P(int a,int b,int c){} }
当调用到P p1={11,12,13}时编译器会报错,因为等于号为赋值操作 等号右边编译器会隐式转换 拆分initializer_list为特化函数优先调用 而 P p2{11,12,13} 编译器通过 因为:{11,12,13}类型为 编译器指定的initializer_list,直接调用初始化
for(decl : coll){ statement }
例如:for( int i : { 2,2,2,6,4,8,7,55,6 } ){ count << i <<endl; }
vector<double> ver; for( auto elem : vec ){// elem 拷贝 vec 里元素迭代器 速度慢 cout << elem <<endl; //只是读 } for( auto &elem : vec){//elem 直接引用vec 里元素迭代器 速度快 elem *=3;//此时为改变容器里每个数都乘以3 }
小插曲 begin() , end()是c++ 11特有的全局函数,支持容器 例如:begin(vec) ,end(ver) 应用有待考证,没有使用成功
=default,=delete
=default 就是定义了构造函数,但还是要编译器默认的构造空函数 例如:class P{ public: P(int i){}//如果没有P()=defalut编译器不会构造默认的构造函数P() P()=defalut;//通知编译器构造一个默认构造函数 } 有关编译器自动生成的默认构造函数 例如:定义一个空类 class Fun1{} 编译器会自动生成默认函数, 以下函数都可以用=defalut 来通知编译器帮你自动生成 class Fun{ Fun( ) {} //支持=defalut Fun(const Fun&rhs){...} //支持=defalut ~Fun(){...} //支持=defalut Fun& operator=(const Fun& rhs){} //支持=defalut };
=delete 单例里禁止赋值函数 也可以用于继承后,弃用基类的对应函数 例如:void isEmpty()=delete;意为弃用isEmpty函数
模板化名using
定义例子:template <typename T> using Vec = std::vector<T,MyAlloc<T>> 使用例子:Vec<int> coll 有别于#define 全文替换
例子2: template<typename T> using Vec = std::vector<T,allocator<T>>; template<typename Container> void test_debug_head_end(Container continer){ qDebug()<<*(continer.begin())<<*(--continer.end()); } 使用:test_moveable<Vec<int>>({18,12,13});