zoukankan      html  css  js  c++  java
  • c++ primer读书笔记之c++11(三)

    1 =default构造函数限定符

    c++11针对构造函数提供了=default限定符,可以用于显式指定编译器自动生成特定的构造函数、析构或赋值运算函数。参考代码如下: 

    class CtorDftType
    {
    public:
        CtorDftType()=default;
        CtorDftType(const CtorDftType&)=default;
        CtorDftType & operator = (const CtorDftType &)=default;
        ~CtorDftType()=default;
    };

    使用=default限定符的构造函数,不需要实现,编译器会自动生成默认的函数实现。

    2 =delete函数限定符

    如果需要禁止类对象间的复制或者赋值,传统的做法是将复制构造函数和赋值运算符设置为private。c++11提供了的=delete限定符用于实现类似的功能,=delete限定符可用于任何函数,主要用于类成员函数的访问控制。

    参考代码如下:

    class DelModType
    {
    public:
        DelModType()=default;
        DelModType(const DelModType&)=delete;// no copy ctor
        DelModType& operator = (const DelModType&)=delete; // no assignment
        ~DelModType() = default;
    };

    需要说明的是=delete可用于普通成员函数。建议析构函数不要使用=delete限定符。

    =delete限定符会传递,引起包含、引用该成员的类的自动生成的构造函数、析构函数、赋值运算符变成私有的。(这个私有构造函数一个意思)

    新的标准不建议使用私有构造函数、赋值运算符的形式。

    3 显式转换运算符 

    c++11针对重载类型转换运算符很容易误用、滥用的问题,引入了explicit限定符用于描述转换运算符的重载,必须显示调用才可以进行转换。示例代码如下:

    class ExplicitConversion
    {
    public:
        explicit operator bool() const{return true;}
    };

    4 override成员函数限定词 

    c++11提供了override限定词,用于显示的说明子类中的某个接口是继承自父类的,并且在子类中重写了。其用法如下:

    class Base
    {
    public:
        Base()=default;
        virtual ~Base()=default;
        virtual int GetType() const{return 0;}
    };
    class Derived: public Base
    {
    public:
        Derived()=default;
        ~Derived()=default;
        int GetType() const override{return 1;}
    };

    5 final关键字

    c++11引入final关键字用于修饰类名字,表示该类是不能作为基类或父类的。

    class NoDerived final
    {};

    final也可以用于修饰成员函数,用于表示不能被重写的成员函数。

    6 继承的构造函数

    c++11引入了继承的构造函数,虽然说是继承的,但是用法和实际意义不太一样。使用using声明引入这种机制。代码如下:

    class InBase
    {
    public:
        InBase(int x, int y): m_x(x), m_y(y){}
        virtual ~InBase(){}
    protected:
        int m_x, m_y;
    };
    class InDerived: public InBase
    {
    public:
        using InBase::InBase;
    };

    子类InDerived的构造函数等同于以下代码:

    class InDerived: public InBase
    {
    public:
        InDerived(int x, int y):InBase(x,y){}
    };

    也就是说继承的构造函数表示子类有一个和父类同样参数的构造函数。需要注意的是继承的构造函数不支持默认参数的继承。

    7 右值引用 RVal Reference和移动构造函数Move Ctor、移动赋值运算符Move Assignment

     所谓的右值引用指的是该对象即将销毁,只有一个指针或引用指向该对象,比较常见的比如字面量、栈中即将销毁的变量。类似的右值引用如果存在指针或者其他动态动态分配的资源,我们可以使用移动构造函数或者移动赋值运算符将其资源重新使用,并将原有指针置空的机制。鉴于内容比较多,想深入了解的建议参考c++primer ch13.6或者c++11标准。

     附加说明

    本文内容主要是关于 c++ primer 第五版的第13章到第15章中涉及c++11内容的整理。涉及default、delete、explicit、override、final等关键字、继承构造函数、移动构造函数等机制。

    所有代码都在gcc v4.8.1的版本中编译测试过,相关源码可以从我的git下载,url如下:https://git.oschina.net/Tocy/SampleCode.git,位于c++11目录下的cpp_primer_test3.cpp文件中。

  • 相关阅读:
    Websocket基础知识简记
    jmeter websocket接口测试
    软件测试的艺术 笔记(上)
    错误提示Unable to preventDefault inside passive event listener解决方法
    vue-cil3关闭eslint语法检查
    mongoDB无法启动服务器
    Vue之todoList
    react踩坑第一章
    父组件向孙子组件传值(Context)特性
    变量声明
  • 原文地址:https://www.cnblogs.com/tocy/p/cpp-primer-std11-new-traits-3.html
Copyright © 2011-2022 走看看