rdu-cpp

杨柳不折
随笔 - 13, 文章 - 0, 评论 - 4, 引用 - 0
数据加载中……

位拷贝和值拷贝

进入用户个人空间
加为好友
发送私信
在线聊天
  • chenxiong115
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-11-07 18:54:4454楼 得分:0
两个对象经过位拷贝之后,除了这两个对象的地址不同以为,它们成员变量的值绝对相同。

要用值拷贝就是说要你在有指针成员变量的时候 一定要写拷贝构造函数和重载=。

写程序注意就行。

ASSERT(位拷贝==浅拷贝);
ASSERT(值拷贝==深拷贝);


进入用户个人空间
加为好友
发送私信
在线聊天
  • jinder22
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-11-21 16:34:1789楼 得分:0
#include <iostream>
#include <typeinfo>
using  namespace  std;
class CBase
{
    public:
    int *p;
    CBase(){}
    ~CBase()
    {
        cout < <"释放堆地址" < <p < <endl;
            delete p;
   
    }
    CBase(const CBase &cbase)
    {
    p=cbase.p;//这样跟默认的位拷贝没有区别
    //p=new int;
    //*p = *(cbase.p);  // 这样才是深拷贝!!
    }
    CBase(int *p)
    {
        this->p = p;
    }
   
   
   
    CBase &operator=(const CBase &cbase)//赋值函数
    {
        p=cbase.p;
    }   
   
   
    void print()
    {
        cout < <"对象" < <this < <":" < <"地址:" < <p < <"\t" < <"值:" < <*p < <endl;
    }
};
int main()
{
    //int a=8;
    //CBase p(&a);//错误,最后p指向了栈内存了
    int *a = new int(8);
    int *b = new int(4);
    int i =1;
    int j =2;
    int *ii,*pp;
    *ii=2,*pp=4;
    cout < < *ii < < "  " < < ii < < endl;
    cout < < *pp < < "  " < < pp < < endl;
    //pp=NULL;
    //pp=ii;
    *pp=*ii;
    cout < < *ii < < "  " < < ii < < endl;
    cout < < *pp < < "  " < < pp < < endl;
   
    cout < < i < < &i;
   
   
    CBase p(a);
    p.print();
    CBase p1(p);
    p1.print();
    CBase p2(b);
    p2=p;
    p2.print();
   
    return 0;
}

posted on 2009-01-20 21:05 rdu 阅读(1345) 评论(1)  编辑 收藏 引用 所属分类: 论坛拾珠


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理