Effective C++ 第二版 1)const和inline 2)iostream
?
條款1?盡量用const和inline而不用#define
>"盡量用編譯器而不用預(yù)處理"
Ex. #define ASPECT_R 1.653 ? ?編譯器永遠不會看到ASPECT_R這個符號名, 在源碼進入編譯器之前, 就被預(yù)處理程序去掉, ASPECT_R 不會被加入到符號列表中; 編譯報錯時, 報錯信息指向1.653, 讓程序員無法跟蹤錯誤;(這個問題也會出現(xiàn)在符號調(diào)試器中);
>Solution: 定義常量 const double ASPECT_R = 1.653; 常量定義一般是在頭文件中, 許多源文件會包含它; [me: 如果只是局部使用的常量應(yīng)該放在cpp中]
Note?定義指針常量時要注意, 除了指針?biāo)傅念愋投x成const, 指針也經(jīng)常要定義成const; Ex. const char* const kName = "Scott";
定義類的常量, 把常量限制在類中, 為了保證常量只有一份拷貝, 把它定義為靜態(tài)成員:
| 1 2 3 4 5 6 | class? GamePlayer { private : ???? static? const? int? NUM_TURNS = 5;? // constant declaration (老的編譯器不接受靜態(tài)成員聲明時初始化) ???? int? scores[NUM_TURNS];? // use of constant ... }; |
Note?如果上面只是NU_TURNS的聲明(沒有 '= 5'), 必須在類實現(xiàn)代碼中定義類的靜態(tài)成員:?const int GamePlayer::NUM_TURNS = 5; // mandatory definition;?goes in class impl. file;
[文中可能是寫反了, 頭文件中有了 '= 5'就已經(jīng)是定義了, 不需要在cpp中再定義;]
Note?類內(nèi)只允許初始化整數(shù)類型的靜態(tài)成員: int, bool, char...
Issue?必須在頭文件中定義靜態(tài)成員的情況: 當(dāng)你的類需要用到這個類的常量時: e.g.?GamePlayer::scores數(shù)組聲明(編譯時需要知道數(shù)組大小); [SIZE必須是靜態(tài)常量或枚舉數(shù)]
Solution?對于不支持頭文件定義靜態(tài)常量的編譯器,?借用enum, 當(dāng)需要int類型時可以使用枚舉類型:
?
| 1 2 3 4 5 6 7 | class? GamePlayer { private : ???? enum? { NUM_TURNS = 5 };? // "the enum hack" — makes ???? // NUM_TURNS a symbolic name for 5 ???? int? scores[NUM_TURNS];? //fine ... } |
#define?指令實現(xiàn)看起來像函數(shù)的宏, 但是不會導(dǎo)致函數(shù)的調(diào)用;
#define max(a,b) ((a) > (b) ? (a) : (b)) 要保證每個參數(shù)加上括號, 即使這樣還是會有預(yù)期外的情況:
| 1 2 3 | int? a = 5, b = 0; max(++a, b);? // a 的值增加了2 次 max(++a, b+10);? // a 的值只增加了1 次 |
>根據(jù)值來決定max的運行;
使用內(nèi)聯(lián)函數(shù)替代:?inline int max(int a, int b) { return a > b ? a : b; }
使用模板來擴展int之外的類型:
| 1 2 3 | template < class? T> inline? const? T& max( const? T& a,? const? T& b) {? return? a > b ? a : b; } |
>模板產(chǎn)生一套函數(shù), 每個函數(shù)比較兩個可以轉(zhuǎn)換成同種類型的對象, 返回大的;
Note?在使用模板寫max之類的通用函數(shù)前, 先檢查標(biāo)準庫中是否已經(jīng)存在;
const和inline減少了預(yù)處理的使用, 但是#include還不能缺少, #ifdef/#ifndef 在控制編譯的過程中也很重要;
條款2 盡量用<iostream>而不用<stdio.h>
scanf/printf 輕巧, 高效, 但不是類型安全的, 沒有擴展性; 需要把讀寫的變量和控制讀寫格式的信息分開(FORTRAN style);
>>和<<, 實現(xiàn)重載函數(shù)可以處理不同的類型; 讀寫語法形式相同, 不需要記住格式規(guī)定;
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | int? i;Rational r;? //有理數(shù) cin >> i >> r; cout << i << r; class? Rational { public : ???? Rational( int? numerator = 0,? int? denominator = 1); ... private : ???? int? n, d;? // 分子,分母 ???? friend? ostream& operator<<(ostream& s,? const? Rational& r); }; ostream& operator<<(ostream& s,? const? Rational& r) { ???? s << r.n <<? '/'? << r.d; ???? return? s; } |
>"opertaor<<"不是成員函數(shù)(是操作符);
相對不足:
1) 有些iostream的操作比起相應(yīng)的C stream效率低;?
2) 標(biāo)準化過程中, iostream庫在底層做了很多修改, 對要求最大可移植性的程序來說, 不同的廠商遵循標(biāo)準的程度不同;
3) iostream庫的類有構(gòu)造函數(shù), <stdio.h>里的函數(shù)沒有, 在某些涉及靜態(tài)對象初始化順序的時候, 如果可以確定沒有隱患, 用標(biāo)準C庫更簡單實用;
優(yōu)點:?iostream庫的類和函數(shù)類型安全, 可擴展性好;
庫的包含: <iostream>
#include <iostream.h> 得到的是置于全局空間的iostream庫元素;
#include <iostream> 得到的是置于名字空間std下的iostream庫元素;
全局空間獲取元素可能導(dǎo)致名字沖突;
?
轉(zhuǎn)載于:https://www.cnblogs.com/jiangu66/p/3196873.html
總結(jié)
以上是生活随笔為你收集整理的Effective C++ 第二版 1)const和inline 2)iostream的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北京智控美信(长春)数据中心应聘总结
- 下一篇: 海量数据笔试真题