C语言的复制构造函数是如何实现深拷贝或浅拷贝的?

2026-04-12 00:002阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计785个文字,预计阅读时间需要4分钟。

C语言的复制构造函数是如何实现深拷贝或浅拷贝的?

pythondef copy_structure(original): new_object=original.__class__.__new__(original.__class__) for key, value in original.__dict__.items(): if isinstance(value, (list, dict, set)): new_object.__dict__[key]=copy_structure(value) else: new_object.__dict__[key]=value return new_object

1、复制构造函数用于将一个对象复制到新创建的对象中。也就是说,它用于初始化过程中(包括按值传递参数),而不是常规的赋值过程中。

#include <iostream> class A { public: A(){ std::cout << "default" << std::endl; } }; int main(){ A a; A b(a); return 0; }

在这个例子中构造函数只调用了一次。A b(a)并没有调用构造函数,这个就属于对象在初始化阶段使用另一个对象当做参数进行构造。实际调用的是复制构造函数。它接受一个指向类对象的常量引用作为参数。

A(const A &);

虽然我们没有定义,编译期会自动生成一个。默认的复制构造函数逐个复制非静态成员(成员复制也称为浅复

制),复制的是成员的值。如果成员本身就是类对象,则将使用这个类的复制构造函数来复制成员对象。

2、下面这4种都会调用复制构造函数。

A a; A b(a); A c = a; A d = A(a); A *p = new A(a);

最后一个使用a初始化一个匿名对象,并将新对象的地址赋给p指针。

3、每当程序生成了对象副本时,编译器都将使用复制构造函数。具体地说,当函数按值传递对象或函数返回对象时,都将使用复制构造函数。记住,按值传递意味着创建原始变量的一个副本。编译器生成临时对象时,也将使用复制构造函数。

4、如果对象里面有指针

char *str;

如果使用默认的复制构造函数是按值进行复制的,复制的并不是字符串,而是一个指向字符串的指针。这样会造成多个对象中的这个指针指向了同一个地址,调用析构函数时会重复释放指针指向的这个地址。

解决类设计中这种问题的方法是进行深度复制(deepcopy)。也就是说,复制构造函数应当复制字符串并将副本的地址赋给str成员,而不仅仅是复制字符串地址。这样每个对象都有自己的字符串,而不是引用另一个对象的字符串。调用析构函数时都将释放不同的字符串,而不会试图去释放已经被释放的字符串。如果类中包含了使用new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据,而不是指针。

C语言的复制构造函数是如何实现深拷贝或浅拷贝的?

本文共计785个文字,预计阅读时间需要4分钟。

C语言的复制构造函数是如何实现深拷贝或浅拷贝的?

pythondef copy_structure(original): new_object=original.__class__.__new__(original.__class__) for key, value in original.__dict__.items(): if isinstance(value, (list, dict, set)): new_object.__dict__[key]=copy_structure(value) else: new_object.__dict__[key]=value return new_object

1、复制构造函数用于将一个对象复制到新创建的对象中。也就是说,它用于初始化过程中(包括按值传递参数),而不是常规的赋值过程中。

#include <iostream> class A { public: A(){ std::cout << "default" << std::endl; } }; int main(){ A a; A b(a); return 0; }

在这个例子中构造函数只调用了一次。A b(a)并没有调用构造函数,这个就属于对象在初始化阶段使用另一个对象当做参数进行构造。实际调用的是复制构造函数。它接受一个指向类对象的常量引用作为参数。

A(const A &);

虽然我们没有定义,编译期会自动生成一个。默认的复制构造函数逐个复制非静态成员(成员复制也称为浅复

制),复制的是成员的值。如果成员本身就是类对象,则将使用这个类的复制构造函数来复制成员对象。

2、下面这4种都会调用复制构造函数。

A a; A b(a); A c = a; A d = A(a); A *p = new A(a);

最后一个使用a初始化一个匿名对象,并将新对象的地址赋给p指针。

3、每当程序生成了对象副本时,编译器都将使用复制构造函数。具体地说,当函数按值传递对象或函数返回对象时,都将使用复制构造函数。记住,按值传递意味着创建原始变量的一个副本。编译器生成临时对象时,也将使用复制构造函数。

4、如果对象里面有指针

char *str;

如果使用默认的复制构造函数是按值进行复制的,复制的并不是字符串,而是一个指向字符串的指针。这样会造成多个对象中的这个指针指向了同一个地址,调用析构函数时会重复释放指针指向的这个地址。

解决类设计中这种问题的方法是进行深度复制(deepcopy)。也就是说,复制构造函数应当复制字符串并将副本的地址赋给str成员,而不仅仅是复制字符串地址。这样每个对象都有自己的字符串,而不是引用另一个对象的字符串。调用析构函数时都将释放不同的字符串,而不会试图去释放已经被释放的字符串。如果类中包含了使用new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据,而不是指针。

C语言的复制构造函数是如何实现深拷贝或浅拷贝的?