c 學習筆記十六

2021-09-01 17:28:06 字數 3397 閱讀 9495

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...