C 類的建構函式詳解

2021-09-07 06:35:46 字數 2351 閱讀 3575

1.預設建構函式

1) 當沒有定義任何建構函式時,編譯器會提供預設建構函式,可以直接使用。

2) 如果定義了帶引數的建構函式,又需要使用預設建構函式,此時,必須顯式定義無參建構函式,這和c#中有很大的不同。例如有乙個蔬菜類veg:

veg(const char* name,int num,double price);//宣告了帶三個引數的建構函式

要初始化veg物件,可使用

veg veg("tomato",15,3.5);

3) 定義了帶引數的建構函式的同時,又需要使用veg veg;若帶引數的建構函式,引數全部用預設值,如:

veg(const char* name="none",int num=0,double price=0.0);

則可成功初始化物件,否則將報錯,

若要使用預設建構函式,必須顯式宣告

veg veg();//宣告了預設建構函式

2.建立並初始化物件的幾種方式

1)veg veg("tomato",15,3.5);

在棧中,建立乙個名為veg的veg物件,並呼叫建構函式初始化

2)veg veg=veg("tomato",15,3.5);

和方法一原理一樣

3)veg veg;

無參建構函式或引數全部有預設值的建構函式的初始化

以上三種方式建立的物件,是放在棧中的,當作用域結束時,析構函式將被隱式呼叫,物件將被釋放。

4)veg *p = new veg("tomato",15,3.5);

在堆中,建立乙個veg物件,並呼叫建構函式初始化,並返回指向該物件的指標p

關於new的詳細介紹,可參考 c++ new操作符詳解

堆中建立的物件,在不需要使用時,要使用delete關鍵字,刪除指標,此時析構函式會立即被隱式呼叫,指標指向的物件將被釋放,

否則的話,將造成記憶體洩漏。

3.物件賦值

veg veg1=veg("tomato",15,3.5);

veg veg2 = veg2;

屬於值傳遞,物件中每個資料成員的值都將複製到目標物件相應的資料成員。

4.關於只帶乙個引數的建構函式

只有乙個慘的建構函式初始化時,可以將物件初始化為該引數,語法如下:

classname object= value;

程式設計時,我們使用了很多此種初始化方式,簡潔明瞭,如:

int a(10)=>int a = 10;

string a("hello")=>string a= "hello";

然而,很多時候,此種初始化方式,是不對的。如:

針對建構函式veg(const char* name);我們可以直接初始化為:

veg veg = name;

顯然,veg物件並不是乙個char*型別的字串,那麼如何避免誤用此種初始化方式呢?

可在建構函式宣告時,加上explicit關鍵字,如:explicit veg(const char* name);

explicit關鍵字的詳細介紹,可參考 c++ explicit關鍵字 

5.建構函式使用示例

如下例所示,定義了乙個蔬菜類veg,main函式中演示了幾種建構函式初始化方式。

veg.h

#pragma once#include

#include

class

vegpublic

: veg();

veg(

const std::string &name);

veg(

const std::string &name,int num=0,double price = 0.0

); ~veg();

void

show();

};

veg.cpp

#include "

veg.h

"veg::veg()

veg::veg(

const std::string &name)

veg::veg(

const std::string &name,int num,double

price)

veg::~veg()

void

veg::show()

useveg.cpp

#include "

veg.h

"int

main()

執行結果:

c 類建構函式詳解

複製 如下 一 建構函式是幹什麼的 類物件被建立時,編譯系統物件分配記憶體空間,並自動呼叫該建構函式 由建構函式完成成員的初始化工作 eg counter c1 編譯系統為物件c1的每個資料成員 m value 分配記憶體空間,並呼叫建構函式counter 自動地初始化物件,初始化之後c1的m va...

c 類的建構函式詳解

c 類的建構函式詳解 一 建構函式是幹什麼的 class counter private 資料成員 int m value 該類物件被建立時,編譯系統物件分配記憶體空間,並自動呼叫該建構函式 由建構函式完成成員的初始化工作 eg counter c1 編譯系統為物件c1的每個資料成員 m value...

c 類的建構函式詳解

c 建構函式的知識在各種c 教材上已有介紹,不過初學者往往不太注意觀察和總結其中各種建構函式的特點和用法,故在此我根據自己的c 程式設計經驗總結了一下c 中各種建構函式的特點,並附上例子,希望對初學者有所幫助。c 類的建構函式詳解 一 建構函式是幹什麼的 class counter private ...