zoukankan      html  css  js  c++  java
  • 构造函数与拷贝解析

    当我们声明一个类的时候,可能会需要另外一个类的实体去初始化一个新定义的类。
    // 类定义
    // 此类只能实现数据的拷贝,而不能够对资源进行操作。
    class ScreenOnlyCopyData
    {
    public:
          
    short height(){/* ... */}
          
    short weight(){/* ... */}
          
    string  screen(){/*...*/}

    private:
         
    string _screen;
         
    string::size_type _cursor;
         
    short   _height,_weight;
    }
    ;
    //当有一个类对象实现时,
            ScreenOnlyCopyData s1;
            
    //对s1进行操作.....
          ScreenOnlyCopyData s2=s1;
         
    //等同于下面的语句
            s2._screen = s1._screen;
            s2._cursor 
    = s1._cursor;
            s2._height 
    = s1._height;
            s2._weight 
    = s1._weight;
    //所以,当我们定义了一个带有资源分配的类类型时,在类之间相互拷贝必须重新构造拷贝构造函数,
    // 否则将只对值进行简单的赋值过程,最终导致两个类对象指向同一个资源,在其中一个对象将
    // 资源析构时,另一个对象原本指向资源的指针将指向一个未定义的资源,从而导致错误的发生。
    // 具体见下面的代码,为使分析简单,仅使用两个成员。

    Class NoResourceToCopy
    {
    public:
          NewResource(size_type len)
    {*= new int [len];} 
          
    ~NoResourceToCopy(){delete []p;}
    private:
           
    int *p;
           
    int s;
    }
    ;

    NoResourceToCopy nr1;
    nr1.NewResource(
    10);
    NoResourceToCopy nr2
    =nr1;               //特殊语句1
    //按上面的解释,这特殊语句1应该等同于下面的语句的集合
    // nr2.p=nr1.p;
    // nr2.s=nr2.s;
    // 所以,当nr1析构时,nr2中的p指向的内存块是不明确的,因此会出现错误。
    // 因此为使特殊语句1能够成功获取资源,需要如下的定义。

    Class RecourseToCopy
    {
    public:
        RecourseToCopy()
    {}
        ResourceToCopy( ResourceToCopy 
    & )
       
    {}
       
    ~RecourseToCopy(){}
    private:
        
    int *p;
        
    int len;
    }
    ;

    RecourseToCopy::ResouceToCopy()
    {
        
    *=NULL:
       len
    = 0;
    }


    ResourceToCopy::ResourceToCopy(ResourceToCopy 
    &s)
    {
       
    if(NULL == s.p)
        
    {      
            
    this->p=NULL;
            
    this->len=0;
       }

       
    this->p=new int[s1.len];   //只有在此处再次申请资源,才能保证s1被解析时,p不是野指针。
       this->len =s1.len;
    }

    ResourceToCopy ::
    ~ResouceToCopy()
    {
         delete []p;
    }



    /*
    *
    * Copyright (c) 2011 Ubunoon.
    * All rights reserved.
    *
    * email: netubu#gmail.com replace '#' to '@'
    * http://www.cnblogs.com/ubunoon
    * 欢迎来邮件定制各类验证码识别,条码识别,图像处理等软件
    * 推荐不错的珍珠饰品,欢迎订购 * 宜臣珍珠(淡水好珍珠) */
  • 相关阅读:
    var、let、const
    面向女朋友自我介绍
    ES6——class
    一个错误引发的——对异步回调与for循环(小白错误,大神勿进)
    关于this
    关于作用域
    HTML5 8
    HTML5 7
    HTML5 6
    HTML5 4
  • 原文地址:https://www.cnblogs.com/ubunoon/p/2058945.html
Copyright © 2011-2022 走看看