Robin Chow's C++ Blog

 

[导入]Exception C++ 之 11

编码标准:
  1. 封装和隔离。
  2. 在声明一个类的时候,应避免暴露出其私有成员。
  3. 应该使用一个形如“struct Xxxxlmpl *pimpl_”的不透明的指针来存储私有成员(包括状态变量和成员函数)。
使用pimpl(编译器防火墙)可以大大降低代码之间的相互依赖性,对于pimpl_需要注意:
  1. pimpl_中存储的是私有变量和私有成员函数。
  2. 一般需要一个反向指针(习惯称为self_)来调用可见类的函数。
  3. 即使虚拟函数是私有的,也不能把虚拟成员函数隐藏在pimpl类中。

文章来源:http://my.donews.com/robinchow/2007/01/13/qwtfsgyamrxaxddpwhxeyatxgntnrlthhnna/

posted @ 2007-10-23 20:51 Robin Chow 阅读(72) | 评论 (0)编辑 收藏

[导入]Exception C++ 之 12

Koenig Lookup:
如果你给函数提供一个 class 类型的实参,那么在名称搜索时,编译器将认为包含实参类型的命名空间中的同名函数的可选函数。
接口原则:
对于一个类X,所有的函数,包括自由函数,只要同时满足
  • “提到”X,并且
  • 与X“同期提供”
就是X的逻辑组成部分,因为它们组成了X的接口。

接口原则与 Koenig lookup 的行为相同,因为 Koenig lookup 的行为正是建立在接口原则的基础上的。
小结:
  1. 接口原则:对于 class X,所有的函数,包括自由函数,只要同时满足(a)“提及”X,(b)与 X“同期提供”,那么它就是X的逻辑组成部分,因为它们是 X 的接口的一部分。
  2. 因此,成员和非成员函数都是一个 class 的逻辑组成部分。只不过成员函数比非成员函数有更强的关联关系。
  3. 在接口原则中,对“同期提供”的最有用的解释是“出现在相同的头文件和/或命名空间中”。如果函数与 class 出现在相同的头文件中,在依赖性分析时,它是此 class 的组成部分。如果函数与类出现在相同的命名空间中,在对象引用和名称搜索时,它是此 class 的组成部分。



文章来源:http://my.donews.com/robinchow/2007/01/14/tlcchrdcrthuzvbqdhrczbijwughfpwzbybi/

posted @ 2007-10-23 20:51 Robin Chow 阅读(64) | 评论 (0)编辑 收藏

[导入]Exception C++ 之 13

C++ 中的内存区域分为6块:
  1. 常量数据区:存储字符串等在编译期间就能确定的值。类对象不能存在与这个区域中。在程序的整个生存周期内,区域中的数据都是可用的。区域内的所有数据都是只读的,任何企图修改本区域数据的行为都会造成无法预料的后果。
  2. 栈区:存储自动变量。栈区中,内存一旦被分配,对象就立即被构造好了;对象一旦被销毁,分配的内存也立即被收回。
  3. 自由存储区:是 C++ 的两个动态内存区域之一,使用 new 和 delete 来予以分配和释放。
  4. 堆区:是另一个动态存储区域,使用 malloc、free 以及一些相关变量来进行分配和回收。
  5. 全局/静态区:在程序启动时才被分配,而且可能直到程序开始执行的时候才被初始化。比如,函数中的静态变量就是在程序第一次执行到定义该变量的代码时才被初始化的。对那些跨越了编译单元的全局变量进行初始化操作的顺序是没有被明确定义的,因而需要特别注意管理全局对象(包括静态类对象)之间的依赖关系。
另外注意,C++ 标准对于堆和自由存储区是否有联系没有予以详细说明,不同编译器可能有不同的实现。

文章来源:http://my.donews.com/robinchow/2007/01/14/kvdartgbqpsrlrmsxjgnplhdrqqyqtkapnag/

posted @ 2007-10-23 20:51 Robin Chow 阅读(89) | 评论 (0)编辑 收藏

[导入]Exception C++ 之 14

关于内存管理:
  1. new 和 delete 必须配套提供,即提供了 new 就必须提供相应的 delete,反之亦然。
  2. 如果基类的析构函数声明为 virtual,则对基类指针调用 delete 时总是调用派生类的析构函数,因而也总是调用派生类的 delete。
  3. 绝对不要以多态方式处理数组(见《More Effective C++》条款3)。
  4. new 和 delete 总是静态的,即使它们不被显式的声明为 static。总是把它们声明为 static 是个很好的习惯,这可以让所有阅读代码的程序员明白无误的认识到这一点。

文章来源:http://my.donews.com/robinchow/2007/01/14/cnfqokuxltsdoepsgwhcvonezmrrzircwxsk/

posted @ 2007-10-23 20:51 Robin Chow 阅读(68) | 评论 (0)编辑 收藏

[导入]Exception C++ 之 15

使用 auto_ptr(灵巧指针)的注意事项:
  1. 对于 auto_ptr,拷贝不是对等的。右侧的对象不再拥有对象的所有权。
  2. 不再拥有所有权的 auto_ptr 的指针会被置为 NULL,因而对它的解引用会导致错误。
  3. 使用 const auto_ptr 可以防止将该灵巧指针赋值给其他灵巧指针。

文章来源:http://my.donews.com/robinchow/2007/01/14/xzuxgvbkpleammqcmlzlsjhkcqmgfdpddjaj/

posted @ 2007-10-23 20:51 Robin Chow 阅读(55) | 评论 (0)编辑 收藏

[导入]Exception C++ 之 16

  • 如果需要的话,请编写一个私有函数来使拷贝操作和拷贝赋值共享代码;千万不要利用“使用显式的析构函数并且后面跟一个 placement new”的方法来达到“以拷贝构造操作实现拷贝赋值操作”这样的目的。也就是说,决不要编写如下的代码:
    T& T::operator=(const T &other)
    {
        if(this != &other)
        {
           this->~T();               // 有害!
           new (this) T(other);   // 有害!
        }
        return *this;
    }
  • 关于拷贝赋值操作符有两点需要注意:
    1. 将拷贝赋值操作声明为“T& T::operator=(const T&)”
    2. 不要返回 const T&,尽管这样做避免了诸如“(a = b) = c”的用法;这样做意味着:你无法出于移植性的考虑而将 T 对象放入标准程序库之容器 -- 因为其需要赋值操作返回一个单纯的 T&。

文章来源:http://my.donews.com/robinchow/2007/01/14/uufhhtovwfvygicxibjufbugcnhamivhcapk/

posted @ 2007-10-23 20:51 Robin Chow 阅读(52) | 评论 (0)编辑 收藏

[导入]Exception C++ 之 17

  1. 建议总是使用“SomeType t(u)”的形式,一来是因为只要可以用“SomeType t = u”的地方也同样可以用它;二来是因为它还有一些其它的有点,比如支持多个参数等。
  2. 关于 const:
    • 如果函数的返回类型不是一个内建(built-in)的类型的话,通常应该将其返回类型也声明为 const。这样可以避免该函数的调用者企图修改临时对象。
    • 对于传引用作为实参,可以将其声明为 const 以防止对其进行修改;如果使用传值,则没有必要声明为 const。
    • 如果一个函数从逻辑上来说是 const 的,则应该将其声明为 const 函数,即使该函数实际修改了对象的状态,这时候必须将要修改的值声明为 mutable。
  3. 关于类型转换:
    • dynamic_cast:对公有继承的基类和派生类进行转换,转换失败时返回 NULL。
    • reinterpret_cast:对于互不相同、区别开来的类型(例如函数指针),尽管它们之间存在着隐式转换,它们也是互无联系的,应该用 reinterpret_cast 进行转换。




文章来源:http://my.donews.com/robinchow/2007/01/15/HxCWeJTzfsIHxGSohwbqozDYDPwcLcYtAApF/

posted @ 2007-10-23 20:51 Robin Chow 阅读(94) | 评论 (0)编辑 收藏

[导入]C++ 代码优化(英文)

值得一看:

C++ Code Optimizations
文章来源:http://my.donews.com/robinchow/2007/01/15/bimskiqoaxkxvxlvzbfgoxtnrlgtocbpkohu/

posted @ 2007-10-23 20:51 Robin Chow 阅读(89) | 评论 (0)编辑 收藏

[导入]不使用第三个数来交换两个数的值的方法(英文)



Interchanging 2 variables without the use of a third - Programming/PHP
文章来源:http://my.donews.com/robinchow/2007/01/15/nbctysjyzmipdsnjkfhkwjgoqubiylxlmael/

posted @ 2007-10-23 20:51 Robin Chow 阅读(102) | 评论 (0)编辑 收藏

[导入]Hohoho

http://www.ianai.net/jokes/WillNotThrow.gif
文章来源:http://my.donews.com/robinchow/2007/01/15/cglotemjvscvgbjpnasvjzxcgxvqqugtbsiv/

posted @ 2007-10-23 20:51 Robin Chow 阅读(65) | 评论 (0)编辑 收藏

仅列出标题
共9页: 1 2 3 4 5 6 7 8 9 

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜