• 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重载<<运算符了。

  • 相关阅读:
    程序员职业规划
    SSH框架优缺点
    Servlet的生命周期,并说出Servlet和CGI的区别,Servlet与JSP的区别
    什么是J2EE,包括哪些规范!
    JS中定义类的方法
    audio.js – 随时随地,播放 HTML5 的声音
    jquery面试题里 缓存问题如何解决?
    产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
    JAVA排序算法
    java面试题中常见的关于String类问题总结
  • 原文地址:https://www.cnblogs.com/younes/p/1720646.html
Copyright © 2020-2023  润新知