9 C 類建構函式

2021-04-14 15:38:52 字數 2222 閱讀 3386

.類建構函式

(前言,定義,基類與派生類,設計指導)

1.前言

大部分物件在使用之前沒有正確的初始化是c++出錯的主要領域

引入類的建構函式是正確的初始化類的物件

一般什麼時候觸發並呼叫類的建構函式呢?

答案是:當我們用類來定義乙個類變數的時候,

如:class demo; 宣告並定義好完整的類

//當我們用類去建立乙個物件時,它首先呼叫類的建構函式

demo d;

//呼叫類的無引數的建構函式

demo d1(引數1,..)

//按引數個數不同,呼叫類中不同的建構函式

2.定義

建構函式名和類名完全一樣,可以根據不同的引數來實現過載不同的建構函式

建構函式是沒有任何返回值的,它預設的是public,inline函式

2.1定義格式

建構函式可以過載,可以是無引數,有引數,有預設引數)

宣告三個建構函式

**如下

class item;

2.2建構函式的兩種初始化成員變數的方法

如下面的類

class demo();

建構函式初始化成員有兩種方法

a.使用建構函式的初始化列表進行初始化

格式:funname(引數列表):(初始化列表){}

初始化列表: 成員名1(形參名1),成員名2(形參名2),成員名n(形參名n)

**:demo(int a=0,int b=0,std::string s=""):x(a),y(b),name(s){}

b.使用建構函式的函式體進行初始化

格式:funname(引數列表)

它和傳統的c函式差不多

**:demo(int a=0,int b=0,std::string s="")

3.基類與派生類

3.1在基類用建構函式初始化類的成員

"預設形參的方式+初始化列表"來初始化基類,而引數順序不是主要的

**如下:

class item_base(

public:

//兩個建構函式

item_base():(isbn(""),price(0.0){}

item_base(std::string& book="",double s_price=0.0) //帶預設形參

:isbn(book),price(s_price){}             //初始化列表

......

private:

std::string book;

double price

);3.2派生類

由於初始化順序是從基類到派生類的

基類的建構函式負責初始化基類與派生類的構造數負責初始化派生類,

在mfc中n層繼承類庫中,都是不同層中的類負責初始化自己本身和呼叫上一級建構函式進行初始化

如何在派生類初始化從基類中繼承來的protected成員和基類的private成員呢?

答案是:

在派生類的建構函式間接的呼叫基類建構函式來實現,派生類的初始化列表必須明確指出基類的初始化式

1.無引數的建構函式

格式:建構函式名():(基類建構函式(),派生類成員d1(值),d2(值),n(值){}

2.有引數的建構函式

格式:建構函式名(基類引數...派生類引數...)

:(基類構造(b1(引數),b2(引數)),派生類成員d1(引數),d2(引數),n(引數){}

class bulk_item: public item_base

//2.派生類有引數的建構函式

bulk_item(std::string& book="",double s_price=0.0,int qty=0,double dis=0.0)//函式引數

:item_base(book,s_price),int_qty(0),discount(0.0){} //初始化列表

private:

int min_qty;

double discount;

};4.設計指導

4.1初始化方式選擇:

無引數的建構函式:主要用初始化列表來初始化成員變數

有引數的建構函式:預設形參+初始化列表的建構函式

4.2派生類的初始化順序

由於初始化順序是從基類到派生類的,在初始化列表中應該先初始化基類,然後再是派生類本身

如果要求程式高效能,使用初始列表是c++的生產首選,對於習慣於c的程式設計師,在函式體初始化成員也是可行

9 C 物件的建構函式 詳解

大家都定義struct或class時,不能給成員直接賦值,那麼物件中成員變數的初始值是多少?對於區域性物件變數而言,其成員是個隨機值,因為該變數是被分配在棧上,對於其它區域性變數也是這樣.對於全域性物件變數而言,其成員都為0,因為該變數是被分配在靜態儲存區上,對於const修飾就是分配在唯讀靜態儲存...

程式設計練習思考9 C 建構函式不可繼承

1 靜態成員函式,非靜態成員函式,賦值操作函式,上述三種子類都可以繼承基類。2 但是建構函式,子類不能直接繼承父類的,需要自己寫,或者呼叫父類的建構函式,完成初始化。3 析構函式可以繼承擴充套件 編譯器總是根據型別來呼叫類成員函式。但是乙個派生類的指標可以安全地轉化為乙個基類的指標。這樣刪除乙個基類...

C 高階之路 9 C 抽象類

c 高階之路 9.c 抽象類 基礎 抽象類 abstract class 抽象類理解為一種特殊的基礎類,它不與具體的事物直接產生聯絡。形式上,用abstract關鍵字修飾的類即為抽象類。其最大的特點是不能被例項化,只能作為派生類的基類。1 乙個抽象類可以同時包含抽象方法和非抽象方法。2 抽象方法只在...