C++新旧语法对比

C++ 语法新旧完整对比

说明

  • 旧 C++ / C 风格:C++98 / 传统 C 写法,偏底层、繁琐
  • 新 C++:C++11 及以后,更简洁、安全、现代

整体对比表格

对比项目 旧语法(C 风格 / C++98) 新语法(C++11 及现代 C++)
头文件 #include <stdio.h>#include <stdlib.h> #include #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生成

posted @ 2026-04-08 18:53  道长不姓王  阅读(57)  评论(0)    收藏  举报