1. 程式人生 > >C++之建構函式,解構函式,拷貝建構函式

C++之建構函式,解構函式,拷貝建構函式

一、定義

    建構函式:是在一個定義在類裡面的函式,它的作用是在你建立這個類的物件時被自動呼叫。

                    如果你自己定義了則呼叫自己定義的,否則呼叫預設的。

    解構函式:是一個在類裡面定義的函式,它的作用是在你的類物件死亡時被呼叫刪除這個類對

                    象同樣的你自己定義了則呼叫自己的,否則呼叫預設的。

    在瞭解拷貝建構函式之前先要了解深拷貝和淺拷貝:

         如果一個類擁有資源,當這個類的物件發生複製時會給新的物件進行資源分配,那麼我們稱

         之為深拷貝,否則稱為淺拷貝。

    拷貝建構函式:在你未定義拷貝建構函式時,當你的類物件進行復制時預設呼叫的是c++提供的

                            拷貝建構函式,即為淺拷貝;若你在定義拷貝建構函式裡分配了新物件所需要的

                            資源則為深拷貝。

二、使用

    在這裡我用一個類來對建構函式,解構函式以及拷貝建構函式進行說明。

    拷貝建構函式是在類物件複製的時候會被呼叫。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


using namespace std;


class A
{
	public :
		A(const char *p)
		{
			str=new char[10];
			strcpy(str,p);
			printf("這是A的建構函式\n");
		}
		A(const A &c)
		{
			str = new char[10];
			if(str!=0)
			strcpy(c.str,str);
			printf("這是A的拷貝建構函式\n");	
		}		
		~A()
		{
			delete  str;
			printf("這是A的解構函式\n"); 
		}
	public :
		    char *str;	
};


class b:public A
{
	public :
		b(const char *s,const char *p):A(p)//注意子類建構函式的寫法當父類和子類的建構函式都含有引數時
		{
			string = new char[10]; 
			strcpy(string,s);
			str=new char[10];
			strcpy(str,p);
			printf("這是b的建構函式\n");
		}
		b(const b &c):A(c)//!注意子類拷貝建構函式的寫法
		{	
			this->string = new char[10];
			strcpy(c.string,string);
			this->str = new char[10];
			strcpy(c.str,str);
			printf("這是b的拷貝建構函式\n"); 
		}
		~b()
		{
			delete string;
			printf("這是b的解構函式\n"); 
		}
	public :
		char *string;	
};
int main()
{
	A a("lucifer");
	printf("----------------------\n");
	b c("lucifer","devil");
	printf("----------------------\n");
	A d = a;
	printf("----------------------\n");		
}	


    在這裡我們看到了先呼叫了父類的建構函式,然後又呼叫了子類的建構函式。在析構時又先呼叫了子類的

    解構函式然後呼叫了父類的解構函式。

    然後要注意了當父類和子類的建構函式和拷貝建構函式都含有引數時,你必須注意到建構函式的初始化列表,

    還有拷貝建構函式。

    !歡迎各位來指出不足之處