Exceptional C++ 中文版 讀書筆記

1.vector<Date>::iterator last = find(e.begin(),e.end(),"12/31/95");

  *last = "12/30/95";

可能出現的錯誤:如果find沒有找到"12/31/95"迭代器講返回第二個參數e.end(),而e.end()指向最後一個元素的下一個位置,對這個返回的值解引用和賦值是錯誤的

 

2.copy(first,last,ostream_iterator<Date>(cout,"/n"));

可能出現的錯誤:first在容器中指向的對象要求在last後面,否則這就不是一個有效的範圍

 

3.e是函數內部聲明的一個臨時對象,e.insert(--e.end(),TodaysDate());

這裏引用了e.end(),如果容器e是空的,e.end()有可能指向非有效迭代器

 

4.把臨時對象進行修改在C++中是不允許的

例如下面代碼是非法的:
Date *f( );
p = --f( );//錯誤應該寫爲"f( ) -1"
f()運行過後就會釋放

Date &f( );
p = --f( );//這樣就可以了
比如 int f(){static int i;return i;}
 int &f(){static int i;return i;}
p = --f( )纔可以使用

 

5.迭代器使用時要注意:

(1)禁止對無效的迭代器進行解引用

*e.end()尤其危險

(2)迭代器有效生存期

(3)迭代器的有效範圍,兩個迭代器之間要形成有效的範圍

(4)對內部類型的非法操作

 

6.編寫一個大小寫不敏感的字符串類型

string類型在頭文件中被定義爲 typedef basic_string<char> string;

模板basic_string<>聲明爲

template<class charT,

                class traits = char_traits<charT>,

                class Allocator = allocator<charT>>

class basic_string;

字符串交互的的函數在char_traits ,重新編寫一個不同於char_traits的模板,然後定義一個ci_string類,繼承string類的其它方法

typedef basic_string<char,ci_char_traits> ci_string;

另外在沒有重新定義運算符重載的情況下要使用cout<<或字符串鏈接+ +=等操作時,要在ci_string後加.c_str()轉換成string類的操作

 

7.LSP:Liskov替換原則:子類型必須能夠替換它們的基類型,一個軟件實體如果使用的是一個基類的話,那麼一定適用於其子類,而且它根本不能察覺出基類對象和子類對象的區別。只有衍生類替換基類的同時軟件實體的功能沒有發生變化,基類才能真正被複用

8.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章