1. 程式人生 > >類中的一些特殊函式

類中的一些特殊函式

8.7建構函式:

每個物件區別與其他物件的地方主要有兩個:①外在的區別是的名稱,②內在的區別是物件的名稱。C++中,物件的初始化是由一個特殊的成員函式來完成的,稱為建構函式。每個類都應該有自己的建構函式,它是類的成員函式。

建構函式必須滿足的條件有兩個:①建構函式的名字與類的名字相同;②建構函式沒有返回值。一般情況下,建構函式有公共的訪問屬性。

關於建構函式,需要注意:

①對於某個類,可以定義多個同名的建構函式,這些建構函式之間形成函式的過載。

②建構函式的呼叫是在定義物件的時刻進行的,且呼叫的具體建構函式根據物件定義的形式來確定。

③如果在定義類時沒有定義類的建構函式,編譯系統會在編譯時自動生成一個預設形式的建構函式,稱為預設建構函式。預設建構函式是無參的函式。

8.8解構函式

形式:

Class Student{

public:

~student()

};

它是類的一個成員函式,它的名稱是類的名字前加“~”構成,沒有返回值。

關於解構函式,需要注意:

①由於它是無參的,名字又唯一,因此解構函式不能進行過載。

②解構函式的呼叫是在物件的刪除的時刻進行的。

③如果沒有定義解構函式,系統會自動生成一個,稱為預設解構函式。

④預設解構函式只能用來釋放物件的成員資料所佔用的空間,但不包括堆空間的資源。因此,當建構函式中使用new運算子申請從堆中分配空間時,為了防止記憶體洩漏,需要具體定義解構函式,而不是使用預設解構函式。

8.9拷貝建構函式

拷貝建構函式是一種特殊的建構函式,其形式引數為本類物件的引用。

其形式Student (Student &pStudent);

常應用與以下3種情況:

①當用一個類的物件去初始化類的另一個物件時,系統會自動呼叫拷貝建構函式實現拷貝賦值。

②若函式的形參為類的物件,呼叫函式時,實參賦給形參,系統會自動呼叫拷貝建構函式實現拷貝賦值。

③當函式的返回值為類的物件時,系統呼叫拷貝建構函式實現拷貝賦值。

關於拷貝建構函式,需要注意:

①拷貝建構函式首先必須是建構函式,只是該函式要求其形參要多少本類物件的引用。

②若在類定義時沒有顯示地定義拷貝建構函式,系統會自動生成一個預設的拷貝建構函式,完成將類的成員一一複製的功能。

③拷貝建構函式與其他建構函式形成過載。

8.10淺拷貝和深拷貝

當定義拷貝建構函式時,只是完成一一對應的成員值的簡單複製,稱其為淺拷貝建構函式。但是,如果類的資料成員包含指標變數,類的建構函式必須使用new運算子為這個指標動態申請堆空間。如果此時還只是使用淺拷貝的方式進行物件的複製。最後,在退出執行時,由於兩個物件的指標指向同一個堆空間資源,當呼叫解構函式先後刪除這兩個指標的堆空間中的資源時,程式會出錯。為了解決此問題,必須定義深拷貝建構函式。


#include<iostream>
#include<cstring>
using namespace std;
class Student{
	public:
		Student(int pId,char* pName,char pSex);
		~Student();//解構函式宣告 
		Student(Student &stu);//深拷貝建構函式宣告 
		void printStudent();
		private:
			int id;
			char* name;
			char sex;
};
Student::Student(int pId,char *pName,char pSex)
{
	cout<<"constructing..."<<endl;
	id=pId;
	name=new char[strlen(pName)+1];
	if(name!=0)
	strcpy(name,pName);
	sex=pSex;
}
Student::Student(Student& stu)//深拷貝函式 
{
	cout<<"deep copy contructing..."<<endl;
	id=stu.id;
	name=new char[strlen(stu.name)+1];
	if(name!=0)
	strcpy(name,stu.name);
	sex=stu.sex; 
} 
Student::~Student()
{
	cout<<"destructing..."<<endl;
	delete[] name;
}
void Student::printStudent()
{
	cout<<"id: "<<id<<","<<"name: "<<name<<","<<"sex: "<<sex<<endl;
}
int main()
{
	Student stu(1,"wang",'M');
	Student stu1=stu;
	stu.printStudent();
	stu1.printStudent();
    return 0;
}