c++學習筆記 -- 建構函式

weixin_34050427發表於2017-11-04

宣告:程式碼出處http://www.weixueyuan.net/view/6339.html

建構函式是類中一種特殊的成員函式,其特殊之處有三點:

建構函式的函式名必須與類名相同;

建構函式無返回值;

當我們建立類物件的時候建構函式會被自動呼叫,而無需我們主動呼叫。

一個類中可以有多個建構函式,建構函式之間構成函式過載的關係。

通常如果在定義類的時候,程式設計人員沒有主動宣告任何一個建構函式的時候,系統會自動生成一個預設建構函式,預設建構函式就是不帶任何引數的建構函式。

其它帶引數的建構函式統稱為帶參建構函式。

我們建立了帶參建構函式,預設建構函式不會被自動建立

在建構函式中還可以呼叫函式:

class book

{

public:

book(){}

book(char* a, double p){init(a,p);};

void setprice(double a);

double getprice();

void settitle(char* a);

char * gettitle();

void display();

void init(char* a, double p);

private:

double price;

char * title;

};

void book::init(char* a, double p)

{

title = a;

price = p;

}

//----------------------------------------------------------

一個帶預設引數的建構函式

#include

usingnamespacestd;

classbook

{

public:

book(){}

book(char*a,doublep=5.0);

voiddisplay();

private:

doubleprice;

char*title;

};

book::book(char*a,doublep)//在定義函式的時候可以不指定預設引數

{

title=a;

price=p;

}

voidbook::display()

{

cout<<"The price of "<

}

intmain()

{

bookHarry("Harry Potter",49.9);

Harry.display();

bookGone("Gone with the Wind");

Gone.display();

return0;

}

需要說明的是帶預設引數的建構函式,其預設引數必須置於引數列表的結尾。如果例1中帶參建構函式 book(char* a, double p = 5.0); 被宣告成 book(double p = 5.0, char* a); 則是無法通過編譯的,因為預設引數不在引數列表的結尾。

確切的說是帶預設引數的形參的右邊 不能有沒帶引數的形參

目的是為了消除二義性

如:

book(double a,int b,int c):a(0),b(0),c(0);

book(double a = 1,int b,int c = 2);

如果定義 book b1(3); 編譯器就不知道你要呼叫哪一個建構函式了。

//-------------------------------------

拷貝建構函式,顧名思義,就是通過拷貝物件的方式建立一個新物件。拷貝建構函式有兩種原型

book(book&b);

book(constbook&b);

這兩種原型都是book類物件的引用。

如果拷貝建構函式的引數不是物件的引用,則是不允許的。

拷貝建構函式除了能有物件引用這樣的引數之外,同樣也能有其它引數。但是其它引數必須給出預設值

book(constbook&b,price=5.0);

classbook

{

public:

book(){}

book(book&b);

book(char*a,doublep=5.0);

voiddisplay();

private:

doubleprice;

char*title;

};

book::book(book&b)

{

price=b.price;

title=b.title;

}

book::book(char*a,doublep)

{

title=a;

price=p;

}

voidbook::display()

{

cout<<"The price of "<

}

如果一個類中包含指向動態分配儲存空間的指標型別的成員變數時,就應該為這個類設計一個拷貝建構函式,除了需要設計一個拷貝建構函式之外,還需要為它新增一個賦值操作符過載函式

#include

#include

using namespace std;

class Sample{

public:

Sample(){cout<<"Sample chuxian"<<++a<

~Sample(){cout<<"Sample likai"<<--a<

private:

static int a;

};

int Sample:: a = 0;

int main()

{

Sample a[2],*p[3],&b = a[1];

return 0;

}

建構函式 只用普通函式呼叫了建構函式 指標和引用都不會去呼叫建構函式

相關文章