C++/C小知识点(2)

负数的右移位操作

负数的>>操作,结果取决于语言的实现,左边空出的位置,可能填补0,也可能填补1。

 

静态局部对象

      内置类型的局部对象如果没显式初始化,则值就未初始化。静态局部对象、全局对象,包括内置类型和用户自定义类型,如果未提供初始化式,则编译器自动初始化为0。

 

拷贝构造函数

      A(A copy){…};是不允许的,如果允许,会造成无限的递归调用。正确的形参为const A& copy。复制操作符无此限制。

 

自定义String类的拷贝构造函数和赋值操作符的实现

      实现的是有应当考虑异常安全性。(高质量编程P241)

      赋值操作符实现须注意四个步骤:1、检查自我赋值。2、分配新的内存资源,并拷贝内容。3、释放原有的内存资源。4、返回本对象的引用。

      除了上面的方法外,还可以通过自定义一个swap函数、调用拷贝构造函数来实现。

 

默认形参值

      默认值应放在函数声明中,不可放在函数定义中。如果有多个默认形参,则只能从后往前一直默认。

 

容器元素类型

     凡是用作容器元素类型的class,都需要重载==、=、<等运算符。因为容器可能会使用它们来排序或者拷贝元素,某些泛型算法都是假设元素类型已经重载了=、<等。

 

不能重载的运算符

      有一些运算符是不允许重载的,一方面由于它们的右操作数是一个名字(比如成员名)而不是对象;另一方面是出于安全性的考虑,防止产生混乱和错误。不能重载的运算符有   1 . 2 .* 3 :: 4 ?: 5 sizeof typeid 6 四个类型转换操作符

 

重载后置++和--

      一元操作符一般重载为非静态成员函数。重载后置的递减、递增操作符,为了和前置的区别,需要在声明的时候,设置哑元。如Integer类中的后置++操作符重载:Integer operator++(int){…}。还需要注意的是,在进行++操作前,需要定义一个Integer temp = *this; 以便最后返回。

      当自增和自减操作符应用于基本数据类型时,前置版本和后置版本在效率上没有多大的差别。然而,当应用于用户定义类型,尤其是大对象的时候,前置版本就会比后置版本的效率高许多。因为后置版本要创建一个临时对象,并在返回后销毁,返回的时候还会调用拷贝构造函数。

 

inline函数

      较之宏定义,好处:1、可以在debug版本中调试(debug版本中其实没有进行内联)。2、编译器可以对内联函数根据上下文程序进行优化,而不可也对普通函数优化,因为一旦进入函数体它也就脱离了环境上下文。3、执行的时候可以进行类型检查。

      inline关键字必须与函数定义体放在一起才能使函数内联,放在声明处无效。inline只是对编译器的一个申请,是否真正inline取决于编译器。

      内联函数以代码膨胀为代价,换来函数调用参数压站、跳转、返回等开销。一般把代码较短,不含循环和复杂控制结构的函数声明为内联。构造函数和析构函数一般不可声明为内联,因为它们一般隐含很多函数调用。

 

C++中强制类型转换

      const_cast可用于去除一个对象的const/volatile属性。reinterpret_cast可用于将一个整形转换为一个指针,或者在两种具象形指针间转换。需要注意的是,void*转换为具象形指针需要使用static_cast。

 

数据萃取

class Point{
public:
  Point(float x);
  operator float() const    //数据萃取、向外转换
  {
    return m_x;
  }
private:
  float m_x;
}

      非explicit构造函数可以把其他类型对象隐式转换为this对象,即向内转换。C++还提供了相反的方向转换方法,叫做自定义类型转换运算符,它可以把this对象转换为其他的数据类型对象。

      类型转换运算符定义以operator关键字开始,紧接着目标类型名和()。它没有参数,实际上this就是参数;也没有返回类型,实际上函数名就是返回类型。它只能定义为非静态成员函数。

      定义类型转换运算符的好处在于,该类型的对象可以直接用在需要目标类型的地方,编译器自动调用转换函数完成转换:

   1: Point p2(100.25);
   2: Integer aInt(100);
   3: cout << p2 << endl;      //100.25
   4: cout << aInt << endl;    //100

      这样我们就不需要为Point和Integer重载<<运算符了。

posted on 2010-04-25 18:57  ︶ㄣ第二名  阅读(411)  评论(0编辑  收藏  举报