c++頭文件 防衛(wèi)式聲明
#ifndef __CLASSNAME__
#define __CLASSNAME__
...
#endif
本周目標(biāo)
完成一個(gè)復(fù)數(shù)的類
一個(gè)class包含一個(gè)class head和一個(gè)class body
思考一:
要實(shí)現(xiàn)一個(gè)復(fù)數(shù)的類,需要包含哪些數(shù)據(jù):
實(shí)部和虛部 double類型
so
private:
double re,im
思考二
上面的實(shí)部和虛部的數(shù)據(jù)類型為double政冻,但是如果我要改變數(shù)據(jù)類型為int怎么辦炎咖?重新寫個(gè)類嗎谜洽?感覺不科學(xué)啊?
so
這里引出模板的概念
template<typename T>
class complex
{
public:
...
private:
T re,im
}
用法如下:
complex<double> c1(2.4,1.5);
complex<int> c2(2,6);
思考三
函數(shù)為什么有的定義在class body里面滥壕,有的定義在class body外面蒿偎?
定義在class body里面的函數(shù)成為inline函數(shù)朽们。
簡(jiǎn)單理解為inline函數(shù)處理速度快。
定義在class body外的函數(shù)也可以在函數(shù)前+inline 聲明為inline函數(shù)诉位。
但是 需要了解的是骑脱,即使你認(rèn)為聲明了inline,但是是不是真是的inline函數(shù)苍糠,這個(gè)由編譯器來決定叁丧,我們的聲明只是告訴編譯器,盡量來幫我定義為inline函數(shù)
思考四
private和public的作用分別是什么岳瞭?
private拥娄,私有的,用于存放數(shù)據(jù)瞳筏,形成封裝稚瘾,不允許外界調(diào)用
public ,公有的姚炕,主要用來存放函數(shù)
在private中以friend 聲明一個(gè)函數(shù)摊欠,該函數(shù)可以直接調(diào)用private中的數(shù)據(jù)
思考五
什么是構(gòu)造函數(shù)?
當(dāng)你創(chuàng)建一個(gè)對(duì)象時(shí)钻心,被編譯器自動(dòng)調(diào)用來實(shí)現(xiàn)創(chuàng)建對(duì)象這一目的的函數(shù)凄硼,就是構(gòu)造函數(shù)
構(gòu)造函數(shù)的函數(shù)名稱必須與類的名稱一致。
構(gòu)造函數(shù)有幾個(gè)獨(dú)特的特性:
- 沒有返回類型
- 擁有初值列
對(duì)應(yīng)于構(gòu)造函數(shù)捷沸,一個(gè)類也通常要有析構(gòu)函數(shù)
對(duì)于沒有指針的類中摊沉,通常可以不用寫析構(gòu)函數(shù)
構(gòu)造函數(shù)可以有很多個(gè)痒给,實(shí)現(xiàn)各種不同的創(chuàng)建對(duì)象方式说墨。
overloading 函數(shù)重載
在函數(shù)名的后面加const
double real() const {return re;}
double imag() const {return im;}
若不打算改變數(shù)據(jù)內(nèi)容,則最好加上const
參數(shù)傳遞 pass by value vs. pass by reference
pass by value 就是將參數(shù)整個(gè)傳遞過去苍柏,value假設(shè)100個(gè)字節(jié)尼斧,傳遞過去就是100個(gè)字節(jié)。
若是pass by reference试吁,就是傳引用棺棵,引用就相當(dāng)于一個(gè)指針楼咳,只傳遞4個(gè)字節(jié)
因此,對(duì)于參數(shù)傳遞烛恤,最好都只傳遞引用
對(duì)于返回值的傳遞母怜,盡量也返回引用
一個(gè)好的類需要注意的事項(xiàng)
- 數(shù)據(jù)都放在private里
- 參數(shù)傳遞用reference
- 返回值盡量用reference
- class body中的函數(shù),需要加上const的一定要加
- 構(gòu)造函數(shù)要充分利用初值列
typename() 臨時(shí)對(duì)象
類的名稱后面直接加小括號(hào)缚柏,意思是創(chuàng)建臨時(shí)對(duì)象
一個(gè)類的實(shí)現(xiàn)
- 防衛(wèi)式聲明
#ifndef __CLASSNAME__
#define __CLASSNAME__
......
#endif
- 建立class body
class complex
{
}
- 在private中定義數(shù)據(jù)
- 定義構(gòu)造函數(shù)
- 定義成員函數(shù)和非成員函數(shù)
本周作業(yè)
為Date類實(shí)現(xiàn)如下成員:
- 構(gòu)造器苹熏,可以初始化年、月币喧、日轨域。
- 大于、小于杀餐、等于(> 干发、< 、==)操作符重載怜浅,進(jìn)行日期比較铐然。
- print() 打印出類似 2015-10-1 這樣的格式。
然后創(chuàng)建兩個(gè)全局函數(shù):
- 第1個(gè)函數(shù) CreatePoints生成10個(gè)隨機(jī)的Date恶座,并以數(shù)組形式返回搀暑;
- 第2個(gè)函數(shù) Sort 對(duì)第1個(gè)函數(shù)CreatePoints生成的結(jié)果,將其按照從小到大進(jìn)行排序跨琳。
最后在main函數(shù)中調(diào)用CreatePoints自点,并調(diào)用print將結(jié)果打印出來。然后調(diào)用Sort函數(shù)對(duì)前面結(jié)果處理后脉让,并再次調(diào)用print將結(jié)果打印出來桂敛。
思考1
構(gòu)造器,可以初始化年月日溅潜。
這里是一個(gè)構(gòu)造函數(shù)术唬,有三個(gè)參數(shù):年、月滚澜、日粗仓,并且設(shè)有初值。
Data (int y=2000,int m=1,int d=1)
:year(y),month(m),day(d)
{}
思考2
通過大于小于等于號(hào)分別實(shí)現(xiàn)日期的比較
對(duì)于日期的比較有兩種思路:
- 分別從年设捐、月借浊、日開始對(duì)比,先對(duì)比年萝招,年相同再對(duì)比月蚂斤,月相同再對(duì)比日。
- 將年月日串聯(lián)起來組成一個(gè)數(shù)字槐沼,例如2012-5-1可以轉(zhuǎn)換為20120501曙蒸,這樣對(duì)比日期時(shí)直接可以用默認(rèn)的比較符號(hào)來實(shí)現(xiàn)捌治。
下來分別實(shí)現(xiàn):
方法一
因?yàn)榇笥凇⑿∮谝菥簟⒌扔冢?gt; 具滴、< 、==)都是二元運(yùn)算符师倔,所以將其定義為成員函數(shù)
bool operator >(const date&);
bool operator <(const date&);
bool operator ==(const date&);
inline bool
date::operator<(const date& d1)
{
this->year < d1.year || this->year == d1.year&&this->month < d1.month
|| this->year == d1.year&&this->month == d1.month&&this->day < d1.day;
}
inline bool
date::operator>(const date& d1)
{
this->year > d1.year || this->year == d1.year&&this->month > d1.month
|| this->year == d1.year&&this->month == d1.month&&this->day > d1.day;
}
inline bool
date::operator==(const date& d1)
{
this->year == d1.year&&this->month == d1.month&&this->day > d1.day;
}
方法二
int date2int(const date& mydate)
{
return mydate.year * 1000 + mydate.month * 100 + mydate.day;
}
inline bool
date::operator<(const date& d1)
{
return date2int(*this) < date2int(d1);
}
inline bool
date::operator>(const date& d1)
{
return date2int(*this) > date2int(d1);
}
inline bool
date::operator==(const date& d1)
{
return date2int(*this) ==date2int(d1);
}
思考3
能夠打印出類似2015-10-1這樣的格式
對(duì)<<進(jìn)行操作符重載
ostream& operator<<(ostream& os, const date& x)
{
return os << x.get_y() << "-" << x.get_m << "-" << x.get_d << endl;
}
思考4
創(chuàng)建全局函數(shù),隨機(jī)生成10個(gè)date周蹭,以數(shù)組形式返回
隨機(jī)生成10組數(shù)
產(chǎn)生隨機(jī)數(shù)有rand函數(shù)和srand函數(shù)
srand函數(shù)用于設(shè)定rand的隨機(jī)種子
date* CreatePoints()
{
srand(time(NULL));
date date_array[date_num];
for (int i = 0; i <=date_num; ++i)
{
date_array[i] = date(rand() % 10 + 2000, rand() % 12 + 1, rand() % 31 + 1);
}
return date_array;
}
對(duì)數(shù)組進(jìn)行排序
考慮使用sort
void Sort(date* mydate)
{
sort(mydate, mydate + date_num);
}