设计准则:绝对不要解引用一个无效的 iterator。
摘要:
- 有效的数值:iterator 指向的位置有效。
- 有效的寿命:iterator 使用时仍然有效。
- 有效的范围:一对 iterators 组成一个有效的范围,first 在 last 之前(或相等),并且两者指向同一个container。
- 防止不合法的操作行为,如修改内置类型的暂时对象。
文章来源:
http://my.donews.com/robinchow/2007/01/10/rwyjwpstnlvfjtxeqzrupbzdkijaqyohunrq/
今天在论坛上看到这样一段话,感触颇深:
在我的早期职业生涯中,也曾是个VC程序员,也曾以为驾驭了VC就是驾驭了自己的技术生涯。但渐渐地,我发现无论我潜心研究多深,付出多少精力,在大多数
问题上,我无法给自己满意的答案。似乎自己在金字塔大大小小、宽宽窄窄的隧道里踯躅前行,但每走了一大段路后,你总能碰到一扇门,一扇单靠自己很难逾越的
门。后来发现,很多VC程序员也有同感:在做过若干年后,总会感觉面前立起一个槛,没办法逾越。这不是平台期之类的阶段,平台期之后通常会有一个大的提升
阶段,但在那扇门前,很少有人窥得到门后的景观。没错,很多人成熟起来后明白了这扇门来自何方,为甚所立,所挡为何,这扇门就是:Microsoft。
作为一个盈利组织,微软设立层层技术壁垒,使自己的产品立于不败之地,争取盈利最大化,为大大小小的投资人负责,这无可厚非。但作为一个靠技术生存的人,
除非你进入微软视窗系统开发部门,否则很难打开那扇门。所以,大部分的VC程序员,无论付出多少,最终沦为平庸,也就不奇怪了:你只能知道这些,这是游戏
规则的一条,只是你自己没仔细看清楚而已。
像大多数理想主义者在发现自己最终是在为最不理想主义的手牵着鼻子走之后,很多VC程序员开始沦为最现实的技术人员,自甘平庸,宁愿囚在windows囚
室中,但只要拥有一份过得去的薪水,一个技术高手的光环,就像《matrix》里描述的一类人,宁愿生活在虚幻中,但只要过得体面,那也成。在这间囚室
中,我发现自己只是在复制别人的工作,甚至都无法理解别人是怎么做的。我根本不会设计软件!
但也有一部分更为坚定的理想主义者,不但没有沦丧,反而升华,研究VC,只是他们追求乌托邦理想链条中的一环而已,在进行充分研究后,他们继续前行,只是
少了更多的羁伴。他们中的很多人甚至放弃了windows平台,开始宽泛地、深入地理解计算机科学的精髓及其外围。既然要透彻地领悟一样知识,那就不该有
不可逾越的门。自然而然地,这些真正的理想主义者开始投入开放源代码世界。在这个世界里,只要你愿意,你可以打开任何一扇门,贪婪地汲取任何你需要的养
料,你所需要接受的游戏规格却非常简单:与别人无偿地分享你的知识,并把这个游戏规则教给别人。在这个开放的世界里,不再有壁垒,你会明确地知道自己在干
什么,只要你愿意。因而,你也能够做出一些真正original的工作。这不正是在那个午后,填报志愿时,我们曾立志奉献一生的理想吗?
最后,送出一句忠告:不要固步自封,尽量放open;如果做不到的话,那就尽量承认自己尽管不过20岁,却已经老去了罢。
文章来源:
http://my.donews.com/robinchow/2007/01/11/pjhceeuybqztyteeaggsrqunorchjhyzqgcv/
如果对||予以正确恰当的重载,那么在 if 语句中,||或许是一个函数调用。如果 其是一个函数调用,那么“短路求值规则”会被抑住,这样 if 语句中的所有条件将总是被求值。
例如:
if(e.Title() == "CEO" || e.Salary() > 10000) cout << "hello" << endl;
如果对==、||和>进行适当重载,则两个表达式都将被求值。
文章来源:
http://my.donews.com/robinchow/2007/01/10/wtFbMixKLhXCHOcnoKJheNEPFczsPCQmVvoI/
C++ 中 bool 是一个基本类型,可以通过各种方法来模拟它,但是都存在不同的缺陷:
- 使用 typedef 模拟,bool 不允许重载。
- 使用 #define,bool 不允许重载且通常破坏了 #define。
- enum bool允许重载但在条件表达式中不能进行自动类型转换。bool b = (i == j)是错误的,因为 int 不能隐含地转换成 enums。
- bool 类允许重载但不能让 bool 对象在条件中作测试,除非它能提供自动转换到基本类型,但是提供自动转换却通常会干扰函数重载解析过程。
文章来源:
http://my.donews.com/robinchow/2007/01/15/bszvusphgepqbphvticopjkpfadfapccibyd/
- 建议总是使用“SomeType t(u)”的形式,一来是因为只要可以用“SomeType t = u”的地方也同样可以用它;二来是因为它还有一些其它的有点,比如支持多个参数等。
- 关于 const:
- 如果函数的返回类型不是一个内建(built-in)的类型的话,通常应该将其返回类型也声明为 const。这样可以避免该函数的调用者企图修改临时对象。
- 对于传引用作为实参,可以将其声明为 const 以防止对其进行修改;如果使用传值,则没有必要声明为 const。
- 如果一个函数从逻辑上来说是 const 的,则应该将其声明为 const 函数,即使该函数实际修改了对象的状态,这时候必须将要修改的值声明为 mutable。
- 关于类型转换:
- dynamic_cast:对公有继承的基类和派生类进行转换,转换失败时返回 NULL。
- reinterpret_cast:对于互不相同、区别开来的类型(例如函数指针),尽管它们之间存在着隐式转换,它们也是互无联系的,应该用 reinterpret_cast 进行转换。
文章来源:
http://my.donews.com/robinchow/2007/01/15/HxCWeJTzfsIHxGSohwbqozDYDPwcLcYtAApF/
- 如果需要的话,请编写一个私有函数来使拷贝操作和拷贝赋值共享代码;千万不要利用“使用显式的析构函数并且后面跟一个 placement new”的方法来达到“以拷贝构造操作实现拷贝赋值操作”这样的目的。也就是说,决不要编写如下的代码:
T& T::operator=(const T &other)
{
if(this != &other)
{
this->~T(); // 有害!
new (this) T(other); // 有害!
}
return *this;
}
- 关于拷贝赋值操作符有两点需要注意:
- 将拷贝赋值操作声明为“T& T::operator=(const T&)”
- 不要返回 const T&,尽管这样做避免了诸如“(a = b) = c”的用法;这样做意味着:你无法出于移植性的考虑而将 T 对象放入标准程序库之容器 -- 因为其需要赋值操作返回一个单纯的 T&。
文章来源:
http://my.donews.com/robinchow/2007/01/14/uufhhtovwfvygicxibjufbugcnhamivhcapk/
使用 auto_ptr(灵巧指针)的注意事项:
- 对于 auto_ptr,拷贝不是对等的。右侧的对象不再拥有对象的所有权。
- 不再拥有所有权的 auto_ptr 的指针会被置为 NULL,因而对它的解引用会导致错误。
- 使用 const auto_ptr 可以防止将该灵巧指针赋值给其他灵巧指针。
文章来源:
http://my.donews.com/robinchow/2007/01/14/xzuxgvbkpleammqcmlzlsjhkcqmgfdpddjaj/