注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

轻松度过每一天

真的猛士敢于直面惨淡的人生,敢于正视淋漓的鲜血,这是怎样的哀痛者和幸福者!!

 
 
 

日志

 
 
关于我

When you are young, you may want several love experiences. But as timegoes on, you will realize that if you really love someone, the wholelife will not be enough. You need time to know, to forgive and to love.All this needs a very big mind.

网易考拉推荐

三、复制控制,浅深拷贝,操作符重载,智能指针  

2014-08-06 17:08:24|  分类: com.myCompany.Te |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1.一般的,用=赋值,都是将变量的地址赋给变量,这是浅赋值。

深赋值,两变量均有自己的内存,但他们值是一样的

浅拷贝:不同对象,同一地址

三、复制控制,浅深拷贝,操作符重载,智能指针 - 世界不属于我 - 轻松度过每一天
 

深拷贝:不同对象,不同地址

三、复制控制,浅深拷贝,操作符重载,智能指针 - 世界不属于我 - 轻松度过每一天
 

2.类,在某写操作下,执行拷贝构造

拷贝构造:特殊的构造函数,没有的情况下会调用系统默认的

格式,Date(const Date& d);const防止误操作,更改变量,可赋写

//拷贝构造 class Date

Date& func(){//对象以值传递的方式从函数返回引用对象

    Date d(2,3,5);

    return d;//返回一个局部对象

}

void func(Date c ){//对象以值传递的方式传入函数参数

   

    cout <<"hello!!"<< endl;

}

    Date a(1,2,3);

    Date b = a;//用一对象为另一对象进行初始化,调用拷贝构造

    Date c(a);

 

    //对象以值传递的方式从函数返回引用对象

    Date a = func();

   

    //对象以值传递的方式传入函数参数

    Date a(1,2,3);

func(a);//相当于Date c = a;

 

3.操作符的重载,深拷贝

//操作符重载,返回引用对象,this系统自动添加

Date& Date::operator-(const Date& s){

 

    this->m_iYear = this->m_iYear - s.m_iYear;

    return *this;

}

3.智能指针

智能指针,类似于引用计数,new一次delete一次

  调用构造函数,初始化,计数初始化为1

  调用拷贝构造,计数加1

  调用赋值操作,左边-1,右边+1

  调用析构函数时,指针-1

 

智能指针类

class PointerCounter{

   

    friend class Date;

    int* m_iP;

    int m_iUse;

    PointerCounter(int* p) : m_iP(p), m_iUse(1){};

    ~PointerCounter(){

       

        cout << "~PointerCounter....." << endl;

        delete m_iP;

    }

};

使用指针类

class Date{

private:

//    Date(const Date& d);//copy structure.禁止拷贝

    PointerCounter* m_pPointer;

    int m_iYear;

    int m_iMonth;

    int m_iDay;

public:

    int* p;

    int content;

//    Date();

    Date(int* p,int year, int month, int day);

    Date(const Date& d);//copy structure.禁止拷贝,可将拷贝构造声明为私有,并不对其进行定义

    ~Date();

   

    void print();

//    Date& operator-(const Date& s);

    Date& operator = (const Date& s);

};

 

//每个对象初始化时,均分配一个指针

Date::Date(int* p, int year, int month, int day) : m_pPointer(new)PointerCounter(p)),m_iYear(year), m_iMonth(month), m_iDay(day)

 

Date::~Date(){

    cout << "~Date....." << endl;

    m_pPointer->m_iUse--;//析构一次,指针-1,判断是否为0

    if (m_pPointer->m_iUse == 0)//来删除指针对象

    {

        delete m_pPointer;

    }

}

 

 

Date::Date(const Date& d) : m_pPointer(d.m_pPointer), m_iYear(d.m_iYear),m_iMonth(d.m_iMonth),m_iDay(d.m_iDay){//拷贝构造,拷贝构造是一个深拷贝过程

    m_pPointer->m_iUse = m_pPointer->m_iUse + 1;

    cout << "copy structure" << endl;

   

}

 

 

 

Date& Date::operator = (const Date& s){

    this->m_pPointer->m_iUse--;

    if (this->m_pPointer->m_iUse == 0)

    {

        delete this->m_pPointer;

    }

    s.m_pPointer->m_iUse++;

    this->m_pPointer = s.m_pPointer;

    m_iYear = s.m_iYear;

    m_iMonth = s.m_iMonth;

    m_iDay = s.m_iDay;

   

    return *this;

}

 

=号左边-1,检查指针是否为0,右边+1赋给this.  返回this

  评论这张
 
阅读(42)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017