Robin Chow's C++ Blog

 

[导入]More Exceptional C++ 之 1

编码原则:
  1. 更注重可读性,避免写简洁的代码(简洁但是难以读懂和维护)。
  2. 注重可扩展性和封装。
  3. 考虑解决一个问题时是否需要使得解决方案具有扩展,还是仅仅解决当前的问题。注意二者之间的平衡。

文章来源:http://my.donews.com/robinchow/2007/01/17/exiydzbwcigvtcumybdrwjyrgeojvifzfoyj/

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

[导入]More Exceptional C++ 之 2

范型算法 remove():
remove() 没有真正从容器中删除元素,容器的元素个数也不会改变。remove() 所做的是把未被删除的元素往前移动,以填充被删除元素留下的空位,而把被删除元素移到容器后面。最后,remove() 返回一个指向第一个被删除元素的 iterator,如果没有元素被删除,则返回 end() iterator。
remove() 如此工作的原因是它不是作用在容器上,而是作用在 iterator上,但是 iterator 并没有像“删除 iterator 指向的元素而不管是什么容器”的操作。要删除元素必须要用到直接作用在容器上的操作,如 erase()。
文章来源:http://my.donews.com/robinchow/2007/01/17/sowxiqnuyycsamoatekjugwfqwlehlxzztxi/

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

[导入]C++ GUI库大全


C++博客 - 暮暮息幕幕新 - [摘录]C++ GUI库大全
文章来源:http://my.donews.com/robinchow/2007/01/17/jmgltqvkdrrulheooyjlknnbayxdlijuupfo/

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

[导入]More Exceptional C++ 之 3

predicate(断言)是指给出 yes/no 的函数或者函数对象。使用函数对象的好处是可以存储变量。
predicate 通常被算法用来作用于一个元素并且给出一个判定,比如是否大于某个数。
有状态的 predicate 是指状态在运行时可能改变的 predicate。对于有状态的 predicate 来说,各个副本之间不是等价的。对于算法来说,要使用 有状态的 predicate 需要满足两个条件:
  1. 算法必须保证不产生 predicate 的副本。
  2. 算法必须对元素以确定的顺序来应用 predicate(例如,first 到 last)。
C++ 标准不要求标准算法满足以上两个条件,因此建议不要使用带状态的 predicate。

文章来源:http://my.donews.com/robinchow/2007/01/17/okqqyqklkznuiqhlavokqgztcltuwiqlsgcq/

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

[导入]More Exceptional C++ 之 4

typename 常常在模板类的声明或定义中用来声明一个类型。在模板中,如果一个和模板参数相关的名字没有在名字解析中被找到,或者被关键字 typename 修饰,则它不能作为一个类型。考虑下面的代码:
template< typename T >
class X_base
{
public:
typedef T instantiated_type;
};

template< typename A, typename B >
class X : public X_base< B >
{
public:
bool operator()( const instantiated_type& i ) const
{
return i != instantiated_type();
}
// ... more stuff ...
};

instantiated_type 和模板参数类型相关,使用名称解析不能找到并且没有被关键字 typename 修饰,因此将导致编译错误,正确的方法是使用关键字 typename。
文章来源:http://my.donews.com/robinchow/2007/01/18/gywtqxaalrvetoldhdtlmchhlsmnfxklwgem/

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

[导入]More Exceptional C++ 之 5

小结:
  • 将 vector 和 C 风格的数组混用是安全的。可以采用如下方法引用 vector 内的元素: &c[0]。
  • 优先使用 vector 而不是 deque。如果需要一些特殊操作,比如在数组两头插入和删除,或者不需要连续的存储空间,则使用 deque。
  • 使用和临时对象交换的方法来压缩 vector 或者 deque 的空间。vector< Customer >(c).swap(c):将 c 的空闲空间释放;vector< Customer >().swap(c):将 c 的所有空间释放。
  • 如上一条款所提到:除非确实需要进行空间优化,否则总是使用 deque< bool > 而不是 vector< bool >。

文章来源:http://my.donews.com/robinchow/2007/01/23/xflxtusuynvqylhgqboduxqzfjholpejuphn/

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

[导入]More Exceptional C++ 之 17(待翻译)

使用宏时须注意:
  1. 参数两边要加括号
  2. 整个表达式两边要加括号
  3. 特别注意表达式多次求值的情况,如 max(++i, j)
  4. 宏会搅乱名字空间
  5. 宏不能递归
  6. 宏没有地址
  7. 宏不利于调试
On a compliant compiler, it is not possible for a macro to create any of the following:
  • a trigraph (trigraphs are replaced in phase 1);

  • a universal character name (\uXXXX, replaced in phase 1);

  • an end-of-line line-splicing backslash (replaced in phase 2);

  • a comment (replaced in phase 3);

  • another macro or preprocessing directive (expanded and executed in phase 4); or

  • changes to a character literal (for example, 'x') or string literal (for example, "hello, world") via macro names inside the strings.


文章来源:http://my.donews.com/robinchow/2007/02/11/bavcdirqeacybkdedpxorhuddpwyehtghojl/

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

[导入]More Exceptional C++ 之 16

局部类型或匿名类不能用作模板参数。

C++ 不支持函数嵌套,但是我们可以通过函数对象来间接实现它。

#
数字符(或称‘字符串化’操作符)把扩展后的宏参数转化成字符串常量。 它仅与带参数的宏一起使用。 如果它在宏定义中定义在形参前面,那么由宏调用传递进来的实参是被引号括起来的,并且被当做一个字符串语意来对待。 这个字符串会替代每一个在宏定义中出现的‘字符串化’的操作符和形参。

符号传递操作符

双数字符(或称“符号传递”操作符),有时也被称为合并操作符,用在类似对象以及类似函数的宏中。 它允许分开的若干符号被合并成一个符号,因此它(##)不能作为宏定义中第一个或者最后一个出现的符号。

除了以下情况,尽量避免使用预处理宏:
  • #include 守卫
  • 增强可移植性或方便调试的条件编译(在 cpp 文件中,而不是在 .h 文件中)。
  • 使用 #pragmas 来禁止一些无意义的警告。#pragmas 通常应该放在 “移植性的条件编译” 守卫中以防止编译器不能识别该指令而发出警告。

文章来源:http://my.donews.com/robinchow/2007/02/11/wkibsjwatiheajluxlmvybkwnutbvifrtotm/

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

[导入]More Exceptional C++ 之 15

纯虚函数是具体派生类必须重载的虚函数。如果一个类有一个没有重载的纯虚函数,那么它是一个抽象类,不能创建该类型的对象。

定义纯虚函数体的原因有以下死点:
  1. 纯虚析构函数。通常情况下,析构函数要么是虚函数并且为公有,要么是非虚函数并且为 protected。如果没有提供函数定义,则不能实例化该基类的派生类。
  2. 强迫程序员认识到正在使用缺省行为。对于普通虚函数,如果派生类没有重载则默认使用基类的缺省行为。如果不想隐含地使用基类的行为,可以使基类的虚函数为纯虚函数,则派生类必须显式地使用基类的行为。
  3. 提供部分行为。
  4. 帮助编译器诊断错误。如果不小心调用了一个纯虚函数(通常是对构造函数或析构函数间接调用),编译器可能查不到问题所在,这是可以在纯虚构函数里面写一些使程序崩溃的代码,从而方便进行查错。

文章来源:http://my.donews.com/robinchow/2007/02/05/rhawrggrcrbpbeslbvcspydjubkcgkwxswuj/

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

[导入]More Exceptional C++ 之 14

关于多继承(MI):

避免从超过一个的非协议类进行多继承。协议类是指抽象基类,仅由纯虚函数组成,而没有数据。
实际使用多继承时不外乎一下三种情况:
  1. 将几个模块或者库结合起来。
  2. 协议类。这是多继承最好、最安全的用法。
  3. 易用性(多态)。
另外,记住有时候不是仅仅从两个不同的基类继承,而是以不同的理由各自进行继承。例如,可以对一个基类进行私有继承以访问基类的保护成员,同时对另一个基类进行公有继承以实现多态。

文章来源:http://my.donews.com/robinchow/2007/02/03/cbkweueolxssxwokmhjkcwizyhjjhdfkepgj/

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

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

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜