《c 程式設計剖析 問題,方案和設計準則》筆記

2021-07-02 20:23:05 字數 2652 閱讀 4186

1 2

3

templatevoid destroy(t* p)              // 注意這裡的泛型要求是乙個指標

templatevoid destroy(fwdlter first,fwdlter last) // 注意這裡的泛型只要求是個迭代器就行

}

4引數匹配一樣好的情況下

/* 

有乙個base類,有sub1和sub2子類,這兩個子類有乙個共同的屬性

public string sname;

現在我定義乙個模板函式

*/templatevoid say(t t)

{ cout<

選擇匹配性最好的主函式模板

選擇好了的主函式模板中只有在某個主模版被選定的情況下,其特化版本才可能被使用,也就是說,模板特化並不參與過載選擇

templatevoid f(t); // 主模板a

template<>

void f(int*); // 對主模板a的特化模板b

templatevoid f(t*); // 主模板c,是主模板a的過載

int *p;

f(p); // 這時會呼叫主模板c! ,因為在第2步挑選主模板是,就選擇了該過載的模板

5

6 7選擇作用域.

在子類中過載父類的方法會掩蓋父類的所有同名方法

在候選的同名函式中選擇適當的最佳匹配

這意味著即使父類中有可訪問的同名函式,也不會被訪問到

8 99.1標準版new的相互比較

new型別

定義形式

是否進行記憶體分配

是否可能失敗

是否丟擲異常

是否可替換

簡單new

void* ::operator new(std::size_t size) throw(std::bad_alloc);

是是,丟擲異常

std::bad_alloc

是nothrow new

void* ::operator new(std::size_t size,const std::nothrow_t &) throw();

是是,返回null否是

定位new

void* ::operator new(std::size_t size,void* ptr)throw();否否

否否其他型別的new

void* ::operator new(std::size_t size,其他任意引數…);

類相關的new

void* class::new(std:size_t size,…)

9.2選擇作用域

編譯器先從子類作用域中查詢operator new,再從基類,然後全域性查詢. 一旦找到有任何一種operator new定義就停止查詢,而只在該作用域內查詢operator new操作. 這意味著再往外層的作用域就不予考慮了.

選擇合適的過載operator new函式

檢查合適的operator new函式的訪問規則是否允許訪問.

9.3這是因為:

可能會忽略檢查nothrow new的返回值,從而掩蓋失敗

在某些作業系統實現上,直到記憶體實際被使用時才會申請. 這是new永遠不會返回失敗,但是在後面對記憶體的操作語句中,每一句都可能失敗.

在擁有虛擬記憶體的系統上,new幾乎不會失敗,因為在虛擬記憶體耗盡之前,系統就已經很慢了,然後系統操作員就開始殺掉一些程序了.

即使真的檢測到了new失敗,由於記憶體已經所剩不對了,你也幾乎做不了什麼,只能讓程式退出.

10在乙個類的定義內部,你只可以通過using宣告來帶入基類中的名字,而不能帶入諸如全域性名字或其他類中的名字. 11

在宣告和表示式語句這兩者的語法形式之間可能會出現二義性:乙個函式風格的顯式類似轉換(exp.type.conv)作為其最左端的子表示式的表示式語句和乙個其第乙個宣告子(declarator)以"("開頭的宣告語句可能無法區分開. 在這種情況下,該語句被解釋為宣告.

例如

dequecoll2(coll1.begin(),coll1.end());

dequecoll3(istream_iterator(cin),istream_iterator());

// 上面這句話本意是定義乙個coll3,型別為deque,其初始值從cin取得.

// 然而編譯器會認為這是宣告了乙個名為coll3的函式,其返回deque. 他有兩個引數,乙個引數名為cin,型別為istream_iterator. 另乙個引數沒有名字,型別也為isteram_iterator

12

所謂三字元組(trigraph)是指3個字元組成的轉義符,比如"??/"="\","??!"="~". 類似的還有二字元組,比如":>" = "]" 舉個例子:

// 這裡的注釋,包含了幾行的內容??/

第二行其實也被注釋了,因為第一行的"??/"被解釋為"/",這個轉義符把接下來的換行符吃掉了...

date: 2014-05-15t22:38+0800

《C 程式設計剖析 問題 方案和設計準則》導讀

c 程式設計剖析 問題 方案和設計準則 布達佩斯,匈牙利的首都。乙個炎熱的夏日傍晚。穿過美麗的多瑙河望去,餘暉中的東岸景色優美恬靜。在本書封面上色彩柔和的歐洲風光中,哪棟建築首先映入你的眼簾?幾乎可以肯定,是 左邊的國會大廈。這棟巨大的新哥德式建築以它優美的圓穹 直插天際的尖塔 不計其數的外牆雕塑以...

C 程式設計規範 組織和策略問題

第0條 不要拘泥於小節 又名 了解那些東西不應該標準化 只規定需要規定的事情 不要強制施加個人喜好或者過時的做法。詳細 1 應該使用縮進來體現 的結構。建議每個縮排使用4個空格或者設定編輯器的製表符大小為4個空格,並且應該在每個檔案中保持一致。2 應該保證 行的長度有利於閱讀。建議每行不超過10個單...

C 程式設計規範之組織和策略問題

組織和策略問題 第0條 不要拘泥於小節 了解哪些東西不應該標準化 摘要 只規定需要規定的事情 不要強制施加個人喜好或者過時的做法。程式的編寫存在一些準則是必要的,例如命名準則,但沒有必要要求所有人都遵守這些,否則條條框框太多,否則限制了語言的能力。函式並不是單入口單出口,雖然表面上看是的。第1條 在...