我对这个复制构造函数的看法是对的,还是他们在骗我

Am I right about this copy constructor, or they are lying to me?

本文关键字:他们 构造函数 看法 复制      更新时间:2023-10-16

假设你有一个班学生:

class Student{
  char *_name;
  Student(char *name){
  _name = new char[strlen(name)+1];
  strcpy(_name, name);
 }
 void setName(char *name){
  _name = new char[strlen(name)+1];
  strcpy(_name, name);
 }
 char* getName(){return _name;}
}

现在,它只是一个基础类。当我这样做时:

Student s("Mike");
   Student s1 = s; // calls default copy constructor
   s1.setName("Bruce");
   cout << s.getName();
   cout << s1.getName();

它们现在不应该都被称为Bruce吗?因为复制构造函数正在将地址复制到源字符,并且两个指针都指向同一个东西?

最初,在复制之后,两个对象的_name指针都指向内存中的同一字符串。但是,当您调用setName时,它会分配一个具有不同内容的字符串,并将s1_name设置为指向该字符串。所以最后,这两个对象引用了不同的字符串。

我想这就是您要查找的代码:

class Student{
private:
  char *_name;
public:
  Student(const char *const name) : _name(nullptr) {
      setName(name);
 }
~Student() { delete[] _name; }
 void setName(const char *const name) {
  delete[] _name;
  _name = new char[strlen(name)+1];
  strcpy(_name, name);
 }
 const char* getName() const {return _name;}
};

由于它们是两个不同的学生对象,因此可以有不同的名称。因此,在您的代码中,s1的名称为bruces的名称为mike

strcpy函数复制char数组的内容(即所有字符,包括代码为0的终止null字符)。如果在复制构造函数中有_name=name,那么这两个构造函数都将被称为"Bruce"。