zoukankan      html  css  js  c++  java
  • 初探boost之noncopyable学习笔记

    noncopyable

    功能

    同意程序轻松实现一个不可复制的类。

     

     

    需包括头文件

    #include<boost/noncopyable.hpp>     或

    #include<boost/utility.hpp>

     

     

     

     

    原理

     

    在c++定义一个类时。假设不明白定义复制构造函数和复制赋值操作符。编译器会为我们自己主动生成这两个函数。

     

    比如

    class empty_class{ } ;

    实际上类似于

    class empty_class

    {

    public:

        empty_class(const empty_class &){...}

        empty_class & operator=(const empty_class &){...}

    };

    但有时候我们不要类的复制语义,希望禁止复制类的实现。比較常见的做法就是私有化复制构造函数和赋值操作符,

    手写代码也非常easy。如:

    class do_not_copy

    {

    private:

        do_not_copy(const do_not_copy &);

        void operator=(const do_not_copy &);

    };

     

    但假设程序中有大量这种类,反复写代码也是非常麻烦的,解决方法也不够优雅。

    noncopyable为实现不可复制的类提供了简单清晰的解决方式:从 boost::noncopyable 派生就可以。

     

    这里使用默认的私有继承是同意的。显示的写出private或public修饰词也能够。效果同样。

    我们定义的子类会自己主动私

    有化父类noncopyable的复制构造函数。从而禁止用户从外部訪问复制构造函数和复制赋值函数。

     

     

    使用方法

    以上样例也改写为:

    class do_not_copy :boost::noncopyable

    {...};

     

     

     

    举例

    #include<iostream>
    #include<boost/utility.hpp>
    #include<boost/noncopyable.hpp>
    
    using namespace std;
    using namespace boost;
    
    class student:boost::noncopyable
    {
    public:
        student(int _id):id(_id){};
        int print(){return id;}
    private:
        int id;
    };
    
    int main()
    {
        student st(100);
        cout<<st.print()<<endl;
        student scopy(st);  //报错
        cout<<scopy.print()<<endl;
        return 0;
    }
    

     

    若没有继承noncopyable

    输出:

    100

    100

    若继承,如上述代码,在凝视那句開始报错。

     

     

  • 相关阅读:
    file_put_contents 和php://input 实现存储数据进图片中
    Oracle PL/SQL游标的学习
    三层的再理解
    取出字符串中任意的顺序匹配
    oracle的正则表达式(regular expression)简单介绍
    oracle动态游标的简单实现方法
    存储过程之游标笔记小结
    char,varchar,nvarchar的区别
    大连惊魂记
    让asp.net默认的上传组件支持进度条反映(转)
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6980018.html
Copyright © 2011-2022 走看看