Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 复制构造函数是否用于对象初始化?它是如何工作的?深拷贝和浅拷贝的区别是什么?_C++ - Fatal编程技术网

C++ 复制构造函数是否用于对象初始化?它是如何工作的?深拷贝和浅拷贝的区别是什么?

C++ 复制构造函数是否用于对象初始化?它是如何工作的?深拷贝和浅拷贝的区别是什么?,c++,C++,复制构造函数是否用于对象初始化?它是如何工作的?深拷贝和浅拷贝的区别是什么 卷影复制:新对象指向旧对象指向的相同内存位置,这意味着两个对象之一的值的任何更改都将影响另一个对象。特别是,若您处理这两个对象中的一个,则另一个也将被处理 深度复制:将内存分配给新对象,该内存中的值等于位于旧对象内存位置的值。适用于具有表或向量等成员的对象 若您不为类编写复制构造函数,编译器将为您编写一个通常执行卷影复制的构造函数。要编写副本构造函数,您可以像编写普通构造函数一样编写,但参数是对同一类的对象的引用

复制构造函数是否用于对象初始化?它是如何工作的?深拷贝和浅拷贝的区别是什么

卷影复制:新对象指向旧对象指向的相同内存位置,这意味着两个对象之一的值的任何更改都将影响另一个对象。特别是,若您处理这两个对象中的一个,则另一个也将被处理

深度复制:将内存分配给新对象,该内存中的值等于位于旧对象内存位置的值。适用于具有表或向量等成员的对象

若您不为类编写复制构造函数,编译器将为您编写一个通常执行卷影复制的构造函数。要编写副本构造函数,您可以像编写普通构造函数一样编写,但参数是对同一类的对象的引用

   class B    //With copy constructor
  {
       private:
       char *name;
       public:
       B()
       {
       name = new char[20];
       }
       ~B()
       {
       delete name[];
       }
 //Copy constructor
       B(const B &b)
       {
       name = new char[20];
       strcpy(name, b.name);
       }
  };

卷影复制:新对象指向旧对象指向的相同内存位置,这意味着两个对象之一的值的任何更改都将影响另一个对象。特别是,若您处理这两个对象中的一个,则另一个也将被处理

深度复制:将内存分配给新对象,该内存中的值等于位于旧对象内存位置的值。适用于具有表或向量等成员的对象

若您不为类编写复制构造函数,编译器将为您编写一个通常执行卷影复制的构造函数。要编写副本构造函数,您可以像编写普通构造函数一样编写,但参数是对同一类的对象的引用

   class B    //With copy constructor
  {
       private:
       char *name;
       public:
       B()
       {
       name = new char[20];
       }
       ~B()
       {
       delete name[];
       }
 //Copy constructor
       B(const B &b)
       {
       name = new char[20];
       strcpy(name, b.name);
       }
  };

复制构造函数用于使用以前创建的同一类对象初始化新对象。默认情况下,编译器编写了一个浅拷贝。当不涉及动态内存分配时,浅拷贝工作正常,因为当涉及动态内存分配时,两个对象将指向堆中的同一内存位置,因此为了消除此问题,我们编写了深拷贝,以便两个对象在内存中都有自己的属性副本


为了阅读包含完整示例和解释的详细信息,您可以阅读本文

复制构造函数用于使用以前创建的同一类对象初始化新对象。默认情况下,编译器编写了一个浅拷贝。当不涉及动态内存分配时,浅拷贝工作正常,因为当涉及动态内存分配时,两个对象将指向堆中的同一内存位置,因此为了消除此问题,我们编写了深拷贝,以便两个对象在内存中都有自己的属性副本


为了阅读包含完整示例和解释的详细信息,您可以阅读本文

你有没有读过维基百科的文章()?好像你马上就要参加工作面试了?没人能告诉我这个问题的答案?我想,这不是火箭science@ankit当前位置你似乎在说你懒得读这篇文章,尽管它能回答你的问题。为什么这里有人要帮你?你有没有读过维基百科的文章()?好像你马上就要面试了?没有人能告诉我这个问题的答案?我想,这不是火箭science@ankit当前位置你似乎在说你懒得读这篇文章,尽管它能回答你的问题。为什么这里有人要帮你?
strcpy
不是你想要的。(事实上,你根本不想要
char*
,你想要的是
std::string
…)
strcpy
不是你想要的。(事实上,您根本不想要
char*
,您想要的是
std::string
。)