c with classes
盡量以const enum inline 替換#define
示例**:
#define aspect_ratio 1.653 //不進入記號表(symbol table)
替換為const aspectratio 1.653 //進入記號表
定義常量字串
const std::string authorname("retacn");
class專屬常量
示例**如下:
class gameplayer;
the enum hack替換define
class gameplayer;
int scores[numturns];
}如果不想讓別人獲得乙個pointer或reference指向你的某個整數常量,可以使用其約束
template inline替換巨集定義(macros)
示例**如下:
#define call_with_max(a,b) f((a)>(b)?(a):(b))
替換為:
template
inline void callwithmax(const t& a,const t& b)
#include #ifdef #ifndef 仍是控制編譯的重要角色
const的使用
const修飾指標
示例**如下:
char greeting ="hello world"
char* p =greeting; //non-const pointer,non-const data
const char* p=greeting; //non-const pointer,const data
char* const p =greeting; //const pointer,non-const data
const char* p const p =greeting; //const pointer,const data
注:如果出現在*的左邊,表示物是常量
分為以下兩種情況,可以位於型別的左邊或是右邊:
void f1(const widget* pw);
void f2(widget const * pw);
如果出現在*右邊,表示指標自身是常量
如果兩邊都出現,表示兩者都是常量
const 修飾迭代器
示例**如下:
std::vectorvec;
...const std::vector::iterator iter=vec.begin();//迭代器不得指向不同的東西
*iter=10; //可以
++iter; //錯誤,iter是const
std:vector::const_iterator citer=vec.begin();//迭代器所指的東西不可變
*citer=10; //錯誤 *citer是const
++citer; //可以
const修飾函式
//令函式返回乙個常量數
class rational;
const rational operator* (const rational& lhs,const rattional& rhs);
const修飾成員函式
//使成員函式可以作用於乙個const物件身上
示例**如下;
class testblock
char& operator(std::size_t position)
}//使用
textblock tb("hello");
std::cout<< tb[0];//呼叫non-const textblock::operator
const textblock ctb("world");
std::cout<(static_cast(*this)[position]);}};
物件使用前需要先行初始化
示例**如下:
int x=0; //基本型別手工初始化
const char* text="a c-style string";//指標手工初始化
double d;
std::cin>>d; //以讀取input stream 的方式進行初始化
建構函式將物件進行初始化
示例**如下;
class phonenumber;
//address book entry
class abentry;
//建構函式(成員初始列 member initialization list)對其物件進行初始化
abentry::abentry(const std::string& name,const std::string& address,const std::list& phones)
:thename(name),theaddress(address),thephone(phones),numtimeconsulted(0)
{}//對其物件進行賦值
abentry::abentry(const std::string& name,const std::string& address,const std::list& phones)
不同編譯單元內定義之non-local static物件的初始化
兩個原始碼檔案,每個檔案內至少包含乙個non-local static物件
static物件的生命週期,從構造出來直到程式結束為止.
函式內的static物件稱為local static
其他(global物件、定義於namespace作用域內的物件、在class內、在file作用域內)物件稱為non-local static
編譯單元(translation unit) 指產出單一目標檔案(single object file)的原始碼
示例**如下:
//應用場景
//單一檔案系統
class filesystem;
extern filesystem tfs;//預備給客戶使用
//客戶用以處理檔案系統內的目錄
class directory;
directory::directory(params)
//建立乙個directory物件,用來處理臨時檔案
directory tempdir(params);
//好的處理方式 看過design patterns的話,這就是單例模式的乙個實現手法
//以函式呼叫(返回乙個reference指向local static物件)替換"直接訪問non-local static物件"
class filesystem;
filesystem& tfs()
class directory;
directory::directory(params)
directory& tempdir()
C 學習筆記(十六) 繼承
繼承的好處 減少重複 語法 class 子類 派生類 繼承方式 父類 基類 三種繼承方式 public 繼承 公有繼承 父類中的public許可權在子類中是public許可權 父類中的protected許可權在子類中是protected許可權 父類中的private許可權在子類中不可訪問 prote...
C 學習筆記(十六)列舉
列舉 列舉是由使用者定義的值型別的資料型別。列舉只有一種資料型別成員 命名的整數值常量,預設為int。預設情況下,第乙個成員賦值為0,後續自增1。在列舉宣告中沒有分號,只有逗號分隔的列表。列舉的成員型別不能使用修飾符,他們隱式地具有和列舉相同的可訪問性。不能列舉成員之間不能做比較。1.設定底層型別和...
c 學習筆記(十六) 函式模板
函式模板 1 函式模板可以像普通函式一樣被過載 2 c 編譯器優先考慮普通函式 3 如果函式模板可以產生乙個更好的匹配,那麼選擇模板 4 可以通過空模板實參列表的語法限定編譯器只通過模板匹配 測試 int max int a,int b template告訴編譯器,這裡開始進行泛型程式設計 type...