C 的建構函式

2021-07-02 17:51:53 字數 3190 閱讀 2829

tags: c++

建構函式是用於建立物件的特殊成員函式, 當建立物件時,系統自動呼叫建構函式建構函式的作用是:

* 為物件分配空間;對資料成員賦初值;請求其他資源

* 沒有使用者定義的建構函式時,系統提供預設版本的建構函式

建構函式名與類名相同:類名

建構函式可以過載,建構函式可以有任意型別的引數,但沒有返回型別。

析構函式是用於取消物件的成員函式,當乙個物件作用域結束時,系統自動呼叫析構函式。析構函式的作用是進行清除物件,釋放記憶體等。沒有使用者定義析構函式時,系統提供預設版本的析構函式。

析構函式名為:~ 類名

析構函式沒有引數,也沒有返回型別。

拷貝建構函式用乙個已有同類物件的資料對正在建立的物件進行資料初始化,c++為類提供預設版本的複製建構函式,程式設計師可以定義使用者版本的複製建構函式。

語法形式

類名 :: 類名(const 類名 & 引用名 , …);

#include "iostream"

using

namespace

std;

class test

//無引數建構函式

test()

//賦值建構函式 copy建構函式

test(const test &obj)

private:

int m_a;

};void main()

#include 

using

namespace

std;

class location

location( const location & p ) //複製建構函式

~location()

int getx ()

int gety ()

private :

int x , y;

} ;void f (location p)

void playobjmain()

int main()

test t1;

test t2 = t1;

/**上面是用t1初始化t2,呼叫的是拷貝建構函式。

*/test t3;

t3 = t1;

/**t3已經初始化過了,因此不會再呼叫拷貝建構函式,它會呼叫「=」操作。

*/

#include using namespace std;

class test

//無引數建構函式

test()

//賦值建構函式 copy建構函式

test(const test &obj)

public:

void

print()

private:

int m_a;

};void play()

void main()

/**執行結果如下:

我也是建構函式啊。。。。。。

我也是建構函式啊。。。。。。

*/

#include "iostream"

using namespace std;

class location

location(const location & p) //複製建構函式

~location()

int getx()

int gety()

private:

int x, y;

};void f(location p)

location g()

void play()

int main()

/**constructor object.

constructor object.

copy_constructor called.

1,2 object destroyed.

1,2 object destroyed.

hello, boy!

1,2 object destroyed.

*/

即使我們乙個類裡面什麼東西也不寫,c++也會預設給我們提供一些東西:

當然預設提供的無參建構函式和析構函式幾乎什麼也不幹。拷貝建構函式和賦值操作函式就是單純的記憶體拷貝,也就是淺拷貝。

#include using namespace std;

class name

};name::name(char *pn)

name :: ~name()

void playmain()

/**程式會撲街,c++預設提供的拷貝建構函式等同於memcpy,obj2中的pname和obj1中的pname指向同一處地方,playmain析構的時候pname指向的位址會被free兩次,自然會出錯。

*/void main()

如果改為賦值操作,也會出現相同的問題:

#include 

using

namespace

std;

class name

};name::name()

name::name(char *pn)

name :: ~name()

void playmain()

void main()

原因是類似的,對於這中情況,我們要拒絕編譯器給我們預設生成的「=」和拷貝建構函式:

#include 

using

namespace

std;

class name

~name();

protected:

char *pname; int size;

public:

char * getpn()

void

operator=(name &obj1)

};name::name(char *pn)

name :: ~name()

void playmain()

void main()

C 建構函式 拷貝建構函式

建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13...

C 的建構函式

1 定義 在基於物件的程式中,在定義乙個物件時,也需要作初始化的工作,即對資料成員賦初值。因為不能再類宣告中對資料成員初始化 類並不是乙個實體,而是乙個抽象型別,並不占用儲存空間,顯然無法容納資料 c 提供了建構函式來處理物件的初始化。建構函式是一種特殊的成員函式,與其他成員函式不同,不需要使用者來...

C 的建構函式

c 的建構函式分為有參建構函式和無參建構函式,如 class test test int a test int a,int b 有引數建構函式 public void printt private int m a int m b 在上面定義的類中,既有有參建構函式,又有無參建構函式,此時若我們定義 ...