现在的位置: 首页 > 综合 > 正文

两个构造函数,一个赋值函数的细节

2013年08月19日 ⁄ 综合 ⁄ 共 1051字 ⁄ 字号 评论关闭

一个类可以第一次生成实例时,仅可以通过1:构造函数 或者 2:copy构造函数生成!

深拷贝,前拷贝:仅发生在1:copy构造函数 或2:copy assignment函数里!
资源申请仅发生在:1:构造函数 或2:copy assignment函数里

也就是说,copy构造函数任务重大!要完成两个任务!
构造函数,及赋值函数仅完成各自的任务即可!
今天,因为copy构造函数仅完成了深拷贝,没有完成资源申请的任务debug的好长时间,当是一次复习吧。
copy构造函数的完整特别重要!!!
当类内部涉及到指针时,要么完整的实现该函数,要么
私有化声明下!

////////////////////
ClassA a(); // :调用构造函数

////////////////////
ClassA b=a; // :调用copy构造函数 相当于 classA b(a);

////////////////////
ClassA ClassA::operator+(const ClassA& rhs)
{
   ClassA tmp;
   return tmp; // :调用copy构造函数,返回一个临时变量
}

///////////////////
ClassA a;
ClassA b;
ClassA c;
c = a+b;    // :1:+算符里面return语句调用copy构造函数,生成临时变量tmp
                  // :2:=号调用 copy assainment函数 c=tmp

///////////////////
ClassA a;
ClassA b;
ClassA c = a+b; // :1:+算符里面return语句调用copy构造函数,直接生成c!!!!

 example:
ClassA
{
public:
     ClassA()
     {
           // :仅完成资源申请,及初复制
           intp = new int;
           n = 3;
     }
     ClassA( const ClassA&  rhs)
     {
          // :1:完成申请资源
          intp = new int;
          // :2:完成深拷贝
          memcpy (intp,rhs.intp);
          n = rhs.intp;
     }
     ClassA& operator=(const ClassA& rhs)
     {
           // :完成深拷贝
          memcpy (intp,rhs.intp);
     }
}

抱歉!评论已关闭.