第十四章 建構函式和初始化表

2021-10-09 11:54:01 字數 3771 閱讀 6958

1、建構函式和普通函式類似,也可以過載或帶有預設引數;

05constructor.cpp

class

student

student

(const string& name)

void

who(

void

)private

: string m_name;

int age;

int id;};

intmain

(void

)

2、預設(預設)建構函式

1)如果類中沒有定義任何的建構函式,編譯器會為該類提供乙個預設(無參)建構函式

06defcons.cpp

#include

using

namespace std;

class a

int m_i;};

class

bint m_j;

//基本型別

a m_a;

//類型別(成員子物件)};

intmain

(void

)

3、型別轉換建構函式(單參建構函式)

class 目標型別

};07castcons.cpp

#include

using

namespace std;

class

integer

//int -> integer

//型別轉換建構函式

explicit

integer

(int data)

void

print

(void

)private

:int m_data;

}int

main

(void

)

4、拷貝(複製)建構函式

1)用乙個已存在的物件構造同型別的副本物件,會呼叫該類的拷貝建構函式:

class 類名

};eg:

class a;

a a1;

a a2(a1);

08cpcons.cpp

#include

using

namespace std;

classaa

(const a& that)

private

:int m_data;};

intmain

(void

)

2)如果每乙個類沒有自己定義拷貝建構函式,那麼編譯器會為該類提供乙個預設的拷貝建構函式:

注:一般情況不需要自己定義拷貝建構函式,因為編譯器所提供的預設拷貝建構函式已經很好用了。

09cpcons.cpp

#include

using

namespace std;

classaa

(const a& that)

private

:int m_data;};

classb;

intmain

(void

)

3)拷貝構造函式呼叫時機

下面的**呼叫了6次建構函式(包括無參和拷貝的建構函式)

#include

using

namespace std;

classaa

(const a& that)

}void

func1

(a a)

a func2

(void

)int

main

(void

)

5初始化表

1)語法

class 類名

};eg:

class a

int m_i;

int m_i2;

};01initlist.cpp

#include

using

namespace std;

class

student

*///定義成員變數的同時初始化

student

(const string& name,

int age,

int no)

:m_name

(name)

,m_age

(age)

,m_no

(no)

void

who(

void

)private

: string m_name;

int m_age;

int m_no;};

intmain

(void

)

2)多數情況下使用初始化表和在建構函式體中進行賦初值沒有太大差異,可以任選一種

方式,但是在某些特殊情況下必須要使用初始化表:

#include

using

namespace std;

class

aint m_data;

}class

b a m_a;

}int

main

(void

)

結果:

a的建構函式

b的建構函式

const int num;

num = 0;//這兩個語句本身就是錯誤的,必須定義時同時初始化

03initlist.cpp

#include

using

namespace std;

int num =

100;

class

a*/error a(

void):

m_r(num)

,m_c

(200

)int

& m_r;

const

int m_c;};

intmain

(void

)

注:成員變數的初始化的順序由宣告順序決定,而與初始化表的順序無關,不要用乙個

成員變數去初始化另乙個成員變數。

04initlist.cpp

#include

#include

using

namespace std;

class

dummy

*/dummy

(const

char

* psz)

//:m_str(psz), m_len(strlen(psz)){}

:m_str

(psz ? psz:"")

,m_len

(strlen

(psz ?psz:"")

)//類的成員變數的初始化不是按初始化表的順序,而是成員變數的宣告順序

/* string m_str;

size_t m_len;

*/ string m_str;

size_t m_len;};

intmain

(void

)

建構函式和初始化表

1.無參構造 預設建構函式 無參並非嚴格的沒有引數的建構函式,而是不需要提供實際引數的建構函式,比如存在有預設引數 integer integer int a 10 也算是預設建構函式,可以無參呼叫。integer p1 new integer integer p2 new integer inte...

建構函式和初始化表

include class account 注意 建構函式的初始化列表只在建構函式的定義中指定,而不在宣告中指定 inline account account const char name,double opening bal name name balance opening bal 成員初始化...

建構函式初始化列表和初始化函式

其實並沒有所謂的初始化函式的概念,本文中的初始化函式只是說明在函式體內進行賦值。而初始化列表才是真正意義上的物件初始化。使用初始化列表效率會高一點。c 規定,物件的成員變數的初始化動作發生在進入建構函式本體之前。在建構函式體內只是賦值,並不是初始化。請看下面這個栗子 class base publi...