作者: Bjarne Stroustrup
版本 | 发布时间 | 主要特性 |
---|---|---|
C with Classes | 1979 | 引入面向对象基本特性,包括 Class、构造函数、析构函数等 |
C++ | 1983 | 函数重载、运算符重载、多态、模板、命名空间 |
C++98 | 1998 | 标准化阶段开始,引入 STL |
C++03 | 2003 | 修复 C++98 的缺陷 |
C++11 | 2011 | 现代C++阶段开始,引入自动类型推导、Lambda 表达式、右值引用、智能指针等 |
C++14 | 2014 | 泛型 Lambda 表达式、返回类型推导、二进制字面量等 |
C++17 | 2017 | 结构化绑定、std::optional、并行算法等 |
C++20 | 2020 | 概念、范围库、协程、std::format 等 |
C++23 | 2023 | 模块化标准库、std::expected、std::mdspan 等 |
C with classes
泛型
其他语法特性
C 代码:C 允许省略函数原型中的参数类型。
C++ 代码:C++ 要求函数必须有完整的原型声明。
C++11 不是 C 的严格超集:尽管 C++11 兼容大多数 C 代码,但由于语法、关键字和类型系统的差异,并非所有 C 代码都能直接在 C++11 中编译。
// 在 C 语言中
void foo(); // 表示:"foo 是一个函数,可以接受任意数量和类型的参数"
// 在C++中
void foo(); // 表示:"foo 是一个函数,不接受任何参数"
void foo(void);// 表示:"foo 是一个函数,不接受任何参数"
//如果 C 代码中省略了参数类型,C++ 编译器会报错:
void foo(); // C 代码
foo(10); // C 中合法,C++ 中报错
C 代码:C 允许隐式类型转换(如 void* 到其他指针类型)。
C++ 代码:C++ 要求显式类型转换。
// C 代码
void* ptr = malloc(10); // 不需要显式类型转换
// C++ 代码
void* ptr = malloc(10); // 需要显式类型转换
如果 C 代码中没有显式类型转换,C++ 编译器会报错:
// C 中合法,C++ 中报错
int* ptr = malloc(10);
C 代码:C 中没有 C++ 的关键字(如 class、new、delete 等)。
C++ 代码:C++ 引入了新的关键字,这些关键字在 C 中可能被用作标识符。
示例:
c
复制
// C 代码
int class = 10; // class 是合法的标识符
// C++ 代码
int class = 10; // 错误:class 是关键字
如果 C 代码中使用了 C++ 的关键字作为标识符,C++ 编译器会报错:
int new = 10; // C 中合法,C++ 中报错
C 代码:C 需要包含 <stdbool.h> 才能使用 bool 类型。
C++ 代码:C++ 有内置的 bool 类型。
// C 代码
#include <stdbool.h>
bool flag = true;
// C++ 代码
bool flag = true; // 不需要额外头文件
C 代码:C 中的枚举类型可以隐式转换为整数。
C++ 代码:C++ 中的枚举类型是强类型的,不能隐式转换为整数。
enum Color { RED, GREEN, BLUE };
int x = RED; // C 中合法,C++ 中报错
C 代码:C 不支持函数重载。
C++ 代码:C++ 支持函数重载。
void print(int x) {}
void print(double x) {} // C 中报错,C++ 中合法
C 代码:C 中声明结构体变量时需要 struct 关键字。
C++ 代码:C++ 中可以直接使用结构体名称。
// C 代码
struct Point { int x, y; };
struct Point p1; // 需要 struct 关键字
// C++ 代码
struct Point { int x, y; };
Point p1; // 不需要 struct 关键字
C 代码:C 中的字符串字面量是 char* 类型。
C++ 代码:C++ 中的字符串字面量是 const char* 类型。
// C 代码
char* str = "Hello"; // 合法
// C++ 代码
const char* str = "Hello"; // 合法
char* str = "Hello"; // 错误:不能将 const char* 赋值给 char*
C 代码:C 允许隐式函数声明(即未声明直接使用函数)。
C++ 代码:C++ 要求函数必须先声明后使用。
int main() {
foo(); // C 中合法,C++ 中报错
return 0;
}
void foo() {
printf("Hello\n");
}
可以使用.hpp和.cpp, .cc, .cxx作为头文件和源文件后缀
支持#pragma once宏防止头文件被重复包含
对于标准库,可以使用#include <iostream> 这种不带.h的方式
对于C的标准库,可以使用#include <cstdio> // C++ 的 stdio.
存在命名空间,例如using namespace xxx
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。