C++11新特性的一些用法举例②

前端之家收集整理的这篇文章主要介绍了C++11新特性的一些用法举例②前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

/** C++11
*

  • 默认成员函数
    原来C++类中,有6个默认成员函数
  1. 构造函数
  2. 析构函数
  3. 拷贝构造函数
  4. 拷贝赋值重载
  5. 取地址重载
  6. const 取地址重载
    最后重要的是前4个,后两个用处不大。默认成员函数就是我们不写编译器会生成一个默认的。
  • C++11新增了两个构造函数,分别是
  • 1.移动构造
  • 2.移动赋值
  • 但他们自动生成的条件非常苛刻:
    1. 如果你没有自己实现移动构造函数,且没有实现析构函数 、拷贝构造、拷贝赋值。那么编译器会自动生成一个默认移动构造。
  • -- 实现一个都不行? 对,只要实现到其中1个或以上都不会自动生成
  • 原因:
  •  如果我们重载了析构,拷贝,赋值,就说明这个类是需要深拷贝的,那这个类最好是由我来决定资源如何转移,而不是由编译器控制,以免出现意想不到的结果       
    
    1. 默认生成的移动构造函数,对于内置类型成员会逐字节拷贝(值拷贝),
  •  对于自定义类型成员,如果该自定义类型内实现了移动构造,就调用他的移动构造,没有实现就调用他的拷贝构造。
    
  •  --- 默认生成的移动构造,需要自定义类型实现了移动构造才能发生移动,其他都是值拷贝或深拷贝...
    
  • 强制生成默认的移动构造
  • A(A&& a) = default;
  • A& operator=(A&& a) = default;

*/

//类成员变量初始化 -- 缺省值
/**

  • C++11允许在类定义时给成员变量初始缺省值,默认生成构造函数会使用这些缺省值初始化 -- 缺省参数
  • 补足对内置类型默认不处理的缺陷
    */

//关键字default -- 强制生成默认的构造函数
/**
*

  • C++11可以让你更好的控制要使用的默认函数。假设你要使用某个默认的函数,但是因为一些原因这个函数没有默认生成
  • 比如:我们提供了拷贝构造,就不会生成移动构造了,那么我们可以使用default关键字显示指定移动构造生成
  • 强制生成默认的移动构造
  • A(A&& a) = default;
  • A& operator=(A&& a) = default;

*/

/**禁止生成默认函数的关键字delete:
*

  • 1.如果能想要限制某些默认函数生成,在C++98中,使该函数设置成private,并且只声明 ,这样只要其他人想要调用就会报错。 --- 不够明确/清晰
  • 2.在C++11中更简单,只需在该函数声明加上 = delete即可,该语法指示编译器不生成对应函数的默认版本,
  • 称 = delete修饰的函数删除函数。 -- 更清晰明确
  • 哪些对象不希望被拷贝,被移动? -- 1.I/O流 2.单例模式...

*/

//继承和多态中的final与override关键字
/**

  • final: -- 修饰基类,父类
  • 1.final可以修饰一个类,使其不能被继承.
  • 2.final还可以修饰成员函数,使其不能被重写.
  • override: --- 修饰派生类
  • 1.override用于修饰派生类的虚函数.检查是否完成重写.
  • 什么情况下子类必须重写虚函数 --- 规定:纯虚函数的子孙类必须至少有一个重写纯虚函数.

*/

//委托构造 -- 可读性差点,意义不大,只提高了复用性.但可以不使用,可有可无
/**

  • 委托构造函数也是一种构造函数,这种构造函数可以委托其他构造函数来帮它完成一些对象成员的初始化操作。
  • 一个构造函数可以调用其他构造函数
    /
    /
    class Person
    {
    public:
    Person(const char* name,int age)
    :_name(name)
    ,_age(age)
    {}
    Person(const char* name) //委托构造
    :Person(name,18) // ---- 借用已有的构造函数来帮助构造,初始化
    {}
    private:
    string _name;
    int _age;
    };*/

//C++ 11是如何封装Thread库的? - 知乎
//https

猜你在找的C&C++相关文章