国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

c++primer_類

2019-11-08 20:22:26
字體:
供稿:網(wǎng)友

通過代碼來學(xué)的這一章,所以總結(jié)也跟著代碼來。

//// Created by sequin on 2/15/17.//#include <iostream>using namespace std;struct Sales_data{ //常量成員函數(shù) string isbn() const {return bookNo;} //bookNo其實就是定義在Sales_data 中的數(shù)據(jù)成員 /* const在這里的作用是修改 隱式this指針的類型。默認情況下this的類型是指向 類 類型 非 常量版本的 常量指針。 例如:Sales_data *const this。 這意味著我們不能把this綁定到一個常量對象上(常量指針一旦初始化,其值不能改變),那么在isbn()函數(shù)內(nèi)部不會改變this所指向的對象則可以將this設(shè)置為指向常量的指針, 例如: const Sales_data *const this 但是問題是,this是隱式的,不會出現(xiàn)在參數(shù)列表中。這種情況下把const關(guān)鍵字放在成員函數(shù)的參數(shù)列表后,就可以表示this是一個指向常量的指針。 類似于 String Sales_data isbn(const Sales_data *const this){ return this->isbn; } */ Sales_data& combine(const Sales_data&); double avg_PRice() const; //自動生成默認構(gòu)造函數(shù) string bookNo; //雖然bookNo定義在isbn之后,isbn依然可以使用bookNo。這是因為編譯器首先編譯成員的聲明,然后才編譯成員函數(shù)體,所以可以不用在意成員出現(xiàn)的次序。 unsigned units_sold = 0; double revenue = 0.0;};/* *合成的默認構(gòu)造函數(shù)只適合非常簡單的類,某些類不能依賴 默認構(gòu)造函數(shù) 必須定義它自己的默認構(gòu)造函數(shù)。 *首先編譯器只在沒有編寫構(gòu)造函數(shù)的情況下才會生成一個默認的構(gòu)造函數(shù),如果已經(jīng)定義了其他的構(gòu)造函數(shù),編譯器不會再生成默認的構(gòu)造函數(shù)了。 *其次,默認構(gòu)造函數(shù)可能會執(zhí)行錯誤的操作,塊內(nèi)置類型的對象被默認初始化,它的值則是未定義。 *最后一個原因是某些情況下編譯器不不能為某些類合成默認的構(gòu)造函數(shù)。例如,如果類中包含了 其它類 類型成員并且這個成員的類型沒有默認構(gòu)造函數(shù)則無法初始化該成員。 *///改寫Sales_data,定義其構(gòu)造函數(shù)/* * struct 和class的區(qū)別是默認訪問權(quán)限不同 * struct默認成員是public的,而class默認成員是private的 */class Sales_data{ //友元只能聲明在類定義的內(nèi)部 friend Sales_data add(const Sales_data&, const Sales_data&); friend istream &read(istream&, Sales_data&); friend ostream &print(ostream&, const Sales_data&); public: Sales_data() = default; //該構(gòu)造函數(shù)不接受任何實參,是一個默認構(gòu)造函數(shù),=default 在類內(nèi),則默認 構(gòu)造函數(shù)是內(nèi)聯(lián)的。 //構(gòu)造初始函數(shù)值列表:以及{}之間的代碼 Sales_data(const string &s) : bookNo(s){} //花括號定義了函數(shù)體,此時為空, /* 當(dāng)某個數(shù)據(jù)成員被構(gòu)造函數(shù)初始化值表忽略時,它將以合成默認構(gòu)造函數(shù)相同的方式隱式初始化。 相當(dāng)于 */ Sales_data(const string &s):bookNo(s), units_sold(0), revenue(0){} Sales_data(const string &s, unsigned n, double p) : bookNo(s), units_sold(n), revenue(p*n){} Sales_data(istream &); string isbn() const {return bookNo;} Sales_data& combine(const Sales_data&); private: double avg_price() const; string bookNo; unsigned units_sold = 0; double revenue = 0.0; /* * 因為權(quán)限限定,read print add這時是無法正常編譯的,雖然他們是類的接口的一部分,但不是類的成員 * 只有讓想要訪問 類的非公有成員 的其他函數(shù)或是其他類 成為此類的友元, 需要增加一條以friend關(guān)鍵字開頭的函數(shù)聲明語句, 如上面。 */};/* * 訪問說明符加強類的封裝性 * public在整個程序內(nèi)都可以訪問,一般定義類的接口 * private可以被類內(nèi)的成員函數(shù)訪問,但是不能被使用該類的代碼訪問,一般封裝類的實現(xiàn)細節(jié) *///Sales_data接口的非成員組部分聲明Sales_data add(const Sales_data&, const Sales_data&);ostream &print(ostream&, const Sales_data&);istream &read(istream&, Sales_data&);//當(dāng)在類外定義成員函數(shù)時,成員函數(shù)的定義必須與它的聲明匹配。即,返回參數(shù)、參數(shù)列表和函數(shù)名都得與類內(nèi)的聲明保持一致,成員名字必須包含它所屬的類名。double Sales_data::avg_price() const { //隱式使用了Sales_data的成員 if(units_sold){ return revenue/units_sold; } else return 0;}//類似的復(fù)合運算的+=, 調(diào)用該函數(shù)的對象代表的是賦值運算符左側(cè)的運算對象, 右側(cè)運算對象則通過顯式的實參被傳入函數(shù)。函數(shù)返回引用類型。Sales_data& Sales_data::combine(const Sales_data &rhs) { units_sold += rhs.units_sold; //把rhs的成員加到this對象的成員上 revenue += rhs.revenue; return *this;//返回調(diào)用該函數(shù)的對象, 解引用this指針獲得執(zhí)行該函數(shù)的對象。}/*read和print分別接受一個各自的IO類型的引用作為其參數(shù),這是因為IO類屬于不能被拷貝的類型,只能通過引用來傳遞它們。因為讀取和寫入的操作會改變流的內(nèi)容,所以兩個函數(shù)接受的都是普通引用,而不是對常量的引用。*///read 函數(shù)從給定流中將數(shù)據(jù)讀到給定的對象里istream &read(istream &is, Sales_data &item){ double price = 0; is >> item.bookNo >> item.units_sold >> price; item.revenue = price * item.units_sold; return is;}/*構(gòu)造函數(shù)沒有返回類型,在類外定義構(gòu)造函數(shù)時,必須指明該構(gòu)造函數(shù)是哪個類的成員,并且構(gòu)造函數(shù)和類名相同。Sales_data::Sales_data(istream &is){ //構(gòu)造函數(shù)初始值列表為空,但有函數(shù)體。 //read的作用是從is中讀取一條交易記錄然后存入this對象中 read(is, *this); //使用this把對象當(dāng)成一個整體訪問,使用*this將this對象作為實參傳遞給read函數(shù)}*///將給定對象的內(nèi)容打印到給定的流中ostream &print(ostream &os, const Sales_data &item){ os << item.isbn() << " " << item.units_sold << " " << item.revenue << " " << item.avg_price(); return os;}int main(){, Sales_data total; if(read(cin, total)){ Sales_data trans; while(read(cin, trans)){ if(total.isbn() == trans.isbn()){ total.combine(trans);//更新變量total當(dāng)前的值 } else{ print(cout, total) << endl; total = trans; } } print(cout, total) << endl; } else{ cerr << "No data?!" << endl; }}//// Created by sequin on 2/15/17.//#include <iostream>#include <vector>using namespace std;class Screen{public: typedef string::size_type pos; //類可以自定義某種類型在類中的別名, 且必須先定義后使用 //等價于 using pos = string::size_type; Screen() = default; Screen(pos ht, pos wd, char c) : height(ht), width(wd), contents(ht * wd, c){} //規(guī)模較小的函數(shù)適合被聲明為內(nèi)聯(lián)函數(shù) //隱式內(nèi)聯(lián),讀取光標處的字符 char get() const{return contents[cursor];} inline char get(pos ht, pos wd) const; //顯式內(nèi)聯(lián),定義在類內(nèi)部的函數(shù)是自動inline的,因此,get函數(shù)默認是line函數(shù) /* * 重載成員函數(shù)。Screen定義了兩個版本的get,編譯器根據(jù)實際參數(shù)的 數(shù)量 來決定運行哪個 * Screen myscreen; * char ch = myscreen.get(); 調(diào)用Screen::get() * ch = myscreen.get(0, 0); 調(diào)用Screen::get(pos, pos) */ Screen &move(pos r, pos c); //能在之后被設(shè)置為內(nèi)聯(lián) void some_member() const; /* * 如果希望可以修改類的某個數(shù)據(jù)成員,可一將它變成可變數(shù)據(jù)成員 * 一個可變數(shù)據(jù)成員永遠不會const,即使它是const對象的成員 */public: //設(shè)置光標所在位置的字符或者其他人一位置給定位置的字符 Screen &set(char); Screen &set(pos, pos, char);public: //根據(jù)對象是否是const重載了display函數(shù) Screen &display(ostream &os){ do_display(os); return *this; } const Screen &display(ostream &os) const{ do_display(os); return *this; } /* * 當(dāng)display調(diào)用do_display時,它的this指針隱式的傳遞給do_display。 * 當(dāng)display的非 常量版本調(diào)用do_display時,它的this指針將隱式的從指向非常量的指針轉(zhuǎn)化成指向常量的指針 */private: //顯示Screen的內(nèi)容 void do_display(ostream &os) const{os << contents;}private: pos cursor = 0; pos height = 0, width = 0; string contents; mutable size_t access_ctr; //在變量的聲明中加入mutable關(guān)鍵字。即使在一個const成員變量中也能夠被修改};//盡管some_member是一個const成員函數(shù),但是該成員也是一個可變成員函數(shù),因此任何成員都能改變它的值void Screen::some_member() const { ++access_ctr; //保存一個計數(shù)值,用于記錄成員函數(shù)被調(diào)用的次數(shù)}//在類外部修飾函數(shù)inline Screen &Screen::move(pos r, pos c){ pos row = r * width; //計算行的位置 cursor = row + c; //在行內(nèi)將光標移動到指定的列 return *this; //返回對象}//在類的內(nèi)部聲明為內(nèi)聯(lián)函數(shù)char Screen::get(pos r, pos c) const{ pos row = r * width; //計算行的位置 return contents[row + c]; //返回給定列的字符}inline Screen &Screen::set(char c){ contents[cursor] = c; //設(shè)置當(dāng)前光標所在位置的新值 return *this;}inline Screen &Screen::set(pos r, pos col, char ch){ contents[r * width + col] = ch; //設(shè)置給定位置的新值 return *this;}class Window_mgr{private: vector<Screen> screens{Screen(24, 80, ' ')}; //當(dāng)初始化類類型成員時,需要為構(gòu)造函數(shù)傳遞一個符合成員類型的實參。};int main(){ Screen myScreen(5, 5, 'X'); myScreen.move(4, 0).set('#').display(cout); cout << endl; myScreen.display(cout); cout << endl;}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 都匀市| 陆川县| 招远市| 贵州省| 南靖县| 汕尾市| 开江县| 蒙城县| 扎兰屯市| 齐齐哈尔市| 宜昌市| 榆中县| 肇东市| 新晃| 东光县| 揭西县| 天津市| 克山县| 成武县| 灵宝市| 南阳市| 濉溪县| 绥棱县| 丘北县| 太康县| 阜康市| 崇义县| 榆社县| 天长市| 盱眙县| 三亚市| 陇南市| 博白县| 瓮安县| 外汇| 阳东县| 西吉县| 新密市| 津南区| 依安县| 乌拉特前旗|