C++C 的超集和增强,校验更加严格
C 主要是面向过程,C++ 是面向对象,面向过程是函数驱动,面向对象是对象驱动

1 新增命名空间

  • {}作用域起了个名称,后面不用加分号;
  • 命名空间可以嵌套
namespace X
{
    namespace Y
    {
        
    }
}

2 新增引用类型

  • 引用在一定程度上可以替代指针,作用与常指针类似 int * const a
  • 引用没有定义,是一种关系声明,声明它和原有某一变量(实体)的关系,
    故而类型与原类型保持一致,且不分配内存,与被引用的变量有相同的地址
  • 声明时必须初始化,一经声明,不可变更
  • 可对引用再次引用,多次引用的结果是某一变量具有多个别名
  • & 符号在 = 号左边是引用,在 = 号右边为取地址

3 枚举检测增强

  • 不能将整型隐式转化为枚举

4 变量定义增强

  • C++ 变量不必都声明在函数顶部,可以随使用随定义

5 全局变量定义检测严格

  • C 全局变量重复定义,C++ 不可以,全局变量检测增强
// C 语言
int g_val;          // bss段
int g_val = 10;     // data段

6 函数形参个数和函数返回值检测增强

// C 语言
f()                     // 默认返回值 int
{
    return 10;
}
int g(int a)
{
    return 10;
}

// 调用
g(10, 20, 30, 40);      // 可编译通过,但是有警告

7 struct 结构体增强

  • 功能与类基本等同,只不过 class 默认是 private 权限,struct 默认是 public 权限
// C 语言声明结构体变量
struct Student s;
// C++ 语言声明结构体变量
Student s;

8 新增 bool 关键字,1 个字节

  • C 用 0 表示 false,非 0 表示 true
  • C++bool 为 1 个字节,但是只有 truefalse 两个值

9 三目运算符增强(语法糖)

  • C 中三目运算符不可以当左值
// C 语言
int a = 10, b = 20;
((a < b) ? a : b) = 50;     // 错误
*((a < b) ? &a : &b) = 50;  // 正确,a 此时是50
// C++ 三目运算左值
int a = 10, b = 20;
((a < b) ? a : b) = 50;     // 正确,a 此时是50(返回的是引用)

10 const 增强

  • C中的 const 变量可以通过指针的方式进行修改,是假常量
// C 语言
const int a = 10;
int *p = &a;
*p = 20;
printf("a = %d", a);
  • C++ 中的 const 变量放在了全局空间的符号表中,是不可更改的
// C++ 语言
const int a = 10;           // 常量区符号表中(key value 键值对),编译过程中进行替换
                            // #define 是在预处理阶段展开,不受作用域限制
int *p = &a;                // 在栈中开辟了一个临时变量空间
*p = 20;
cout << "a = " << a << endl;    // a = 10
cout << "*p = " << *p << endl;  // *p = 20