?————————— 第二章 —————————
1.(P11)
C++規定:除了以typename修飾外,template內的任何標志符號都被視為一個值(value)而非一個型別。
eg.
?
class?MyClass{?
????typename?T::SubType?*ptr;?
};
?
?
這里typename指出SubType是class T中定義的一個型別,因此ptr是一個指向T::SubType的指針,否則SubType會被當作一個static成員,于是:
T::SubType *ptr被認為是SubType與ptr的乘積。
?
2.(P12)
template class 的 member template問題:
下面例子,即使兩個型別之間可以自動轉換,如int和double,如果我們對assign()使用不同的template型別,也會出錯。
?
class?MyClass{?
private:?
????T?value;?
public:?
????void?assign(cosnt?MyClass<T>&?x)?
????{?
????????//?x?must?have?same?type?as?*this?
????????value?=?x.value;?
????}?
????...?
};
?
?
再看這個:
?
class?MyClass{?
private:?
????T?value;?
public:?
????template?<class?X>??//?member?template?
????void?assign(cosnt?MyClass<X>&?x)?
????{?
????????//?allows?different?template?types?
????????value?=?x.getValue();?
????}?
????T?getValue()?const{?
????????return?value;?
????}?
????...?
};
?
?
現在,assign()的參數x和*this的型別并不相同,所以兩個類也就不同,
不能再直接存取MyClass<>的private成員和 protected成員,取而代之,
此例中使用了getValue()
?
3.(P14)
對基本型別的顯示初始化
如果采用不含參數、明確的constructor調用語法,基本型別會被初始為零
eg.
?
int?i2?=?int();???//?initialized?with?zero
?
?
?
4.(P16)
異常問題。
?? ①.異常處理不是錯誤處理
?? ②.? void f() throw(xxx) 是f()拋出XXX類型的異常,
????? 而void f() throw()? 是指f()不拋出任何異常,這里好多人容易弄錯。
?
5.(P16)
命名空間。
eg.
?
????class?A;?
????class?B;?
????...?
}?
...
?
?
則using tankywoo::A會使A成為當前作用域內代表tankywoo::A的同義字
而using namespace tankywoo會使namespace內的所有名字曝光(A和B)。
?
?————————— 第三章 —————————
?6.(P23)
命名空間
上一篇也講過。
使用C++標準程序庫的任何標識符時,有三種選擇:(以下都以cout為例)
①直接指定標識符:
?
②使用using declaration,可使我們不再需要加上”std::”
???cout?<<?"Tanky?Woo"?<<?std::endl;
?
③使用using directive,那么std內定義的所有標識符都有效。
??cout?<<?"Tanky?Woo"?<<?endl;
?
?
7.錯誤處理和異常處理
異常處理這塊接觸的少,而且第三章這里也是簡略的講到,所以這里先放著,有經驗了再補。
?
8.配置器(Allocators)
同上。?
?
?