21xrx.com
2024-11-08 22:09:02 Friday
登录
文章检索 我的文章 写文章
C++对象复制
2023-06-27 17:49:39 深夜i     --     --
C++ 对象复制 复制构造函数 深拷贝 浅拷贝

C++对象复制指的是将一个对象的值复制到另一个对象中。这样的复制可以通过两种方式实现:浅复制和深复制。

浅复制是将对象的属性值逐一复制到新对象中。两个对象的指针指向同一块内存。当一个对象的指针指向的值变化时,另一个对象的指针指向的值也会随之变化。这种复制方式比较快,但容易出现问题。

深复制是将对象的属性值逐一复制到新对象中,并为新对象分配一块与原对象不同的内存空间。两个对象的指针分别指向各自的内存空间,互不干扰。这种复制方式比较慢,但更为安全可靠。

C++类对象默认采用浅复制。如果需要使用深复制,可以重载赋值操作符“=”。例如:


class Student{

public:

  int age;

  char* name;

  Student()

    age = 0;

    name = NULL;

  

  Student(const Student& stu){

    age = stu.age;

    name = new char[strlen(stu.name) + 1];

    strcpy(name, stu.name);

  }

  Student& operator=(const Student& stu){

    if (this != &stu){

      age = stu.age;

      delete [] name;

      name = new char[strlen(stu.name) + 1];

      strcpy(name, stu.name);

    }

    return *this;

  }

  ~Student(){

    delete [] name;

  }

};

int main(){

  Student stu1;

  stu1.age = 18;

  stu1.name = new char[5];

  strcpy(stu1.name, "John");

  Student stu2;

  stu2 = stu1; //调用重载的“=”赋值操作符

  delete [] stu1.name;

  //stu2中的name指向的空间并不受影响

  cout << "stu1.age=" << stu1.age << " stu1.name=" << (int*)(stu1.name) << endl; //输出 stu1.age=18 stu1.name=0

  cout << "stu2.age=" << stu2.age << " stu2.name=" << (int*)(stu2.name) << endl; //输出 stu2.age=18 stu2.name=0xabcdef

  return 0;

}

上述代码中,重载的“=”赋值操作符实现了深复制。

总之,在C++中,对象复制是一项非常基本的操作,若不重载“=”赋值操作符,在面对动态分配内存的情况下,就可能会出现各种危险的情况。因此,在需要进行复制操作时一定要注意浅复制和深复制的区别。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复