为什么以及何时应该在C++中使用Copy Constructor?为什么不鼓励浅拷贝呢?

Muh*_*man 2 c++ constructor

让我们说我们创建一个Student类的对象,我们创建两个实例/对象类Student(即StudentA和StudentB).我们使用浅层复制来初始化B的数据成员,如下所示:

学生B =学生A;

然后我们摧毁了StudentB.我们在这里面临悬空指针的情况吗?为什么以及如何?请解释.

Chr*_*isW 5

我们在这里面临悬空指针的情况吗?为什么以及如何?请解释.

这取决于学生的实施.如果学生看起来像这样......

class Student
{
public:
  char* m_name;
  Student(const char* name)
  {
    m_name = new char[strlen(name)+1];
    strcpy(m_name,name);
  }
  ~Student()
  {
    delete[] m_name;
  }
};
Run Code Online (Sandbox Code Playgroud)

...然后出现问题:当你复制一个学生时,你有两个指向相同m_name数据的指针,当两个学生实例被删除时,m_name数据被删除两次,这是非法的.为避免该问题,Student需要一个显式的复制构造函数,以便复制的Student具有指向不同m_name数据的指针.

或者,如果学生看起来像这样......

class Student
{
public:
  std::string m_name;
  Student(const char* name)
    : m_name(name)
  {
  }
};
Run Code Online (Sandbox Code Playgroud)

...然后没有问题,因为魔术(即显式复制构造函数)是在std :: string类中实现的.

总之,如果类包含分配和删除的指针,则需要显式复制构造函数(或者显式没有复制构造函数,但在任何一种情况下,不仅仅是默认构造函数).