目錄7.1.2 建構函式
=default 的含義
建構函式的初始值列表
在類的外部定義的建構函式
7.1.3 完整**1
弄懂下面的**
#includeusing namespace std;
struct sale_data
sale_data& combine(sale_data& );
double **g_price() const;
//資料成員
string bookno;
unsigned units_sold = 0;
double revenue = 0.0;
};sale_data& sale_data::combine(sale_data& trans)
double sale_data::**g_price() const
//非成員函式介面
istream &read (istream &, sale_data &);
ostream &print(ostream &, sale_data &);
成員函式可以定義在類的內部,也可以定義在類的外部,但定義在外部需要加上定位符每乙個成員函式都會有乙個隱式引數來訪問呼叫物件的位址,this
如string ibsn() const
實際上被編譯為string ibsn(&total) const
total
是乙個sale_data物件
this 是呼叫物件的位址,即非常量指標,而我們知道,如果呼叫物件是乙個常量物件,那麼,this就必須是乙個常量指標才能指向該呼叫物件,而this又是隱式引數,那麼如何使this變成乙個const指標呢?
c++語言的做法是允許把const關鍵字放在成員函式的引數列表之後而this為const指標的成員函式就成為常量成員函式
常量物件,常量物件的引用和指標都只能使用常量成員函式先編譯成員,再編譯成員函式
sale_data& conbine(sale_data& )
的實現中return *this;
表示返**用物件。
注:引數使用引用傳入是因為拷貝傳入需要複製,會有額外開銷
為什麼需要返回型別是物件的引用而不是非引用?
為了鏈式使用成員函式
乙個const成員函式以引用形式返回*this,那麼該引用必須為常量引用實現與測試函式
istream &read(istream &is, sale_data &item)
ostream &print(ostream &os, sale_data &item)
sale_data(string s, unsigned n, double p) :
bookno(s), units_sold(n), revenue(n*p) {}
sale_data(istream &);
/*. . .
. . .
*/}//非成員函式
//定義在外部的建構函式
sale_data::sale_data(istream &is)
//外部成員函式
沒有實參的建構函式稱為預設建構函式,編譯器建立的預設建構函式稱為合成的預設建構函式預設建構函式按如下規則進行初始化:
類內初始值只能用「=」或者「{}」
sale_data() = default
表示手動新增預設建構函式,且該預設建構函式的作用等價於合成的預設建構函式
sale_data(string s) : bookno(s) {}
sale_data(string s, unsigned n, double p) : bookno(s), units_sold(n), revenue(n*p) {}
有一點需要注意,在上面的兩個建構函式中函式體都是空的。這是因為這些建構函式的唯一目的就是為資料成員賦初值,一旦沒有其他任務需要執行,函式體也就為空了。
//定義在外部的建構函式
sale_data::sale_data(istream &is)
由於建構函式是定義在類的外部,所以需要定位符sale_data::
由於是建構函式,所以函式名也為sale_data
,故為sale_data::sale_data
這個建構函式沒有建構函式初始值列表,或者講得史準確一點,它的建構函式初始值列表是空的。儘管建構函式初始值列表是空的,但是由於執行了建構函式體,所以物件的成員仍然能被初始化。
#includeusing namespace std;
struct sale_data
sale_data(string s, unsigned n, double p) :
bookno(s), units_sold(n), revenue(n*p) {}
sale_data(istream &);
//關於sale_data物件的操作函式
string ibsn() const
sale_data& combine(sale_data& );
double **g_price() const;
//資料成員
string bookno;
unsigned units_sold = 0;
double revenue = 0.0;
};//非成員函式介面
istream &read (istream &, sale_data &);
ostream &print(ostream &, sale_data &);
//外部建構函式(可以寫在內部)
sale_data::sale_data(istream &is)
istream &read(istream &is, sale_data &item)
ostream &print(ostream &os, sale_data &item){
os << item.bookno << " " << item.units_sold << " "
<< item.revenue類的結構圖
public與private見 7-2 筆記
C 矩形類 建構函式的定義與使用
定義乙個物件時,c 會自動呼叫建構函式建立該物件並進行初始化,當乙個物件的生 命期結束時,c 也會自動呼叫乙個特殊的成員的數進行善後工作,這個特殊的成員雨數即為析構的數 destructor 析構函式名與類名相同,但在前面加上字元 如coods 析構函式無函式返回型別在這方面與建構函式是一樣的。但析...
類與物件 組合類的建構函式和複製建構函式
初始化列表是用於構造函式引數的初始化,與其他函式不同,建構函式除了有名字,引數列表和函式體之外,還可以有初始化列表,初始化列表以冒號開頭,後跟一系列以逗號分隔的初始化字段。如 class myclock 建構函式的實現和初始化設定 myclock myclock int hh,int mm,int ...
C 中類的建構函式與複製建構函式
建構函式是類的特殊的成員函式,只要建立類型別的新物件,都要執行建構函式。建構函式的工作是保證每個物件的資料成員具有合適的初始值。建構函式的名字與類的名字相同,並且不能指定返回型別。像其他任何函式一樣,它們可以沒有形參,也可以定義多個形參。複製建構函式是一種特殊建構函式,具有單個形參,該形參 常用co...