国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

學習筆記.錯誤整理 拷貝構造函數的重要性

2019-11-14 11:54:44
字體:
來源:轉載
供稿:網友

  今天在學習時隨手編了一個小程序, 然而運行時卻發現總在出錯,而且每次的斷電都顯示在析構函數的delete 一行。起初時時百思不得,后來才發現問題所在,自我反思后覺得這是一個對我這樣的初學者來講很重要的問題。   問題出在PRint函數上是很明顯的,但到底是什么原因呢?#include<iostream>using namespace std;class Person{public :	Person()	{		name = NULL;		cout << "Default consturctor called!/n/n";	}	Person(char *str)	{		name = new char [strlen(str) + 1];		strcpy_s(name, strlen(str) + 1, str);		cout << "Consturctor called!/n/n";	}		~Person()	{		delete[] name;//斷點總在此處		cout << "Destructor called!/n/n";	}	friend ostream& Operator << (ostream& out, Person &A)	{		out << A.name << endl;		return out;	}	friend istream& operator >> (istream& in, Person &A)	{		char temp[10];		in.getline(temp, 10);		int len = strlen(temp) + 1;		A.name = new char[len];		strcpy_s(A.name, len, temp);		return in;	}	friend void Print(Person a)	{		cout << a.name << endl;	}private :	char *name;};int main(){	Person a("mike");	//cin >> a;	Print(a);	//cout << a;	system("pause");	return 0;} 

  關鍵在于深淺拷貝的問題,這里可以看到在Print函數中傳過去的是一個對象,要命就要命在成員中有一個指針。   我們知道, C++中將對象作為參數時,并非將對象直接傳過去,而是調用拷貝構造函數傳過去一個對象的副本。而在函數結束后調用析構函數。當函數中沒有定義拷貝構造函數時,就會調用默認的拷貝構造函數。但不幸的是這個默認的函數采用的是“淺拷貝”,也就是說它僅僅將指針本身的值復制過去。造成的后果是兩個指針指向同一處,這樣在函數結束后調用析構函數釋放該處內存空間, 在程序結束后又是釋放一次,自然就導致了錯誤。   解決方法很簡單,定義一個拷貝構造函數就行了。

Person(const Person &a)	{		name = new char[strlen(a.name) + 1];		strcpy_s(name, strlen(a.name) + 1, a.name);		cout << "Copy constructor called!/n/n";	}由此可以得到一個教訓:當成員中含指針是, 必須要自定義拷貝構造函數。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 抚松县| 商水县| 乐业县| 布尔津县| 白水县| 上思县| 涿鹿县| 合作市| 郴州市| 永平县| 将乐县| 曲阜市| 桐梓县| 中方县| 濉溪县| 平遥县| 东乡| 巴青县| 栖霞市| 红桥区| 西藏| 荆州市| 兴安盟| 岳普湖县| 南丹县| 海门市| 太和县| 九龙坡区| 洮南市| 朔州市| 普兰店市| 三门县| 深州市| 桃园县| 蓬溪县| 岳西县| 北碚区| 平武县| 台江县| 和田县| 乡宁县|