我对这个复制构造函数的看法是对的,还是他们在骗我
Am I right about this copy constructor, or they are lying to me?
假设你有一个班学生:
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
的名称为bruce,s
的名称为mike
strcpy函数复制char数组的内容(即所有字符,包括代码为0的终止null字符)。如果在复制构造函数中有_name=name,那么这两个构造函数都将被称为"Bruce"。
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 复制构造函数和运算符"="他们没有打印列表 l 的副本
- 我对这个复制构造函数的看法是对的,还是他们在骗我