03 2014 档案

摘要:Item 6:区别Increment和Decrement操作符的前置(prefix)和后置(postfix)形式 前置和后置的区别主要在于函数参数不一样,后置形式中多了一个int型的参数,在后置形式被调用时,编译器会自动给该int型参数传0值。其次在于前置和后置形式所返回的类型不同,前置返回一个引用,后置返回一个const对象。 下面主要讲解increment的前置和后置形式,decrement类似。 //前置式:累加后取出(increment and fetch) UPInt&UPInt::operator++() // 1 { (*this)+=1; ret... 阅读全文
posted @ 2014-03-14 10:16 勇者行天下 阅读(694) 评论(2) 推荐(1)
摘要:Item 5: 对定制的“类型转换函数”保持警觉 C++从C语言那继承了其隐式转换,可以实现不同类型之间的转换,且C++的隐式转换还存在更令人害怕的转型,有可能出现数据丢失。对于这些,你无能为力,因为这都是语言自身提供的。然而当你的自定义类型登场时,你可以通过提供某些函数,来作为编译器的转型之用。但是为什么最好不要提供任何类型转换函数呢? 原因在于:在你为打算也为预期的情况下,此类函数可能会被调用,而其结果可能不正确、不直观,很难调试。 在C++中,编译器会通过两种方式来实现类型的隐式转换: 1、使用隐式类型转换符,即关键词operator之后加上一个类型名称,如operator ... 阅读全文
posted @ 2014-03-13 16:09 勇者行天下 阅读(754) 评论(0) 推荐(2)
摘要:Item 4:非必要不提供Default Constructor 所谓default constructor就是不需要提供任何自变量就可以被调用的构造函数,即它能在没有任何外来信息的情况下将对象初始化。 如果class constructor不能确保object的所有data member都能被正确的初始化,那么最好不要定义default constructor;虽然这样做会对class的使用方式带来一些限制,但同时也带来了一个保证:当你真的使用这样的class时,你可以预期该constructor产生的对象都是被完整初始化的。 那么什么时候应该提供default constructor... 阅读全文
posted @ 2014-03-09 22:53 勇者行天下 阅读(751) 评论(0) 推荐(1)
摘要:Item 3:绝对不要以多态方式处理数组 当用一个base class 的指针或者引用来处理derived class objects时,我们就认为这样的指针或者引用具有多态性。 多态性是C++的特性之一,应该是方便程序员的,但是如果使用不当,也会给程序员带来许多苦恼。 在C++中,允许使用base class的指针或者引用来操作derived class 的对象数组,这样的操作,会给你带来意想不到的麻烦。 这是为什么呢? 原因就在于:指针大小的算术运算。 下面我们举例说明:当我们输出derived class 对象的数组元素时,会用到vd[i]进行操作,但是其实这是一个“指针算术... 阅读全文
posted @ 2014-03-08 23:10 勇者行天下 阅读(271) 评论(0) 推荐(0)
摘要:Item 2:最好使用C++提供的转型操作符对于很多从C转行从事C++的开发人员来说,都习惯使用C语言提供的强制类型转换,即使用“(类型)”这种方式,但是这种方式在C++中却是非常不好的习惯: 原因一:不管是开发人员还是开发工具,都不能很好的察觉该转型符; 原因二:不安全,C风格的转型符可以实现任何类型之间的转换,且其不能提示是否转型成功; 原因三:C++中,为了弥补这些缺陷,设计了新的转型符,安全性更高,且更容易被开发工具察觉。第一个类型:static_cast转型符 用法:static_cast(表达式); 说明:其基本拥有了与C旧式转型相同的威力和意义,以及相同的限制,但是它不... 阅读全文
posted @ 2014-03-07 22:26 勇者行天下 阅读(284) 评论(0) 推荐(0)
摘要:Item 1:仔细区别pointer和reference对于很多C++初学者来说,pointer和reference的区别,以及什么情况下该使用reference,什么情况下要使用pointer,都是一个很容易混淆的问题。对于这个问题,大家只要明白一点,就能很容易把握这个度:没有所谓的Null reference,一个reference必须总代表一个对象。因此,给出以下明确的建议: 1、当定义的变量需要改变以指向其他对象,或者它可以不指向任何对象时,应该使用pointer; 2、如果这个变量总要指向一个对象,那么它应该定义为reference; 3、在某些operator重载中,返回值用... 阅读全文
posted @ 2014-03-06 21:36 勇者行天下 阅读(711) 评论(0) 推荐(0)