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 个字节,但是只有true
和false
两个值
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