<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/zlei12</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; zlei12]]></copyright><item><title><![CDATA[Efective C++之三十]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4285522</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4285522</guid><author>zlei12</author><pubDate>Sat, 20 Jun 2009 20:14:00 +0800</pubDate><description><![CDATA[      要点：理解inline的有缺点。      inline的基本想法就是用代码体取代函数调用。显然，这会增加代码大小，导致更多的页面交换、更低的缓存击中率等等。如果代码体小于函数调用代码，那inline导致代码更小、缓存击中率更高。      inline对编译器而言，只是建议，编译器不一定真的inline。定义inline有两种方式，在函数定义时隐式定义(通常是成员函数，也可以]]></description><category></category></item><item><title><![CDATA[Effective C++之二十九]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4285516</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4285516</guid><author>zlei12</author><pubDate>Sat, 20 Jun 2009 20:06:00 +0800</pubDate><description><![CDATA[      要点：争取写异常安全的代码。      Meyers通过PrettyMenu::changeBackground的例子，指出异常发生时可能发生的问题：      1) Mutex的资源泄漏      2) 没有new成功就改变了imageChanges      3) bgImage指针状态错误，指向已删除的内存。      从而引出异常安全函数的三种保证：  ]]></description><category></category></item><item><title><![CDATA[Effective C++之二十八]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4285320</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4285320</guid><author>zlei12</author><pubDate>Sat, 20 Jun 2009 16:57:00 +0800</pubDate><description><![CDATA[      要点：不要返回内部对象的句柄。      通过Rectangle的例子，Meyers指出其设计的自相矛盾：函数是const意为不可修改，但是返回引用又可修改内部数据。通过这个例子说明两个教训：      1) private成员变量，如果通过public函数返回引用，成员变量实际上是public的      2) const成员函数返回内部数据引用，则调用者可以修改数据。这]]></description><category></category></item><item><title><![CDATA[Effective C++之二十六]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4285106</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4285106</guid><author>zlei12</author><pubDate>Sat, 20 Jun 2009 15:09:00 +0800</pubDate><description><![CDATA[      要点：尽量延迟变量定义。      定义类变量是有开销的，定义时的构造和出了作用域后的析构。因此，应该尽量迟地定义变量。      进而，应该尽可能迟到该变量有初始化时定义；因为一般的，一次copy构造的开销小于一次确省构造 + 一次赋值函数调用。      对于有循环的情况，在循环内还是循环外定义变量，与构造、析构、赋值的开销以及循环次数n有关。Meyer是特别提出在循环]]></description><category></category></item><item><title><![CDATA[Effective C++之二十五]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4285087</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4285087</guid><author>zlei12</author><pubDate>Sat, 20 Jun 2009 15:01:00 +0800</pubDate><description><![CDATA[      要点：提供不会抛出异常的swap函数。      swap自STL引入后就成为异常安全(exception-safe)编程的基石。在条款11避免自赋值时已谈到过。      STL中swap的缺省实现是通过临时变量实现交换。但是对某些类型这是很低效的，例如pimpl只需要交换指针即可。      之后，Meyers提出在std命名空间内特例化函数模板swap的实现。由于函数]]></description><category></category></item><item><title><![CDATA[Effective C++之二十四]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4284882</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4284882</guid><author>zlei12</author><pubDate>Sat, 20 Jun 2009 13:11:00 +0800</pubDate><description><![CDATA[     要点：所有参数需要隐式类型转换时，请采用非成员函数。     使用隐式类型转换往往不是一个好主意，一个例外是定义数据类型时。Meyers举了有理数乘法的例子，说明：只有在参数列表中才能进行隐式类型转换，因此需要乘法操作定义为非成员函数。      Meyers特别探讨了，非成员函数不一定是对应类的友元函数。很多程序员认为与类相关的非成员函数应该是友元函数的观念是错误的。应尽可能避]]></description><category></category></item><item><title><![CDATA[Effective C++之二十三]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4284811</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4284811</guid><author>zlei12</author><pubDate>Sat, 20 Jun 2009 12:04:00 +0800</pubDate><description><![CDATA[     要点：优先考虑非成员非友元函数。     通过Browser类的clearBrowser函数，Meyers指出面向对象原则建议成员函数更好是不正确的。理由如下：     - 面向对象原则要求数据尽可能地封装     - 对成员变量而言，能访问它的代码越少，封装性更好，也更容易修改     - 从粗颗粒度的度量，封装性与可访数据的函数（成员函数、友元函数）个数成反比  ]]></description><category></category></item><item><title><![CDATA[Effective C++之二十二]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4284756</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4284756</guid><author>zlei12</author><pubDate>Sat, 20 Jun 2009 11:35:00 +0800</pubDate><description><![CDATA[　　要点：将成员变量声明为private。      有以下理由：      1) 接口语法的一致性。所有接口都是函数，均需()      2) 对成员变量访问的精确控制。例如不可直接访问、只读、读写      3) 封装性。首先能确保类的不变量( invariants)，而且保留修改实现的权利，例如可以采用计算来替代成员变量。       protected成员变量的封装]]></description><category></category></item><item><title><![CDATA[Effective C++之二十一]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4276261</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4276261</guid><author>zlei12</author><pubDate>Wed, 17 Jun 2009 13:46:00 +0800</pubDate><description><![CDATA[      核心思想：返回对象时不要返回引用。      Meyers举了有理数的例子，说明返回定义在堆栈上对象的引用，将导致错误。采用静态变量也不是解决问题的方法。      因此，不要返回指向堆栈的指针和引用，而是应该返回对象。]]></description><category></category></item><item><title><![CDATA[Effective C++之二十]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4276154</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4276154</guid><author>zlei12</author><pubDate>Wed, 17 Jun 2009 13:23:00 +0800</pubDate><description><![CDATA[     要点：优先使用const引用传递参数，而不是传值。     C++缺省的参数传递方式是传值。通过const引用传递参数要高效得多，因为它不再调用copy构造和析构函数。通过引用传递参数还可以解决切割（slicing）问题，当子类作为基类对象传递参数时，仅调用基类的copy构造函数，其子类部分被切割掉了。      对于内置的类型，传值更高效。传值同样适用于STL的迭代器和函数对象]]></description><category></category></item><item><title><![CDATA[Effective C++之十九]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4275829</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4275829</guid><author>zlei12</author><pubDate>Wed, 17 Jun 2009 11:18:00 +0800</pubDate><description><![CDATA[      要点：设计类时需要考虑的问题。      在C++中，设计类就是定义类型。重载函数和算符、分配释放内存、对象初始化结束等，均由设计者处理。设计优秀的类极具挑战性，它必须具备自然的语法、明确的语义及高效的实现。      每个类都要面对以下问题：      - 对象如何创建和销毁？它将影响构造、析构以及内存管理函数      - 对象初始化和赋值的差别是什么？    ]]></description><category></category></item><item><title><![CDATA[Effective C++之十八]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4275695</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4275695</guid><author>zlei12</author><pubDate>Wed, 17 Jun 2009 10:57:00 +0800</pubDate><description><![CDATA[      要点：防止客户错误使用接口的方法。      C++有函数接口、类接口和模板接口。理想情况下，如果使用接口无法实现客户期望的功能，则代码应无法通过编译；如果代码能通过编译，则应完成客户期望的功能。      设计不易出错的接口时需考虑客户可能会犯的错误，Meyers举了Date的例子。许多错误可以通过增加新的类型来防止，另一个方法是对类型进行限制，例如增加const。一致性是接]]></description><category></category></item><item><title><![CDATA[包设计原则]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4268732</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4268732</guid><author>zlei12</author><pubDate>Sun, 14 Jun 2009 18:20:00 +0800</pubDate><description><![CDATA[    Rebort Marti在《敏捷软件开发》一书中谈到了6条包设计原则。    3条包内聚性原则是关于颗粒度。分别是：    1) The Reuse-Release Equivalence Principle 重用-发布等价原则    2) The Common-Reuse Principle 共同重用原则。包内的类应该一起被重用。    3) The Common-Clo]]></description><category></category></item><item><title><![CDATA[OO设计原则]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4258043</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4258043</guid><author>zlei12</author><pubDate>Wed, 10 Jun 2009 16:34:00 +0800</pubDate><description><![CDATA[     Robert Martin在《敏捷软件开发 原则、模式和实践》中，阐述了OO设计的5项原则。      1)  The Single Responsiblilty Principle 单一职责原则          A class should have only one reason to change. 一个类应该仅有一种变化的原因。          职责是一种变化]]></description><category></category></item><item><title><![CDATA[Effective C++之十七]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4249288</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4249288</guid><author>zlei12</author><pubDate>Sun, 07 Jun 2009 14:00:00 +0800</pubDate><description><![CDATA[      要点：必须在单独语句中将newed对象保存于智能指针。       Meyers举了这样的例子：processWidget(std::tr1::shared_ptr(new Widget), priority());       以上语句可能发生问题的原因是：C++编译计算表达式的顺序不是固定的。如果processWidget函数计算参数的顺序是：     1) n]]></description><category></category></item><item><title><![CDATA[Effective C++之十六]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4249276</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4249276</guid><author>zlei12</author><pubDate>Sun, 07 Jun 2009 13:47:00 +0800</pubDate><description><![CDATA[     核心思想：new和delete，new[]和delete[]对应使用。      如果错误地使用，将会产生未定义的行为。Meyers提到，当使用了typedef之后，要特别注意此问题。      附：推荐使用boost::checked_delete和boost::checked_array_delete，当编译器发现delete一个未完全定义(an incomplete]]></description><category></category></item><item><title><![CDATA[Effective C++之十五]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4249254</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4249254</guid><author>zlei12</author><pubDate>Sun, 07 Jun 2009 13:32:00 +0800</pubDate><description><![CDATA[      主题：资源管理类中提供直接访问底层资源的机制。       资源管理类能防止资源泄漏。理想情况下，我们均采用资源管理类与底层资源交互。但是，许多API需要直接访问底层资源，所以需要提供直接访问底层资源的机制。       有两个方法将资源管理类转换为底层资源：显式转换(explicit conversion)和隐式转换(implicit conversion)。 ]]></description><category></category></item><item><title><![CDATA[Effective C++之十四]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4249145</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4249145</guid><author>zlei12</author><pubDate>Sun, 07 Jun 2009 12:32:00 +0800</pubDate><description><![CDATA[      主题：仔细考虑资源管理类的复制行为。       不是所有的资源都是在堆上分配，这样就无法使用条款13。Meyers通过Mutex类例子，提出一个问题：如何定义资源管理类的复制行为？        大多数情况下，可采用以下方案之一：       1) 禁止复制。想mutex之类的同步类，就不应该负责；       2) 对底层资源进行引用计数。如果Lock采用引]]></description><category></category></item><item><title><![CDATA[Effective C++之十三]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4249079</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4249079</guid><author>zlei12</author><pubDate>Sun, 07 Jun 2009 11:49:00 +0800</pubDate><description><![CDATA[     核心思想：采用对象管理资源。      Meyers通过Investment类说明了3种因没有delete造成资源泄漏的情况：     1) delete前return了     2) cretaeInvesetment和delete在循环中，在循环中某处continue、break或goto了     3) delete前发生了异常。      可以采用st]]></description><category></category></item><item><title><![CDATA[C++图书阅读进阶]]></title><link>https://blog.youkuaiyun.com/zlei12/article/details/4226482</link><guid>https://blog.youkuaiyun.com/zlei12/article/details/4226482</guid><author>zlei12</author><pubDate>Sat, 30 May 2009 20:08:00 +0800</pubDate><description><![CDATA[C++图书阅读进阶： 1) C++ Primer Plus或Thinking in C++，学习C++基础知识 2) The C++ Standard Library A Tutorial and Reference，学习stl基础知识 3) Effective C++、More Effective C++、Exceptional C++、 More Exceptional C++、E]]></description><category></category></item></channel></rss>