Effective C++ 讀書筆記(四)
版權(quán)聲明:本文為 cheng-zhi 原創(chuàng)文章破喻,可以隨意轉(zhuǎn)載,但必須在明確位置注明出處!
讓自己習(xí)慣 C++ - 條款 02
盡量以 const团滥,enum,inline 替換 #define
不建議的做法
#define NUM 1
建議的做法
const int num = 1;
當(dāng)你需要在一個(gè) class 中使用常量作為數(shù)組的大小時(shí)报强,萬一你的編譯器不允許你使用 static 整數(shù)型常量完成 in class 的初始值設(shè)定灸姊,此時(shí)你可以使用 enum,例如:
class MyType
{
private:
enum { num = 10};
int arrays[num];
};
在 C++ 中不要使用 #define 來定義宏函數(shù)秉溉,不要像下面這樣
#define MAX(a, b) f((a) > (b) ? (a) : (b))
你應(yīng)該使用 inline 函數(shù)替換 #define
template<typename T>
inline void my_max(const T& a, const T& b)
{
f(a > b ? a : b);
}
原則
- 使用 const 來定義單個(gè)常量力惯。
- 使用 inline 來定義形式函數(shù)的宏。
模板與泛型編程 - 條款 42
了解 typename 的雙重意義
第一層:作為類模板的參數(shù)時(shí)召嘶,與 class 功能相同父晶。
template<class T> class MyType;
template<typename T> class MyTYpe;
這兩個(gè)定義完全相同。
第二層: typename 可以讓模板里面定義嵌套從屬名稱的類型變成有效的類型弄跌,因?yàn)?C++ 的解析器在模板中遇到嵌套從屬類型時(shí)甲喝,默認(rèn)認(rèn)為它是無效的類型。
例如:無效的嵌套從屬類型
template<typename T>
void fun(const T& t)
{
T::const_iterator iter(t.begin());
}
我們需要認(rèn)為指定它為有效的嵌套從屬類型
template<typename T>
void fun(const T& t)
{
typename T::const_iterator iter(t.begin());
}
一般情況
當(dāng)你想在 template 中指定一個(gè)有效的嵌套從屬類型名稱铛只,只需要在嵌套從屬類型前面加上 typename 關(guān)鍵字即可埠胖。
例外
- 不得在 base class list 中使用 typename
/* 錯(cuò)誤用法 */
class Deriver : public typename Base<T>::MyType;
- 不得在 member initialization list 中使用 typename
class Deriver : public Base<T>::MyType
{
public:
/* 錯(cuò)誤用法 */
explicit Deriver(int x) : typename Base<T>::MyType(x)
{
}
};
原則
- class 和 typename 在聲明模板參數(shù)時(shí)作用相同。
- 使用 typename 標(biāo)識(shí)嵌套從屬類型淳玩,但是不得在 base class list 和 member initialization list 中使用直撤。