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
。)