复制C++中动态对象的构造函数

Copy constructor for dynamic object in C++

本文关键字:构造函数 对象 动态 C++ 复制      更新时间:2023-10-16

我想要一种关于复制构造函数的方法

class A {
    int *a;
   public :
        A():a(0){
                      a = new int;
                       *a =0;}
           A (const A & ob) {
            cout<<"In side copy constructor ..."<<endl;
            a = new int;
            *a = *ob.a;
           }
          ~A() {  cout <<"IN side destructor ..."<<endl;delete a;}
          void setdata(int ip) { *a = ip;}
          int getdata() { return *a;}
     };
int main() {
  A *dob1 = new A();
  dob1->setdata(5);
  A sob1= *dob1; //copy constructor gets called;
 //but for this case copy constructor will not be called
 // how should i write copy constructor for this case
  A *dob2 = dob1; //whether copy constructor will be called or not 
   cout<<endl;
      cout<<" dob1 data "<< dob1->getdata()<<endl;
        cout<<" sob1 data " << sob1.getdata()<<endl;
      cout<<" dob2 data "<< dob2->getdata()<<endl;
   delete dob1;
   return 0;
}

因此,在这种情况下,将调用如何创建副本构造函数。

请回复我。

A *dob2 = dob1;中,对象不被复制,指针是.

CCD_ 2是一个完全不同的类型。指针dob2将指向dob1,但它本身不是对象,因此不要期望调用复制构造函数。

如果执行A* dob2 = new A(dob1);,将调用复制构造函数,创建一个对象,dob2将指向它,但它仍然不是对象本身,而是一个指针。

使用原始指针处理动态内存非常麻烦。更好的方法是使用像std::vector, std::deque这样的STL容器,或者使用像std::unique_ptr, std::shared_ptr这样的智能指针来处理动态内存。

如果有人真的想知道如何通过复制构造函数使用另一个现有的动态对象来创建一个新的动态对象,那么看看下面的代码。小心使用!

class A {
    public:
        A() : a{ new int {0} } { std::cout << "Inside default constructor ..." << endl;}
        A(const A& ob) {
            std::cout << "Inside copy constructor ..." << endl;
            a = new int;
            *a = *ob.a;
        }
        ~A() { 
            std::cout << "Inside destructor ..." << endl; 
            delete a; 
            a = nullptr;
        }
        void setdata(int ip) { *a = ip; }
        int getdata()        { return *a; }
    private:
        int* a;
};
int main() {
    // Dynamic Object  - 1
    A* dob1 = new A();     // Calls default constructor
    dob1->setdata(5);
    // Stack Object   - 1
    A sob1 = *dob1;         // Calls copy constructor
    // Dynamic Object - 2
    A* dob2 = new A(*dob1); // Calls copy constructor
    cout << " dob1 data " << dob1->getdata() << endl;
    cout << " sob1 data " << sob1.getdata() << endl;
    cout << " dob2 data " << dob2->getdata() << endl;
    delete dob2;
    delete dob1;
}

输出:

Inside default constructor ...
Inside copy constructor ...
Inside copy constructor ...
 dob1 data 5
 sob1 data 5
 dob2 data 5
Inside destructor ...
Inside destructor ...
Inside destructor ...