青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

void main() { }

Hello ,world !

常用鏈接

統(tǒng)計(jì)

最新評(píng)論

Effective C++ 學(xué)習(xí)歷程001

      自從大一下接觸C++面向?qū)ο蟪绦蛟O(shè)計(jì),我就對(duì)一直在學(xué)習(xí)C++ 這門語(yǔ)言,當(dāng)然了也一直很喜歡C++。在之前剛剛開始C語(yǔ)言程序設(shè)計(jì)時(shí),自己還不喜歡編程這門學(xué)問。后來(lái),慢慢喜歡上編程,正是跟隨著C++ 語(yǔ)言的慢慢學(xué)習(xí)與積累的。嗯,我很喜歡C++這門語(yǔ)言!
      那就從一本摯愛的圖書《Effective C++ 》開始吧,也當(dāng)是給“Effective C++ 學(xué)習(xí)歷程”做個(gè)簡(jiǎn)單的開始。
  1 namespace testItem01
  2 {
  3 }//namespace testItem01
  4 // ====================================================================
  5 // --- 條款02:盡量以const,enum,inline替換 #define
  6 // 注意:
  7 // 1    對(duì)于單純變量,最好以const 對(duì)象或是 enumS 替換 #defineS 。。。
  8 // 2    對(duì)于形似函數(shù)的 宏(mactos),最好改用inline(結(jié)合 template) 函數(shù)替換 #defineS 
  9 // 3
 10 namespace testItem02
 11 {
 12     template <typename T>
 13     inline T   MAX_TEMP(const T& a ,const T& b)
 14     { return (a>? a : b) ; }
 15     void exampleFunc()
 16     {
 17         cout << " define constant ,using #define ,enum , const Type  \n" ;
 18         #define DEFINE_NUM  10
 19         enum { ENUM_NUM = 10  } ; // ..
 20         const int CONST_NUM = 10 ;
 21         cout << " DEFINE_NUM  ENUM_NUM  CONST_NUM :"
 22              << DEFINE_NUM << setw(5<< ENUM_NUM << setw(5<< CONST_NUM << "\n" ;
 23         /*
 24         char    str1[DEFINE_NUM] ; // okokok 
 25         char    str2[ENUM_NUM] ;// okokok 
 26         char    str3[CONST_NUM] ;// okokok 
 27         */
 28         // #define 導(dǎo)致的錯(cuò)誤  ..
 29         cout << " Error , use #define  \n" ;
 30         #define MAX_DEFINE(a,b) ((a) > (b) ? (a) : (b))
 31         int a = 5, b = 0;
 32         cout << " a = 5, b = 0; MAX_DEFINE(++a, b): " ;
 33         cout << MAX_DEFINE(++a, b) << "\n" ;// a 的值增加了2次
 34         cout << " a: " << a << " ,MAX_DEFINE(++a, b+10) : " ;
 35         cout << MAX_DEFINE(++a, b+10<< "\n" ; // a 的值只增加了1次
 36         cout << " a: " << a << "\n" ;
 37         cout << " OKOKOK , use inline template  \n" ;
 38         a = 5, b = 0;
 39         cout << " a = 5, b = 0; MAX_TEMP(++a, b): " ;
 40         cout << MAX_TEMP(++a, b) << "\n" ;// a 的值增加了2次
 41         cout << " a: " << a << " MAX_TEMP(++a, b+10) : " ;
 42         cout << MAX_TEMP(++a, b+10<< "\n" ; // a 的值只增加了1次
 43         cout << " a: " << a << "\n" ;
 44     }
 45 }//namespace testItem02
 46 // ====================================================================
 47 // --- 條款03:盡量使用 const 
 48 // 注意:
 49 // 1    將某些東西聲明為 const可以幫助編譯器偵測(cè)出錯(cuò)誤語(yǔ)法。const可被施加于任何作用域內(nèi)的
 50 //      對(duì)象、函數(shù)參數(shù)、函數(shù)返回類型、成員函數(shù)本體 
 51 // 2    編譯器強(qiáng)制執(zhí)行(實(shí)施)bitwise constness 。但你編寫程序時(shí)應(yīng)該使用“概念上的常量性”(conceptual constness)
 52 // 3    當(dāng) const 和 non-const成員函數(shù)有著實(shí)質(zhì)等價(jià)的實(shí)現(xiàn)時(shí),令non-const版本去調(diào)用const版本可避免代碼重復(fù) 。
 53 namespace testItem03
 54 {
 55     void func1(const char* pChar) { cout << " void func1(const int* pInt): " << pChar << "\n" ; } //
 56     void func2(char const * pChar)
 57     { cout << " void func2(int const * pInt): " << pChar << "\n" ;} // the same as func1 
 58     // -------------------------
 59     class TextBlock
 60     {
 61     private:
 62         std::string text_ ;
 63     public:
 64         TextBlock() {}
 65         //TextBlock(const char* str) : text_(str) {} //
 66         TextBlock(const std::string& str) : text_(str) {} //
 67         // 
 68         const char& operator [](std::size_t pos) const
 69         {
 70             cout << " const char& operator [](std::size_t pos) const \n" ;
 71             return text_[pos] ;
 72         }
 73         /* 1 ==========
 74         char& operator [](std::size_t pos)
 75         {
 76             cout << " char& operator [](std::size_t pos) //1==\n " ;
 77             return text_[pos] ;
 78         } */ //2 ========== non-const 跳轉(zhuǎn) const 版本 + 過(guò)程轉(zhuǎn)換 
 79         char& operator [](std::size_t pos)
 80         {
 81             cout << " char& operator [](std::size_t pos) //2==\n" ;
 82             return const_cast<char&>(static_cast<const TextBlock>(*this)[pos] ) ;
 83         }
 84         // 
 85     } ;
 86     void print_0(const TextBlock& ctb)
 87     { cout << " ctb[0]: " << ctb[0<< "\n" ; }//調(diào)用const char& operator [](std::size_t pos) const
 88     // ------------關(guān)鍵字 mutable mutable mutable ---------
 89     class CTextBlock
 90     {
 91     private:
 92         char* pText ;
 93         mutable size_t textLength ;//可以在 const成員函數(shù)改變?cè)摮蓡T變量 
 94         mutable bool   lengthIsValid ;//可以在 const成員函數(shù)改變?cè)摮蓡T變量 
 95     public:
 96         size_t length() const ;
 97         // 
 98     } ;
 99     size_t CTextBlock::length() const//可以在 const成員函數(shù)改變?cè)摮蓡T變量 textLength ,lengthIsValid
100     {
101         if(!lengthIsValid)
102         {
103             textLength = std::strlen(pText) ;
104             lengthIsValid = true ;
105         }
106         return textLength ;
107     }
108     // 
109     void exampleFunc()
110     {
111         char greeting[] = "Hello" ;
112         char* p = greeting ; // non-const pointer ,non-const data
113         const char* cp = greeting ;// non-const pointer ,const data
114         char* const pc = greeting ;// const pointer ,non-data
115         const char* const cpc = greeting ;// const pointer ,const data
116         func1(p) ; func1(cp) ; func1(pc) ; func1(cpc) ;
117         func2(p) ; func2(cp) ; func2(pc) ; func2(cpc) ;
118         // -------------------------------------------
119         std::vector<int> iVec(5 ,1) ;
120         // 
121         cout << " *iVec.begin(): " << *iVec.begin() << "\n" ;
122         const vector<int>::iterator it = iVec.begin() ;// const vector<T>::iterator == T* const
123         *it = 10 ; // 沒有問題,實(shí)際改變it所指物,但違背正常邏輯 
124         //++it ; //錯(cuò)誤!it 是 const == T* const 、、Error
125 //error: passing `const __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >'
126 //as `this' argument of `__gnu_cxx::__normal_iterator<_Iterator, _Container>& __gnu_cxx::__normal_iterator<_Iterator, _Container>::operator++()
127 //[with _Iterator = int*, _Container = std::vector<int, std::allocator<int> >]' discards qualifiers|
128         cout << " *iVec.begin(): " << *iVec.begin() << "\n" ;
129         vector<int>::const_iterator cit = iVec.begin() ;//vector<T>::const_iterator == const T*
130         //*cit = 1 ;//錯(cuò)誤! *cit(所指物)是const
131 //error: assignment of read-only location|
132         ++cit ;//沒有問題,改變 cit ,指向下一個(gè)所指物 
133         // -------------------------------------------
134         TextBlock tb("Hello") ;
135         cout << " " << tb[0<< "\n" ;
136         const TextBlock ctb("Hello") ;
137         cout << " " << ctb[0<< "\n" ;
138         cout << " print_0(tb) ; \n" ;
139         print_0(tb) ;
140     }
141 }//namespace testItem03
142 // ====================================================================
143 // --- 條款04:確定對(duì)象被使用前先被初始化 
144 // 注意:
145 // 1    為內(nèi)置型對(duì)象進(jìn)行手工的初始化,因?yàn)镃++ 不保證初始化它們
146 // 2    構(gòu)造函數(shù)最好使用成員初值列表初始化成員變量( member initializatiob list) ,
147 //      而不要在構(gòu)造函數(shù)本體內(nèi)使用賦值操作(assignment)。初始列表列出的成員變量,其排列次序應(yīng)該跟
148 //      它們?cè)赾lass 中的聲明次序相同。(而class 中的聲明次序應(yīng)該符合邏輯)
149 // 3    為免除“跨編譯單元之初始化次序”問題,請(qǐng)以local static 對(duì)象替換 non-local static 對(duì)象。
150 // 4    對(duì)于大多數(shù)類型而已,比起先調(diào)用default構(gòu)造函數(shù)日后再調(diào)用copy assignment操作符,單只調(diào)用
151 //      一次構(gòu)造函數(shù)是比較高效的,有時(shí)甚至高效得多。(而對(duì)于內(nèi)置類型基本一樣,差不多)
152 //      在“初始化次序不確定性”(這對(duì)不同編譯但愿所定義的non-local static對(duì)象是一種折磨)氛圍下
153 //      加強(qiáng)你的設(shè)計(jì),你可以考慮 以上 3 點(diǎn)的策略 non-local static -->> local static轉(zhuǎn)化 !!!
154 namespace testItem04
155 {
156     class PhoneNumber {} ; // .
157     class ABEntry
158     {
159     private:
160         string name_ ;
161         string address_ ;
162         std::list<PhoneNumber> phones_ ;
163         int     numTimesConculted ;
164     public:
165         ABEntry() ;
166         ABEntry(const string& name ,const string& addr ,\
167                 const list<PhoneNumber> phones )
168         : name_(name) ,address_(addr) ,phones_(phones) ,\
169           numTimesConculted(0//初始化列表初始化 data member
170         {} // 主體為空 記住根據(jù)class定義data member次序初始化 .
171         /*
172         {
173             name_ = name ;  //這些都是賦值--assignments
174             address_ = addr ;//而不是 初始化--initilizations
175             phones_ = phones ;
176             numTimesConculted = 0 ;
177         } */
178     } ;
179     ABEntry::ABEntry():name_() ,address_() ,phones_() ,numTimesConculted(0)
180     {}// 記住根據(jù)class定義data member次序初始化 .
181     // ----------------------------------
182     // -------- one.h ----------// //多編譯單元情況
183     class FileSystem
184     {
185     public:
186         FileSystem() :numDisks_(0) {}//..
187         FileSystem(int numDisks) :numDisks_(numDisks) {}//..
188         // 
189         std::size_t numDisks() const ;//眾多成員函數(shù)之一
190         // 
191     private:
192         int numDisks_ ;// 
193     } ;
194     std::size_t FileSystem::numDisks() const
195     { return numDisks_ ; }// //多編譯單元情況
196     //FileSystem tfs ; //okokok
197     // -------- theOther.h ----------// //多編譯單元情況
198     FileSystem tfs_non_local_static ;//預(yù)備給客戶使用對(duì)象--
199     //extern FileSystem tfs_non_local_static ;//預(yù)備給客戶使用對(duì)象--the file system //多文件(編譯單元)
200     // .
201     FileSystem& tfs_local_static() ;//聲明函數(shù) 
202     class Directory
203     {
204     private:
205         string dir_ ;
206     public:
207         explicit Directory(string dir) ;
208         // 
209     } ;
210     size_t handleNumDisks(size_t num) { /*.*/return num ; }// 
211     Directory::Directory(string dir) : dir_(dir)
212     {
213         // 
214         //size_t disks = tfs_non_local_static.numDisks() ;// bad non-local static object
215         size_t disks = tfs_local_static().numDisks() ;//good local static object
216         handleNumDisks(disks) ;
217         // 
218     }
219     // ---------------------------------------------------
220 // 3    為免除“跨編譯單元之初始化次序”問題,請(qǐng)以local static 對(duì)象替換 non-local static 對(duì)象。
221     FileSystem&tfs_local_static()
222     //這個(gè)函數(shù)用來(lái)替換tfs對(duì)象:它在FileSystem class 中可能是一個(gè)static
223     {//定義并初始化一個(gè)local static對(duì)象,返回一個(gè)reference指向上述對(duì)象 
224         static FileSystem fs ;
225         return fs ;
226     }
227 }//namespace testItem04
228 // === 二、構(gòu)造/析構(gòu)/賦值運(yùn)算 ============================================
229 // ====================================================================
230 // --- 條款05:了解C++ 默默編寫并調(diào)用的哪些函數(shù):
231 //     (默認(rèn))構(gòu)造函數(shù),析構(gòu)函數(shù),賦值函數(shù),復(fù)制構(gòu)造函數(shù)
232 // 注意:
233 // 1    編譯期可以暗自為class 創(chuàng)建 default 構(gòu)造函數(shù),copy構(gòu)造函數(shù),copy assignment
234 //      操作符,以及析構(gòu)函數(shù) 
235 namespace testItem05
236 {// ..
237 }
238 // ====================================================================


posted on 2010-05-27 17:12 only 閱讀(254) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 瑣碎編程


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品捆绑调教| 国产一区二区三区的电影| 欧美顶级少妇做爰| 欧美成人精品不卡视频在线观看| 久久综合网络一区二区| 免费观看久久久4p| 欧美成人综合| 欧美日韩小视频| 国产精品美女主播在线观看纯欲| 国产精品乱码| 国内精品一区二区三区| 一区视频在线播放| 91久久精品国产91久久性色tv| 亚洲精品中文字幕有码专区| 亚洲调教视频在线观看| 小黄鸭视频精品导航| 久久精品亚洲一区二区| 欧美岛国在线观看| 亚洲伦伦在线| 亚洲欧美电影院| 久久综合激情| 欧美日韩视频专区在线播放 | 狠狠狠色丁香婷婷综合久久五月| 一色屋精品视频在线看| 亚洲国内自拍| 亚洲一区二区三区四区五区午夜| 欧美在线视频二区| 欧美成人国产| 一区二区成人精品| 久久精品国产在热久久| 欧美激情综合在线| 国产日本亚洲高清| 亚洲国产欧美精品| 亚洲欧美综合另类中字| 免费视频久久| 国产精品99久久久久久www| 久久久999国产| 欧美日韩一区二区三| 好吊妞**欧美| 亚洲无限av看| 美日韩免费视频| 亚洲视频视频在线| 久久人人爽爽爽人久久久| 欧美日韩一区二区三区| 精品69视频一区二区三区| 最近看过的日韩成人| 亚洲伊人伊色伊影伊综合网| 欧美v国产在线一区二区三区| 一区二区高清视频在线观看| 久久蜜桃资源一区二区老牛| 国产精品福利在线| 亚洲欧洲免费视频| 久久精品国产久精国产一老狼| 亚洲国产毛片完整版| 亚洲自拍偷拍色片视频| 欧美男人的天堂| 1024国产精品| 亚洲欧美中文字幕| 亚洲高清不卡在线观看| 欧美一级播放| 国产精品久久久久久久久久尿| 最新亚洲视频| 噜噜噜噜噜久久久久久91| 亚洲图片在线| 欧美日韩免费在线| 亚洲精品一区二区在线观看| 久久综合久久久久88| 亚洲欧美日本日韩| 欧美小视频在线| 日韩一级片网址| 欧美激情小视频| 久久久久久噜噜噜久久久精品 | 91久久久久| 久久久精品一区| 国产美女精品免费电影| 亚洲一区日韩| 亚洲人成欧美中文字幕| 免费久久99精品国产| 黄色成人在线网址| 久久精品国产免费看久久精品| 在线亚洲精品| 欧美午夜视频在线| 一区二区三区免费网站| 亚洲黄色尤物视频| 免费在线观看成人av| 1024亚洲| 亚洲大片免费看| 免费欧美网站| 亚洲日本激情| 亚洲国产精品一区二区第四页av | 99精品视频免费观看| 久久嫩草精品久久久精品一| 欧美一级二级三级蜜桃| 国产午夜精品理论片a级大结局 | 亚洲视频在线观看| 国产精品av久久久久久麻豆网| 亚洲私人影院在线观看| 在线中文字幕一区| 国产精品欧美经典| 久久se精品一区二区| 午夜精品偷拍| 狠狠色香婷婷久久亚洲精品| 久久一区视频| 欧美v国产在线一区二区三区| 亚洲人成久久| 日韩亚洲一区二区| 国产精品久久久久久久久久尿| 香蕉久久一区二区不卡无毒影院| 亚洲欧美激情四射在线日| 国产一区二区三区观看| 美女诱惑黄网站一区| 美女脱光内衣内裤视频久久影院 | 久久免费视频一区| 亚洲国产一区二区三区a毛片| 亚洲国产精品ⅴa在线观看| 欧美国产日韩一区| 亚洲一区二区三区视频播放| 亚洲欧美日韩国产综合在线| 国内精品久久久久久久果冻传媒| 麻豆freexxxx性91精品| 欧美大片一区| 亚洲免费在线精品一区| 久久国产精品亚洲va麻豆| 亚洲国产精品久久久久秋霞蜜臀| 亚洲激情影视| 国产精品日韩欧美综合| 麻豆久久久9性大片| 欧美成人免费一级人片100| 亚洲一区二区三区精品在线| 午夜久久久久久久久久一区二区| 尤物网精品视频| 日韩视频在线一区| 国产欧美一区二区三区久久人妖| 女人香蕉久久**毛片精品| 欧美激情视频给我| 欧美在线视频a| 欧美成人一区二区三区| 亚欧成人精品| 欧美 日韩 国产在线| 亚洲一区久久| 久久久青草青青国产亚洲免观| 夜夜精品视频一区二区| 欧美一二三区精品| 日韩午夜电影av| 久久激情综合| 亚洲图片激情小说| 久久综合狠狠综合久久综合88| 亚洲小说欧美另类婷婷| 久久露脸国产精品| 亚洲欧美韩国| 欧美多人爱爱视频网站| 久久都是精品| 欧美日韩国产成人在线免费| 久久中文精品| 国产精品色在线| 亚洲国产精品久久| 国产自产在线视频一区| 一本久道综合久久精品| 亚洲国产91色在线| 先锋影院在线亚洲| 中文av一区特黄| 免费不卡中文字幕视频| 久久精品免费电影| 欧美特黄一级| 91久久在线观看| 黄网站色欧美视频| 亚洲欧美文学| 亚洲一区三区电影在线观看| 免费国产一区二区| 卡一卡二国产精品| 国产女人18毛片水18精品| 日韩视频一区二区| 亚洲区国产区| 久久精品视频在线观看| 欧美在线视频在线播放完整版免费观看| 欧美丰满高潮xxxx喷水动漫| 葵司免费一区二区三区四区五区| 国产精品一二一区| 亚洲视频精选在线| 亚洲视频中文字幕| 欧美久久婷婷综合色| 欧美激情一区三区| 亚洲高清电影| 久久久久久综合| 久久欧美肥婆一二区| 国产三区精品| 亚洲在线观看视频| 亚洲欧美日韩系列| 国产精品第13页| 在线一区二区视频| 亚洲在线免费| 国产精品国产| 一区二区三区欧美日韩| 亚洲一区二区网站| 欧美日韩在线大尺度| 日韩午夜精品| 亚洲一区二区三区精品视频 | 欧美成在线视频| 亚洲高清在线| 免费黄网站欧美|