
effective c++读书笔记
NvRom
这个作者很懒,什么都没留下…
展开
-
Item 44:将与参数无关的代码抽离templates
template为每一个模板参数生成一份代码,可能会造成代码膨胀。模板参数分为类型参数和非类型参数,通常非类型参数比较容易造成代码膨胀,例如下面一个例子:template<typename T, std::size_t n>class SquareMatrix{ public: ... void invert(); //求逆矩阵};SquareMatrix<dou原创 2017-03-28 18:57:47 · 273 阅读 · 0 评论 -
Item 43: 学习处理模板化基类内的名称
模板都会编译两次,第一次检查语法,第二次具现化。假如模板有不同参数,则会对每个参数都具现一次。如果参数不确定,则不可能具现,也就不知道它的行为。 一个类模板继承于另一个相同模板参数的基类,派生类使用到基类的成员时,编译器往往会报错该成员未定义。因为在第一次编译的语法检查中,即使知道Derived继承自Base,但其中的T是个template参数,不到Derived被具现化无法确切知道它是什么,而原创 2017-03-28 18:59:39 · 321 阅读 · 0 评论 -
Item 45: 利用成员函数模板接受所有兼容类型(智能指针的部分实现)
真实指针做得很好的一件事是,它支持隐式转换,如下: class Top { ... }; class Middle: public Top{ ... }; class Bottom: public Middle { ... }; Top* pt1 = new Middle; //将Middle*转换为Top* Middle* pt2 = new Bot原创 2017-03-28 19:05:48 · 310 阅读 · 0 评论 -
Item 42: 了解typename的双重意义
typename和class的差别原创 2017-03-28 18:48:06 · 381 阅读 · 0 评论 -
Item 24: 若所有参数皆需要类型转换,请为此采用non-member函数
这里的non-member函数对应的另一个函数是member函数,member函数暗含着一个this参数,所谓的“若所有参数比需要类型转换,必须采用non-member函数”的原因就在于,member函数暗含的*this参数是转换不了的!例如我们前面提到的operator应用于Rational,假如operator*是Rational的一个member函数:class Rational{ pub原创 2017-03-28 19:11:59 · 407 阅读 · 0 评论 -
Item 46: 需要类型转换时请为模板定义非成员函数
我们在Item 24提到过用将Rational的operator*声明为non-member,从而使2*oneHalf得以成功调用该函数。这是在没有template的情况下。Rational和operator*被模板化后会怎样呢?template<typename T>clas Rational{ public: Rational( const T& numerator=0, cons原创 2017-03-28 19:19:43 · 273 阅读 · 0 评论 -
Item 48: 认识template元编程
我们在Item 47留下了一个问题,现在再来看一看:template<typename IterT, typename DistT>void advance( IterT& iter, DistT d ){ if( typeid(typename std::iterator_traits<IterT>::iterator_category) == typeid(std::rando原创 2017-03-28 19:29:45 · 351 阅读 · 0 评论 -
Item 47: 请使用traits class表现类型信息
为了说明traits class的作用,这一节用迭代器做了一个例子。 STL有五种迭代器: (1)Input迭代器只能向前移动,且一次一步,客户只可读取它们所指的东西,而且只能读一次;这一类代表是istream_iterator。 (2)Output迭代器跟Input相似,但是客户只可涂写它们所指的东西,而且只能写一次;这一类代表是ostream_iterator。 (3)Forwa原创 2017-03-28 19:27:33 · 455 阅读 · 0 评论 -
Item 41: 了解隐式接口和编译期多态
通常显式接口由函数的签名式(函数名称、参数类型、返回类型)构成。例如Widget class: class Widget{ public: Widget(); virtual ~Widget(); virtual std::size_t size() const; virtual void normalize(); void swap( Widget&原创 2017-03-28 19:41:00 · 346 阅读 · 0 评论