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

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

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

2019-11-14 12:25:11
字體:
來源:轉載
供稿:網友

  今天在學習時隨手編了一個小程序, 然而運行時卻發現總在出錯,而且每次的斷電都顯示在析構函數的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";	}由此可以得到一個教訓:當成員中含指針是, 必須要自定義拷貝構造函數。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 清新县| 铁力市| 阳城县| 略阳县| 松溪县| 河南省| 玛沁县| 清原| 永福县| 芜湖县| 邯郸县| 哈巴河县| 崇左市| 福鼎市| 岑巩县| 延川县| 吉林市| 丽水市| 嘉禾县| 龙南县| 平遥县| 龙门县| 徐州市| 曲沃县| 华亭县| 岳阳市| 忻州市| 彝良县| 昌乐县| 乐昌市| 榆社县| 浙江省| 沂水县| 弥勒县| 板桥市| 同心县| 德州市| 二连浩特市| 涿鹿县| 九龙坡区| 桑植县|