我是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