我們之前使用的初始化方法大多如下面的形式:
//1.
int year = 1998;
//2.
struct MyString
{
char *ppp;
int num;
};
MyString bbb = {"DoubleKill",2};
接我們之前創(chuàng)建的Stock
類。如果我們使用下面的方式初始化Stock
類的對(duì)象,編譯器就會(huì)報(bào)錯(cuò)蹬昌,
Stock hot = {"M78,Inc.",400,11.11};
之所以不能像上面那樣初始化播玖,是因?yàn)閿?shù)據(jù)部分的訪問狀態(tài)是私有的踏志,程序不能直接訪問數(shù)據(jù)成員,如下:
Stock gift;
gift.buy(11,11.11);
就Stock
類之前的實(shí)現(xiàn)來說,gift
對(duì)象的company
成員是沒有值的。類設(shè)計(jì)假設(shè)用戶在調(diào)用任何其它成員函數(shù)之前調(diào)用acquire()
组题,但是卻無法加強(qiáng)這種假設(shè)。這是個(gè)問題抱冷,避開這種問題的方法之一就是在創(chuàng)建對(duì)象時(shí)崔列,自動(dòng)對(duì)他進(jìn)行初始化。因此旺遮,我們需要使用類構(gòu)造函數(shù)
赵讯。
一、類構(gòu)造函數(shù):
類構(gòu)造函數(shù)專門用于構(gòu)造新對(duì)象耿眉、將值賦值給它們的的數(shù)據(jù)成員瘦癌。類構(gòu)造函數(shù)的原型和函數(shù)頭有一個(gè)共同特點(diǎn):
沒有返回值,但也沒有被聲明為void類型
跷敬。
1.聲明和定義類構(gòu)造函數(shù)
我們給Stock
類創(chuàng)建構(gòu)造函數(shù),程序在聲明對(duì)象時(shí)講自動(dòng)調(diào)用構(gòu)造函數(shù),構(gòu)造函數(shù)一般有下面三種原型樣式西傀;
Stock();
Stock(const string & co = "NSError",long n = 0, double pr = 0.0);
Stock(const string & co ,long n, double pr);
第一斤寇、三種原型的定義實(shí)現(xiàn)為:
Stock::Stock()
{
cout << "Default constructor called " << endl;
company = "No name";
share_value = 0;
share_value = 0.0;
total_value = 0.0;
}
Stock::Stock(const string & co ,long n, double pr)
{
company = co;
if (n < 0)
{
cerr << "number of share can't be negative."
<< company
<< "shares set to 0."
<< endl;
share = 0;
}
else
{
share = n;
}
share_value = pr;
set_tot();
}
注意:
為了防止構(gòu)造函數(shù)的參數(shù)名和成員變量的名稱相同,在聲明成員變量時(shí)可以在前面加上
m_
或者在后面加上_
拥褂。如下樣式:
class Test {
private:
double m_share;
double m_share_value;
double total_value_;
string company_;
public:
};
2.使用構(gòu)造函數(shù)
在C++中提供了兩種使用構(gòu)造函數(shù)初始化對(duì)象的方式
第一種:顯式調(diào)用構(gòu)造函數(shù)
Stock fuck = Stock("L77.Xingyun.Inc", 1314, 22.22);
第二種:隱式調(diào)用構(gòu)造函數(shù)
Stock penta_kill("L77.Xingyun.Inc", 1314, 22.22);
3.默認(rèn)構(gòu)造函數(shù)
定義默認(rèn)構(gòu)造函數(shù)的方式有兩種:
第一種:給已有構(gòu)造函數(shù)的所有參數(shù)提供默認(rèn)值
Stock(const string & co = "NSError",long n = 0, double pr = 0.0);
第二種:通過函數(shù)重載來定義一個(gè)沒有參數(shù)的構(gòu)造函數(shù)
Stock();
它的實(shí)現(xiàn)請(qǐng)參考上面的代碼娘锁。
注意
在設(shè)計(jì)一個(gè)類時(shí),通常應(yīng)提供對(duì)所有類成員做隱式初始化的默認(rèn)構(gòu)造函數(shù)
4.析構(gòu)函數(shù)
用構(gòu)造函數(shù)創(chuàng)建對(duì)象后饺鹃,程序負(fù)責(zé)跟蹤該對(duì)象莫秆,直到對(duì)象過期為止。在對(duì)象過期時(shí)悔详,程序?qū)⒆詣?dòng)調(diào)用一個(gè)特殊的成員函數(shù)來完成清理工作镊屎。
如果構(gòu)造函數(shù)使用new
來分配內(nèi)存,則析構(gòu)函數(shù)將使用delete
來釋放這些內(nèi)存茄螃。在Stock
中構(gòu)造函數(shù)沒有使用new
來分配 內(nèi)存缝驳,因此對(duì)應(yīng)的析構(gòu)函數(shù)實(shí)際上也就沒有需要完成的任務(wù)。
析構(gòu)函數(shù)归苍,比如Stock
的析構(gòu)函數(shù)原型為:~Stock();
,它的實(shí)現(xiàn)一般為:
Stock::~Stock()
{
//Do something in here.
}
5.const成員函數(shù)
如下:
const Stock duke = Stock("The company string.");
duke.show();//complier refuse execute
編譯器會(huì)拒絕執(zhí)行第二步用狱,因?yàn)?code>duke是通過const
修飾的Stock
對(duì)象,不能被修改拼弃,但show()
里面的代碼無法保證duke
對(duì)象不被修改夏伊。
解決辦法:
1.聲明
show()
函數(shù)時(shí)在后面加const
,即void show() const;
.
2.實(shí)現(xiàn)show()
函數(shù)吻氧,即溺忧,void Stock::show() const