Boolan C++面向?qū)ο蟾呒?jí)編程(上)第一周

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ú)特的特性:

  1. 沒有返回類型
  2. 擁有初值列

對(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)

  1. 數(shù)據(jù)都放在private里
  2. 參數(shù)傳遞用reference
  3. 返回值盡量用reference
  4. class body中的函數(shù),需要加上const的一定要加
  5. 構(gòu)造函數(shù)要充分利用初值列

typename() 臨時(shí)對(duì)象

類的名稱后面直接加小括號(hào)缚柏,意思是創(chuàng)建臨時(shí)對(duì)象

一個(gè)類的實(shí)現(xiàn)

  1. 防衛(wèi)式聲明
#ifndef __CLASSNAME__
#define __CLASSNAME__
......
#endif
  1. 建立class body
class complex
{

}
  1. 在private中定義數(shù)據(jù)
  2. 定義構(gòu)造函數(shù)
  3. 定義成員函數(shù)和非成員函數(shù)

本周作業(yè)

為Date類實(shí)現(xiàn)如下成員:

  1. 構(gòu)造器苹熏,可以初始化年、月币喧、日轨域。
  2. 大于、小于杀餐、等于(> 干发、< 、==)操作符重載怜浅,進(jìn)行日期比較铐然。
  3. print() 打印出類似 2015-10-1 這樣的格式。

然后創(chuàng)建兩個(gè)全局函數(shù):

  1. 第1個(gè)函數(shù) CreatePoints生成10個(gè)隨機(jī)的Date恶座,并以數(shù)組形式返回搀暑;
  2. 第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ì)于日期的比較有兩種思路:

  1. 分別從年设捐、月借浊、日開始對(duì)比,先對(duì)比年萝招,年相同再對(duì)比月蚂斤,月相同再對(duì)比日。
  2. 將年月日串聯(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);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末趋艘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子凶朗,更是在濱河造成了極大的恐慌瓷胧,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棚愤,死亡現(xiàn)場(chǎng)離奇詭異搓萧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)宛畦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門瘸洛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人次和,你說我怎么就攤上這事反肋。” “怎么了踏施?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵石蔗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我畅形,道長(zhǎng)养距,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任日熬,我火速辦了婚禮棍厌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘碍遍。我一直安慰自己定铜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布怕敬。 她就那樣靜靜地躺著揣炕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪东跪。 梳的紋絲不亂的頭發(fā)上畸陡,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天鹰溜,我揣著相機(jī)與錄音,去河邊找鬼丁恭。 笑死曹动,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的牲览。 我是一名探鬼主播墓陈,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼第献!你這毒婦竟也來了贡必?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤庸毫,失蹤者是張志新(化名)和其女友劉穎仔拟,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體飒赃,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡利花,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了载佳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炒事。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖刚盈,靈堂內(nèi)的尸體忽然破棺而出羡洛,到底是詐尸還是另有隱情,我是刑警寧澤藕漱,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布欲侮,位于F島的核電站,受9級(jí)特大地震影響肋联,放射性物質(zhì)發(fā)生泄漏威蕉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一橄仍、第九天 我趴在偏房一處隱蔽的房頂上張望韧涨。 院中可真熱鬧,春花似錦侮繁、人聲如沸虑粥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娩贷。三九已至,卻和暖如春锁孟,著一層夾襖步出監(jiān)牢的瞬間彬祖,已是汗流浹背茁瘦。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留储笑,地道東北人甜熔。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像突倍,于是被迫代替她去往敵國(guó)和親腔稀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容