C++新旧语法对比
C++ 语法新旧完整对比
说明
- 旧 C++ / C 风格:C++98 / 传统 C 写法,偏底层、繁琐
- 新 C++:C++11 及以后,更简洁、安全、现代
整体对比表格
| 对比项目 | 旧语法(C 风格 / C++98) | 新语法(C++11 及现代 C++) |
|---|---|---|
| 头文件 | #include <stdio.h>#include <stdlib.h> | #include |
| 空指针 | NULL(易类型错误) | nullptr(类型安全) |
| 变量初始化 | int a = 10;int arr[] = {1,2}; | int a{10};auto a = 10; |
| 遍历循环 | for(int i=0;i<n;i++)迭代器写法冗长 | for(int x : arr)for(auto& x : v) |
| 类型推导 | 必须手写完整类型 | auto 自动推导 |
| 动态内存 | malloc / free需强转、易忘释放 | new / delete智能指针 unique_ptr |
| 函数传参 | 指针传参:void f (int *a) | 引用更简洁:void f (int &a) |
| 函数特性 | 无默认参数、无匿名函数 | 默认参数、Lambda 表达式 |
| 字符串 | char s[]、strlen/strcmp | string s、直接 s.size ()、== 比较 |
| 输入输出 | scanf/printf(需格式符) | cin/cout(自动识别类型) |
| 常量 | #define 宏定义 | const /constexpr 编译期常量 |
| 结构体 | typedef struct、malloc | 直接 struct、new 创建 |
| 取整 / 数学 | 需自己实现 | floor/ceil/round/pow/sqrt |
| 代码风格 | 繁琐、易错、指针多 | 简洁、安全、可读性强 |
1. 变量定义与初始化
旧语法
- 变量尽量在函数开头定义
- 只能用
=初始化
int a = 10;
int arr[3] = {1,2,3};
新语法
- 随处定义
- 列表初始化
{}(统一、安全)
int a{10};
int arr[]{1,2,3};
auto b = 20; // 自动推导类型
2. 空指针
旧语法
NULL本质是整数 0,易产生歧义
int* p = NULL;
新语法
nullptr专用空指针,类型安全
int* p = nullptr;
3. 动态内存
旧语法(C 风格)
int* p = (int*)malloc(sizeof(int)*10);
free(p);
新语法(C++ 风格)
int* p = new int[10];
delete[] p;
更现代:智能指针
unique_ptr<int[]> p = make_unique<int[]>(10);
// 无需手动 delete
4. 循环遍历
旧语法:下标 / 迭代器
// 数组
for(int i=0; i<5; i++) cout << a[i];
// vector
vector<int>::iterator it;
for(it=v.begin(); it!=v.end(); it++) cout<<*it;
新语法:范围 for
for(int x : a) cout << x;
for(auto& x : v) cout << x;
5. 类型推导
旧语法
必须手写完整类型,非常冗长
vector<int> v;
vector<int>::iterator it = v.begin();
新语法:auto
auto it = v.begin();
auto x = 123;
auto f = 3.14;
6. 函数语法
旧语法
int add(int a, int b) {
return a + b;
}
新语法
- 默认参数
- 尾置返回类型
constexpr编译期计算
int add(int a, int b=0) { ... }
auto add(int a, int b) -> int { ... }
constexpr int square(int x) { return x*x; }
7. 引用 & 指针
旧 C:只用指针
void swap(int* a, int* b) {
int t = *a; *a = *b; *b = t;
}
新 C++:引用更简洁
void swap(int& a, int& b) {
int t = a; a = b; b = t;
}
8. 结构体 & 类
旧 C 风格
typedef struct Node {
int data;
struct Node* next;
} Node;
Node* p = (Node*)malloc(sizeof(Node));
新 C++ 风格
struct Node {
int data;
Node* next;
};
Node* p = new Node;
9. 输入输出
旧 C
int a;
scanf("%d", &a);
printf("%d", a);
新 C++
int a;
cin >> a;
cout << a;
10. 枚举类型
旧语法
enum Color { RED, GREEN, BLUE };
新语法:强类型枚举
enum class Color { RED, GREEN, BLUE };
11. 常量定义
旧
#define N 100
const int a = 10;
新
const int a = 10;
constexpr int b = 20; // 编译期常量
12. 初始化列表(构造函数)
旧
class A {
int x,y;
public:
A(int a,int b) { x=a; y=b; }
};
新
class A {
int x,y;
public:
A(int a,int b) : x(a), y(b) {}
};
13. Lambda 匿名函数(新特性)
旧:必须写单独函数
bool cmp(int a,int b) { return a<b; }
sort(v.begin(),v.end(),cmp);
新:直接写 lambda
sort(v.begin(),v.end(), [](sslocal://flow/file_open?url=int+a%2Cint+b&flow_extra=eyJsaW5rX3R5cGUiOiJjb2RlX2ludGVycHJldGVyIn0=) {
return a < b;
});
14. 字符串
旧 C
char s[] = "hello";
strlen(s);
strcmp(s1, s2);
新 C++ string
string s = "hello";
s.size();
s1 == s2;
15. 逻辑表达式
旧
if(a>0 && a<10)
新
写法一样,但配合 auto、const 更安全
整体对比总结
| 项目 | 旧语法(C/传统C++) | 新语法(C++11及以后) |
|---|---|---|
| 空指针 | NULL | nullptr |
| 遍历 | for(i=0;i<n;i++) | for(auto x:v) |
| 类型 | 必须手写 | auto 自动推导 |
| 内存 | malloc/free | new/delete、智能指针 |
| 函数 | 普通函数 | 默认参数、lambda、constexpr |
| 传参 | 指针 | 引用 & |
| 安全 | 易出错 | 类型安全、边界更友好 |
| 代码量 | 长 | 简洁、易读 |
内容由豆包AI生成

浙公网安备 33010602011771号