我是C++的新手,我被问到一个问题,我实际上无法回答:什么时候是重载或定义C++自己的拷贝构造函数的最佳时机?什么时候最好定义一个拷贝构造函数
0
A
回答
0
如果您的实例需要深度复制,那么您必须定义复制构造函数。复制构造函数只做浅拷贝。 举个例子,如果你的类有一个char指针。
请参阅此代码示例。
#include <iostream>
using namespace std;
class Student
{
public:
char * m_name;
int m_age;
Student(char* name, int age){
int name_len = strlen(name)+1;
m_name= new char[name_len];
strncpy(m_name, name, name_len);
m_age = age;
}
};
int main()
{
char* firstStudent = "Kevin stefan";
Student kevin(firstStudent,1);
Student jhon = kevin;
char* secondStudent = "Jhon Mac";
strncpy(jhon.m_name,secondStudent,strlen(secondStudent));
cout << kevin.m_name << endl;
system("pause");
return 0;
}
该程序的结果打印Jhon Macefan
。因为两个Student实例都指向相同的内存位置,因为它的浅拷贝。
在这种情况下,你必须定义一个copy constructor
深拷贝这样
Student::Student(const Student& stu)
{
int name_len = strlen(stu.m_name);
m_name = new char[name_len+1];
strncpy(m_name, stu.m_name, name_len);
m_age = stu.m_age;
}
相关问题
- 1. 什么时候在cpp中调用拷贝构造函数?
- 2. 为什么隐式拷贝构造函数调用基类拷贝构造函数并且定义的拷贝构造函数没有?
- 3. 一个拷贝构造函数调用
- 4. 使用拷贝构造函数有什么好处?
- 5. 拷贝构造函数
- 6. 拷贝构造函数knowlege
- 7. 拷贝构造函数++
- 8. 的拷贝构造函数
- 9. 用模板拷贝构造函数替换默认拷贝构造函数
- 10. C++中的隐式定义的拷贝构造函数是否也为成员调用拷贝构造函数?
- 11. C++是什么Derived默认拷贝构造函数初始化Base拷贝构造函数用?
- 12. 拷贝构造函数和函数从
- 13. 这个拷贝构造函数有什么问题?
- 14. 为什么这个拷贝构造函数不工作?
- 15. D结构体拷贝构造函数
- 16. 拷贝构造
- 17. 虚拟拷贝构造函数(克隆函数)有什么意义?
- 18. 带有一个参数的私有拷贝构造函数和构造函数
- 19. 什么时候注入构造函数,什么时候是CDI
- 20. 拷贝赋值为未实现的拷贝构造函数
- 21. 如何在BaseClass拷贝构造函数中拷贝SubClass对象
- 22. 定义我自己的拷贝构造函数
- 23. 错误:隐式声明的拷贝构造函数的定义
- 24. 禁止在继承类中定义拷贝构造函数
- 25. 拷贝/转换构造函数的定义(常量/非const)
- 26. 重新定义拷贝构造函数没有得到执行
- 27. RVO/NRVO和公开的未定义拷贝构造函数
- 28. 移动构造函数和非常拷贝构造函数
- 29. Java ArrayList的拷贝构造函数是浅拷贝还是深拷贝?
- 30. 为什么我的拷贝构造函数不被调用?
拷贝构造函数的目的是创建对象的副本。如果默认的复制构造函数没有正确地创建一个副本,那么你应该禁用它,或者编写你自己的一个能够正确创建副本的副本。如果你永远不需要复制你的对象,你可以禁用它。 –
当您在复制/共享时管理需要特殊处理的资源时,也是必要的。一些背景信息:http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)和http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization – Enigma