在建设厅网站上下载资质标准,安卓app定制开发公司,建设工程+质量+协会网站,域名是干嘛的每一个不曾起舞的日子都是对生命的辜负 C11C11(语法糖)本节目标一.C11简介二.统一的列表初始化2.1 {}初始化2.2 std::initializer_list三.声明3.1 auto3.2 decltype3.3 nullptr四.总结C11(语法糖)
本节目标 C11简介 列表初始化 变量类型推导
一.C11简介 在2003年C标准委员… 每一个不曾起舞的日子都是对生命的辜负 C11C11(语法糖)本节目标一.C11简介二.统一的列表初始化2.1 {}初始化2.2 std::initializer_list三.声明3.1 auto3.2 decltype3.3 nullptr四.总结C11(语法糖)
本节目标 C11简介 列表初始化 变量类型推导
一.C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于C03(TC1)主要是对C98标准中的漏洞进行修复语言的核心部分则没有改动因此人们习惯性的把两个标准合并称为C98/03标准。 从C0x到C11C标准10年磨一剑第二个真正意义上的标准珊珊来迟。相比于C98/03C11则带来了数量可观的变化其中包含了约140个新特性以及对C03标准中约600个缺陷的修正这使得C11更像是从C98/03中孕育出的一种新语言。相比较而言C11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全不仅功能更强大而且能提升程序员的开发效率公司实际项目开发中也用得比较多所以我们要作为一个重点去学习。C11增加的语法特性非常篇幅非常多我们这里没办法一 一讲解所以本节主要讲解实际中比较实用的语法。 https://en.cppreference.com/w/cpp/11 小故事 1998年是C标准委员会成立的第一年本来计划以后每5年视实际需要更新一次标准C国际标准委员会在研究C 03的下一个版本的时候一开始计划是2007年发布所以最初这个标准叫C 07。但是到06年的时候官方觉得2007年肯定完不成C 07而且官方觉得2008年可能也 完不成。最后干脆叫C 0x。x的意思是不知道到底能在07还是08还是09年完成。结果2010年的时候也没完成最后在2011年终于完成了C标准。所以最终定名为C11。 二.统一的列表初始化
2.1 {}初始化
在C98中标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。比如
struct Point
{int _x;int _y;
};
int main()
{int array1[] { 1, 2, 3, 4, 5 };int array2[5] { 0 };Point p { 1, 2 };return 0;
}C11扩大了用大括号括起的列表(初始化列表)的使用范围使其可用于所有的内置类型和用户自定义的类型使用初始化列表时可添加等号()也可不添加。
#define _CRT_SECURE_NO_WARNINGS 1
#includeiostream
using namespace std;struct Point
{int _x;int _y;
};class Date
{
public:Date(int year, int month, int day):_year(year), _month(month), _day(day){cout Date(int year, int month, int day) endl;}
private:int _year;int _month;int _day;
};
int main()
{//C98Point p1 { 1, 2 };int array1[] { 1, 2, 3, 4, 5 };int x1 1;int* p3 new int[10];//c98不支持new时初始化Date d1(1, 3, 2);Date d2 { 1,3,2 };//下面都是C11Point p2{ 1, 2 };int array2[]{ 1, 2, 3, 4, 5 };//建议不要这么用能看懂就可以int x2 { 1 };int x3{ 1 };int* p4 new int[10]{ 1, 2,3,4 };//c11支持这样初始化Point* p5 new Point[2]{ {1, 1}, {2, 2} };Date d3{ 1,3,2 };}对于Date类型c11的方式同样调用构造函数。
2.2 std::initializer_list
std::initializer_list的介绍文档http://www.cplusplus.com/reference/initializer_list/initializer_list/
std::initializer_list是什么类型
int main()
{// the type of il is an initializer_listauto il { 10, 20, 30 };cout typeid(il).name() endl;return 0;
}可以看出std::initializer_list是作为常量区的一个封装的类型通过查阅文档其也有迭代器可以将常量区的元素一一遍历。 std::initializer_list的使用场景
std::initializer_list一般是作为构造函数的参数C11对STL中的不少容器就增加std::initializer_list作为参数的构造函数这样初始化容器对象就更方便了。也可以作为operator的参数这样就可以用大括号赋值。因此我们就知道了为什么vector类的空间是如何初始化的vector的构造函数就存在std::initializer_list的参数。而开辟的空间就是根据std::initializer_list的size()大小开辟的。
那再来回顾一下当初模拟实现的vector由于我们并没有设置std::initializer_list的构造因此采用大括号进行初始化是错误的所以我们可以多重载一个由std::initializer_list参数的构造函数
vector(initializer_listT il):_start(nullptr), _finish(nullptr), _endofstorage(nullptr)
{reserve(il.size());typename initializer_listT::iterator it il.begin();while (it ! il.end()){push_back(*it);it;}
}这样就可以用这样的初始化了
void test_vector11()
{vectorint v{ 1, 2, 3, 4, 5 };for (auto e : v){cout e ;}cout endl;
}当然不仅仅vectorlist也是如此。 因此我们对于以后的初始化就可以这样了
vectorDate v3 { {1, 1, 1}, {2, 2, 2}, {3, 3, 3} };
mapstring, string dict { {字符串, string}, {排序, sort} };直到这里才可以看出C11中{}的意义对于上面int类型的{}属实是有些鸡肋了。
三.声明
c11提供了多种简化声明的方式尤其是在使用模板时。
3.1 auto
在C98中auto是一个存储类型的说明符表明变量是局部自动存储类型但是局部域中定义局部的变量默认就是自动存储类型所以auto就没什么价值了。C11中废弃auto原来的用法将其用于实现自动类型腿断。这样要求必须进行显示初始化让编译器将定义对象的类型设置为初始化值的类型。 实际上在C初窥门径中已经学习过。 int main()
{int i 10;auto p i;auto pf strcpy;cout typeid(p).name() endl;cout typeid(pf).name() endl;return 0;
}3.2 decltype
关键字decltype将变量的类型声明为表达式指定的类型。
// decltype的一些使用使用场景
templateclass T1, class T2
void F(T1 t1, T2 t2)
{decltype(t1 * t2) ret;cout typeid(ret).name() endl;
}
int main()
{const int x 1;double y 2.2;decltype(x * y) ret; // ret的类型是doubledecltype(x) p; //p的类型是int*cout typeid(ret).name() endl;cout typeid(p).name() endl;F(1, a);return 0;
}3.3 nullptr
由于C中NULL被定义成字面量0这样就可能回带来一些问题因为0既能指针常量又能表示整形常量。所以出于清晰和安全的角度考虑C11中新增了nullptr用于表示空指针。
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif四.总结
除了这些之外C11还有许多其他特性比如之前讲解到的范围for循环、array、unordered系列、final与override当然这些都是属于简单的语法知识后续还有很多C11中重要的特性右值引用、智能指针、lambda表达式、包装器、线程库、可变参数模板……。这些在后续都会一一介绍。