Effective C++ 讀書筆記(五)
版權聲明:本文為 cheng-zhi 原創(chuàng)文章舒岸,可以隨意轉載绅作,但必須在明確位置注明出處!
讓自己習慣 C++ - 條款 03
盡可能的使用const
const
允許你指定一個語義約束:指定一個對象不可被改變蛾派,下面是 const 的幾種常見的使用方法:
const 修飾指針
char greeting[] = "Hello";
// non-const pointer, non-const data
char *p = greeting;
// non-const pointer, const data
const char *p = greeting;
// const pointer, non-const data
char *p const = greeting;
// const pointer, const data
const char * const p = greeting;
// const iter, non-const data
const std::vector<int>::iterator iter;
// non-const iter, const data
std::vector<int>::const_iterator iter;
const 修飾函數(shù)
- const 修飾函數(shù)返回值
// 將函數(shù)的返回值聲明為 const俄认, 可以防止返回值被惡意賦值
const MyType function();
- const 修飾函數(shù)參數(shù)
// 表示參數(shù) x 在函數(shù)內部不能被改變
MyType function(const int x);
- const 修飾成員函數(shù)
// 該成員函數(shù)可以操作 const 對象
MyType function(const int x) const;
// 兩個成員函數(shù)如果常量性不同,可以被重載
char& operator[](std::size_t position) const;// 針對 const 對象
char& operator[](std::size_t position); // 針對 non-const 對象
如何取消 const 屬性碍脏?
使用 mutable 去掉 const 屬性梭依。
// 這個成員變量可以在 const 成員函數(shù)內被更改
mutable bool flag;
如何在 const
函數(shù)和 non-const
函數(shù)之間避免代碼重復?
如果 const
函數(shù)和 non-const
函數(shù)的函數(shù)定義基本相同典尾,我們可以使用 non-const
函數(shù)來間接調用 const
函數(shù)來減少重復的代碼役拴,這其中涉及到兩次 const
轉型。
// const 函數(shù)
const char& operator[](std::size_t position) const
{
...
}
// non-const 函數(shù)
char& operator[](std::size_t position)
{
// 1. 將 *this 轉換成 const ClassName& 類型钾埂,使得后面的 [position] 得以調用到 const 版本的函數(shù)
// 2. 從 const operator[] 中移除 const 屬性河闰。
return const_cast<char&>(static_cast<const ClassName&>(*this)[position]);
}
原則:
- 將事實上確實不可變的東西聲明為
const
,可以幫助編譯器偵測出錯誤用法褥紫。 - 當
const
和non-const
成員函數(shù)的定義等價時姜性,讓non-const
調用const
可以避免代碼重復。
盡可能的使用 const