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

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

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

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 耒阳市| 淮安市| 奉新县| 江山市| 顺义区| 西青区| 肇源县| 宝丰县| 左贡县| 沭阳县| 清徐县| 上栗县| 威远县| 内黄县| 宁都县| 阿城市| 阿鲁科尔沁旗| 兴城市| 河间市| 吉安县| 郯城县| 苏州市| 新疆| 贺州市| 竹溪县| 社旗县| 武城县| 新巴尔虎左旗| 高碑店市| 大姚县| 滦平县| 泰安市| 班戈县| 锡林郭勒盟| 军事| 饶平县| 大关县| 临潭县| 都匀市| 仲巴县| 海阳市|