小工具知识网

当前位置: 首页 > 行业知识 > 【C++】C++11上

行业知识

【C++】C++11上

2026-10-29 08:37:43 来源:互联网转载

C++11上

  • 1.C++11简介
  • 2.统一的列表初始化
    • 2.1 {} 初始化
    • 2.2 initializer_list
    • 3.变量类型推导
      • 3.1auto
      • 3.2decltype
      • 3.3nullptr
      • 4.范围for循环
      • 5.final与override
      • 6.智能指针
      • 7. STL中一些变化
      • 8.右值引用和移动语义
        • 8.1左值引用和右值引用
        • 8.2左值引用与右值引用比较
        • 8.3右值引用使用场景和意义
        • 9.���的类功能

          1.C++11简介

          在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,

          C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多,所以我们要作为一个重点去学习。C++11增加的语法特性非常篇幅非常多,我们这里没办法一 一讲解,所以这里主要讲解实际中比较实用的语法。

          C++11

          2.统一的列表初始化

          2.1 {} 初始化

          在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。比如:

          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;}

          C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加。

          int main(){//C++98Point p1 = { 1,2 };int array1[] = { 1, 2, 3, 4, 5 };//C++11Point p2{ 1,2 };int array2[]{ 1,2,3,4,5 };//C++98int x1 = 10;//C++11int x2 = { 10 };int x3{ 10 };return 0;}

          以前{ }只能初始化结构数组,现在一切皆可以{ }初始化。但是上面不建议使用{ }初始化,传统方式可读性更好一些,看懂即可。

          最好使用地方在下面这里

          int* p3 = new int[10];//以前new不好初始化int* p4 = new int[10]{ 0,1,2,3,4 };//现在就可以{}初始化,C++11支持的Point* p5 = new Point[2]{ {1,2},{3,4} };//结构对象{}初始化之后,然后再{}初始化数组

          创建对象时也可以使用列表初始化方式调用构造函数初始化

          class Date{public:Date(int year, int month, int day):_year(year), _month(month), _day(day){cout Date d1(2022, 1, 1); // 以前初始化// C++11支持的列表初始化,这里会调用构造函数初始化Date d2{ 2022, 1, 2 };return 0;}vector 1,2,3,4 };list 1,2,3,4,5,6,7 };}Date d{ 2022, 1, 1 };//这里是调用构造auto l1 = { 1,2,3,4,5,6 };//这里是识别成initializer_lis数组,上面vector,list也都是识别成initializer_lis数组去初始化cout reserve(l1.size());//可以提前开辟好空间for (auto& e : l1)//底层是迭代器{push_back(e);}} {1,1,1},{2,2,2},{3,3,3} };//里面{}调用pair的构造函数生成pair匿名对象//外面{}是pair常量对象数组,去调用map支持initializer_list的构造函数map {"sort","排序"},{"string","字符串"} };empty_initialize();for (auto& e : l1){push_back(e);}}int x = 0;cout //比如这里都传的是int还好说,ret定义成int//但是一个是int,一个是double,ret还被定成int就出现精度丢失的问题decltype(t1 * t2) ret=t1*t2;cout array// 以下的p、b、c、*p都是左值int* p = new int(0);int b = 1;const int c = 2;// 以下几个是对上面左值的左值引用int*& rp = p;int& rb = b;const int& rc = c;int& pvalue = *p;return 0;}double x = 1.1, y = 2.2;// 以下几个都是常见的右值10;x + y;fmin(x, y);// 以下几个都是对右值的右值引用int&& rr1 = 10;double&& rr2 = x + y;double&& rr3 = fmin(x, y);// 这里编译会报错:error C2106: “=”: 左操作数必须为左值10 = 1;x + y = 1;fmin(x, y) = 1;return 0;}    // 左值引用只能引用左值,不能引用右值。    int a = 10;    int& ra1 = a;   // ra为a的别名    //int& ra2 = 10;   // 编译失败,因为10是右值    // const左值引用既可引用左值,也可引用右值。    const int& ra3 = 10;//const修饰之后不能修改    const int& ra4 = a;//权限缩小    return 0;} // 右值引用只能右值,不能引用左值。 int&& r1 = 10;  // error C2440: “初始化”: 无法从“int”转换为“int &&” // message : 无法将左值绑定到右值引用 int a = 10; int&& r2 = a; // 右值引用可以引用move以后的左值 int&& r3 = std::move(a); return 0;}}template//..return x;}int main(){vectorT ret;//..return ret;//不能用引用返回,ret出了作用域就销毁了,这里就相当于野指针的问题}vectorvv[i].resize(i + 1, 1);}for (int i = 2; i 

上一篇:云服务器怎么访问外网?

下一篇:大商创区域设置指南,个性化商业版图打造详解!