1)c++中的類可以定義與類名相同的特殊成員函式,這種與類名相同的成員函式叫做構
造函式2)沒有任何返回型別的宣告
3)一般情況下 c++編譯器會自動呼叫建構函式,在一些情況下則需要手工呼叫建構函式
析構函式定義及呼叫
1)c++中的類可以定義乙個特殊的成員函式清理物件,這個特殊的成員函式叫做析構函
數,語法:~classname()
2)析構函式沒有引數也沒有任何返回型別的宣告
3)析構函式在物件銷毀時自動被呼叫
例子:
class counter
private:
// 資料成員
int m_value;
}
該類物件被建立時,編譯系統為物件分配記憶體空間,並自動呼叫該建構函式->由建構函式完成成員的初始化工作
counter c1;
編譯系統為物件c1的每個資料成員(m_value)分配記憶體空間,並呼叫建構函式counter( )自動地初始化物件c1的m_value值設定為0
故:建構函式的作用:初始化物件的資料成員。
1.無引數建構函式
2.一般帶參建構函式
3.複製建構函式
4.賦值建構函式
class complex
// 一般建構函式(也稱過載建構函式)
// 一般建構函式可以有各種引數形式,乙個類可以有多個一般建構函式,前提是引數的個數或者型別不同(基於c++的過載函式原理)
// 例如:你還可以寫乙個 complex( int num)的建構函式出來
// 建立物件時根據傳入的引數不同呼叫不同的建構函式
complex(double real, double imag)
//也可以寫成序列化初始模式,如下:
// complex(double real, double imag): m_real(real),m_imag(imag) {}
// 複製建構函式(也稱為拷貝建構函式)
// 複製構造函式引數為類物件本身的引用,用於根據乙個已存在的物件複製出乙個新的該類的物件,一般在函式中會將已存在物件的資料成員的值複製乙份到新建立的物件中
// 若沒有顯示的寫複製建構函式,則系統會預設建立乙個複製建構函式,但當類中有指標成員時,由系統預設建立該複製建構函式會存在風險,具體原因請查詢 有關 「淺拷貝」 、「深拷貝」的文章論述
complex(const complex & c)
// 型別轉換建構函式,根據乙個指定的型別的物件建立乙個本類的物件,
//需要注意的一點是,這個其實就是一般的建構函式,但是對於出現這種單引數的建構函式,c++會預設將引數對應的型別轉換為該類型別,有時候這種隱私的轉換是我們所不想要的,所以需要使用explicit來限制這種轉換。
// 例如:下面將根據乙個double型別的物件建立了乙個complex物件
complex(double r)
// 等號運算子過載(也叫賦值建構函式)
// 注意,這個類似複製建構函式,將=右邊的本類物件的值複製給等號左邊的物件,它不屬於建構函式,等號左右兩邊的物件必須已經被建立
// 若沒有顯示的寫=運算子過載,則系統也會建立乙個預設的=運算子過載,只做一些基本的拷貝工作
complex &operator=( const complex &rhs )
// 複製等號右邊的成員到左邊的物件中
this->m_real = rhs.m_real;
this->m_imag = rhs.m_imag;
// 把等號左邊的物件再次傳出
// 目的是為了支援連等 eg: a=b=c 系統首先執行 b=c
// 然後執行 a= ( b=c的返回值,這裡應該是複製c值後的b物件)
return *this;
}};
下面使用上面定義的類物件來說明各個建構函式的用法:
int main()
如果沒有自定義複製建構函式,則系統會建立預設的複製建構函式,但系統建立的預設複製建構函式只會執行「淺拷貝」,即將被拷貝物件的資料成員的 值一一賦值給新建立的物件,若該類的資料成員中有指標成員,則會使得新的物件的指標所指向的位址與被拷貝物件的指標所指向的位址相同,delete該指標 時則會導致兩次重複delete而出錯。下面是示例:
#include #include class person
}
// 系統建立的預設複製建構函式,只做位模式拷貝
person(person & p)
~person( )
private :
char * m_pname;
};void main( )
// 下面自己設計複製建構函式,實現「深拷貝」,即不讓指標指向同一位址,而是重新申請一塊記憶體給新的物件的指標資料成員
person(person & chs);
// 則新建立的物件的m_pname與原物件chs的m_pname不再指向同一位址了
}
1. 乙個類中包含另外乙個類的成員,則必須使用初始化列表(進入建構函式體內前),呼叫該類的建構函式進行初始化
2.類成員中若有 const 修飾,必須在物件初始化的時候,給 const int m 賦值
當類成員中含有乙個 const 物件時,或者是乙個引用時,他們也必須要通過成員初始化列表進行初始化
例子:
#include "iostream"
#include #include using namespace std;
class abc
~abc()
protected:
private:
int a;
int b;
int c;
};class myd
//成員函式訪問靜態資料成員
void shownum()
} ;int counter :: num = 0 ;//在類外對靜態成員初始化
void main ()
結果:例子2:
#includeclass counter
int mem; //公有資料成員
static int smem ; //公有靜態資料成員
} ;int counter :: smem = 1 ; //初始值為 1
void main()
cout<1. 靜態成員函式提供不依賴於類資料結構的共同操作,它沒有 this 指標
2. 在類外呼叫靜態成員函式用 「類名 :: 」作限定詞,或通過物件呼叫
3. 靜態成員函式可以在類內宣告,類外實現,此時類外前面不能寫static
4. 靜態成員函式中,不能使用普通變數。
靜態成員變數屬於整個類的,分不清楚不同變數是屬於那個物件的
#include "iostream"
#include #include using namespace std;
class bb
int geta()
void setc(int myc)
//在類內宣告定義靜態成員函式
static void seta(int i,bb *ptr);
//在類內定義並實現靜態成員函式
static void getmen()
int main()
C 基礎 類與物件
examples class stock stock stock const string company,long shares 建構函式 stock stock 預設建構函式 stock stock 析構函式 將會在物件過期時自動呼叫 stock car 使用預設建構函式 stock food ...
C 基礎溫習 6 C 操作檔案
再程式設計的過程中操作檔案是我們經常可以遇到的,本文用來寫些操作檔案的簡單例項。直接上 using system using system.io namespace testfile using binaryreader br new binaryreader file.open streamfil...
C 類與物件基礎與使用
class a 析構函式 a 申明函式成員 void show 建構函式 無返回值 函式名與類名相同,在物件宣告初始化物件變數 析構函式 無返回值 函式名與類名相同 類名 生命週期結束時自動呼叫,用於刪除類內指標成員變數在堆區分配的空間 或控制代碼 注 若類中沒有定義析構函式,則存在預設的什麼都不做...