7 5 建構函式再探

2022-09-22 03:57:08 字數 1796 閱讀 3660

目錄7.5.2 委託建構函式

7.5.3 隱式的類型別轉換

7.5.4 類的靜態成員

觀察下面兩段建構函式的**

//初始化bookno,units_sold,revenue

sale_data(const string &s, unsigned cnt, double price) :

bookno(s), units_sold(cnt), revenue(cnt*price) {};

//對bookno,units_sold,revenue賦值

sale_data(const string &s, unsigned cnt, double price)

有些時候必須用初始化,而不能用賦值

#includeusing namespace std;

struct x;

x(int ii)

};

如果類成員是const, 引用或其他必須初始化(沒有預設建構函式)的型別,那麼必須用建構函式初始值列表進行初始化

初始化的順序由宣告順序決定,與建構函式初始值列表無關

#includeusing namespace std;

class x;

};int main();

};

//採用預設實參的建構函式可以充當預設建構函式使用

class x;

};

class sale_data

//委託的建構函式

sale_data() : sale_data(" ", 0, 0) {}

sale_data(string &s) : sale_data(s, 0, 0) {}

sale_data(istream &io) : sale_data()

private :

string bookno;

unsigned units_sold;

double revenue;

};

如果乙個建構函式只接受乙個引數,那麼它實際上定義了乙個該引數轉換為類型別的隱式轉換機制

#includeusing namespace std;

class x

//此處的引數必須為const,否則無法接受 常量

x &combine(const x &y)

string s;

};int main()

static關鍵字宣告類的靜態成員,它與類直接關聯,對所有類的物件可見,被所有物件共享,但不屬於任何乙個物件。

class account

//...

};

用類名訪問double r = account::rate();

用類的物件或物件的引用或指標訪問

account ac1,&ac2;

account *ac3 = &ac1;

r = ac1.rate();

r = ac2.rate();

r = ac3->rate();

C primer 7 5 建構函式再探

這兩個函式從執行的結果上看沒有區別,但是 第乙個函式執行的過程相當於 string foo abc 定義並初始化第二個函式執行的過程相當於 string foo foo abc 先定義 再賦值,且在定義時會執行預設初始化 第乙個過程明顯優於第二個 如果沒有在建構函式的初始值列表中顯式地初始化成員,則...

建構函式再探

建構函式基礎知識 建構函式初始值列表 初始化與賦值 建構函式使用初始值列表還是在函式體中給資料賦值的區別在於,前者是初始化了它的資料成員,後者是對資料成員執行了賦值操作。在很多類中,初始化和賦值的區別事關底層效率問題 前者直接初始化資料成員,後者則先初始化再賦值。除了效率外更重要的是,一些資料成員必...

足跡C primer 19 建構函式再探

sales data sales data const string s,unsigned cnt,double price 這個建構函式和這個效果是一樣的 sales data const std string s,unsigned n,double p bookno s units sold n...