从C到C++

  • 命名空间

    1. 定义
      namespace example {
      ...
      }
    2. 使用
      使用using namespace + 命名空间;
      使用using 命名空间::变量名/函数名;
  • 基本输入输出
    C++使用steam进行输入输出
    cin、cout、cerr、clog
    注:

    cin不支持空格回车字符串的输入,请使用getchar()函数。

  • 内联函数
    C++内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。
    如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline,在调用函数之前需要对函数进行定义

    1. 在内联函数内不允许使用循环语句和开关语句,内联函数内部有循环和开关,也不会出错,但是编译器会把它当做非内联函数的。
    2. 内联函数的定义必须出现在内联函数第一次调用之前;
    3. 类结构中所在的类说明内部定义的函数是内联函数。
    4. 内联函数的声明是不需要加inline关键字的,内联函数的定义是必须加inline的

    注:

    1. 在类定义中的定义的函数都是内联函数,即使没有使用 inline 说明符。
    2. 对于内联函数,程序只是提供了一个“内联建议”,即建议编译器把函数用内联展开,但是真正是否内联,是由编译器决定的,对于函数体过大的函数,编译器一般不会内联,即使制定为内联函数
  • 函数重载

    在同一作用域内,同名函数的形式参数(参数的个数、类型或者顺序)不同,调用时编译器会通过参数进行比较,选择最合适的定义(称为重载决策)。

    注:函数的返回类型不能作为重载的依据。

    函数签名:函数的名称及其参数类型组合在一起,就定义了一个唯一的特性,称为函数签名(不包括返回类型)。

  • 缺省参数

    1. C++允许在定义函数时给其中的某个或某些形式参数指定默认值,这样,当发生函数调用时,如果省略了对应位置上的实参的值时,则在执行被调函数时,以该形参的默认值进行运算。

        float area(float r=6.6);
        area( );              //相当于area(6.6);
      
    2. 实参与形参的结合是从左至右顺序进行的。因此指定默认值的参数必须放在形参表列中的最右端,否则出错。

    3. 一个函数不能既作为重载函数,又作为有默认参数的函数,会出现二义性。

    4. 默认参数一般在函数声明中提供。如果程序中既有函数的声明又有函数的定义时,则定义函数时不允许再定义参数的默认值。

  • 副作用

    表达式有两种功能:每个表达式都产生一个值( value ),同时可能包含副作用( side effect ),副作用是指改变了某些变量的值。

  • 类型转换

    1. 隐式类型转换

    2. 显示类型转换

      • (type)var,这种C风格的强转不推荐使用。

      • explicit关键字

      • static_cast <new_type> (expression)

        static_cast强制转换只会在编译时检查,但没有运行时类型检查来保证转换的安全性。同时,static_cast也不能去掉expression的const、volitale、或者__unaligned属性。

      • dynamic_cast <new_type> (expression)

        new_type 必须是一个指针或引用或“指向 void 的指针”。 如果 new_type 是指针,则expression 的类型必须是指针,如果 type-id 是引用,则expression为左值。 如果转型失败会返回null(转型对象为指针时)或抛出异常(转型对象为引用时)。dynamic_cast 会动用运行时信息(RTTI)来进行类型安全检查,因此dynamic_cast 存在一定的效率损失。

      • const_cast <new_type> (expression)

        new_type 必须是一个指针、引用或者指向对象类型成员的指针。

        const_cast用于去除除对象的const或者volatile属性。

      • reinterpret_cast <new_type> (expression)

        new_type必须是一个指针、引用、算术类型、函数指针或者成员指针。其转换结果与编译平台息息相关,不具有可移植性,因此在一般的代码中不常见到它。reinterpret_cast 常用的一个用途是转换函数指针类型,即可以将一种类型的函数指针转换为另一种类型的函数指针,但这种转换可能会导致不正确的结果。

  • 整型提升Integral promotion

    1. 把小整数类型转换成较大的整型类型 bool、char、signed char、unsigned char、short和unsigned short等类型来说,只要它们所有可能的值都能存在int里,它们就会提升成int类型;否则,提升成unsigned int类型。
    2. 较大的char类型(wchar_t、char16_t、char32_t)提升成int、unsigned int、long、unsigned long、long long 和unsigned long long中最小的一种类习惯,前提是转换后的类型要能容纳原类型所有可能的值。

    如果某个运算符的运算对象类型不一致,这些运算对象将转换成同一类型。但如果某个运算对象的类型是无符号类型,那么转换的结果就要依赖于机器中各个类型的相对大小了。

    1. 情况1:整型提升,如果大家提升后的类型一致,则无需进一步转换,这种情况下其实要注意是否可能溢出;如果提升后的整型都是一致的符号,那么小类型的运算对象转换成较大的类型。
    2. 情况2:无符号和有符号类型运算,如果无符号类型大于或等于带符号类型,那么带符号的运算对象会转换成无符号的,这会带来很多副作用,例如比较两个整型,可能产生相反的结果。
    3. 情况3:如果有符号的类型大于无符号的类型,此时转换的结果依赖于机器:如果无符号类型的所有值可以被该有符号类型表示,那么无符号类型的运算对象转换成有符号类型,否则,有符号类型的运算对象转换成无符号类型。
  • 引用

    引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。

    int i
    int &r =i;
    
原文地址:https://www.cnblogs.com/hunter-w/p/13708071.html