在制定C++98 时, C99 还没发布,因此关于C99 很多特性都没在C++98 中包含,在制定定C++11 时将很多C99 都包含进来了(C/C++ 几次大的进版:C99~C11,C++98~C++11) , 另外C11/C++11 是再差不多时间发布的,因此很多特性C11/C++11 都是相通的。
如下是在C++98 没有的:
| 相比于C++98, C++11 新增的项 | 作用 |
| 四个宏:__STDC_HOSTED__, __STDC__,__STDC_VERSION__,__STDC_ISO_10646__ | 作用分别为:是否为包含标准C库,编译器是否和C标准一致,C编译器版本,某个版本的ISO/IEC 10646标准 |
| __FUNC__ | 预定义标识符:打印函数名字 |
| _Pragma 操作符 | 比如#pragma once 保证头文件只加载一次 |
| __VA_ARGS__ | 变长参数宏 #define log(...) printf(__VA_ARGS__) |
| long long | 长整型不低于64 位 |
| static_assert(value,warning) 静态断言 | 当value 不等于0 ,编译报错,提示warning 字符信息 |
| noexcept | 如果有异常,直接通过std::terminate() 终止程序执行,而不是通过throw() 去捕获 |
| final/override | 禁止/必须 重写基类虚函数 |
| decltype | decltype 在C++11标准制定时引入的,主要为泛型编程而设计,通过表达式推断出变量类型 |
相比于C++98 更改扩改的项有:
|
C++11 更改或者扩展项 | C++11 | C++98 |
| __cpluspluc | 值为201103L | |
| NDEBUG | 将这个值未定义,断言assert将不起作用 | |
| 快速初始化 | 在定义类时就可初始化成员 | 在定义类时不可初始化成员 |
| sizeof | sizeof(Car::wheels) 编译通过 | sizeof(Car::wheels) 编译报错,可通过sizeof((Car*)0->wheels)解决 |
| 扩展friend | class A; class B{ friend A}; |
class A;class B(friend class A) 在C++98 中需要多加个class |
| 内部模板 | template <typename T>void TempFun<T a> 会根据实际调用,T 转变成对应的类型 | 默认参数,会报错 |
| 外部模板 | extern template void fun<int>(int) 在不同cpp 文件中定义, 只有实际占用内存只有一份 |
template void fun<int>(int) 在不同cpp 文件中定义,每次定义都会占用一份内存 |
| 继承构造函数:完成构造函数“传递” ,调用构造函数B ,同时调用构造函数A |
strcut A{ A(int i),A(int i,int cc)}; struct B:A{ using A:A;B(int i)}; |
strcut A{ A(int i),A(int i,int cc)}; struct B:A{ B(int i):A(i); B(int i):A(i,cc)}; |
| 初始化 |
int a(3+4); //圆括号初始化 int a{3+4}; //花括号初始化,可将等号省略 int *i = new int(1); //堆内存,new 初始化 |
int arr[5] = {0}; int arr[5] = {1,2,3,4}; |
| 别名 |
还可使用using 来设定类型别名 using uint = unsigned int; | typedef unsigned int uint; |
| 右尖括号> | >> 会智能推导 | > > 需加一个空格,否则会误判为右移 |
| auto |
auto name = "hello world\n", name 会自动推导出是一个char* 类型。 另外像python 变量是动态类型的, 拿来就用都不需要声明的,写成 name = "hello world\n",都行,会自动推导出name 是string 型的 | auto 具有自动存储空间的局部变量 |
| for 循环 |
int arr[5] = {1,2,3,4,5}; for( int &e:arr) action; |
int arr[5] = {1,2,3,45}; for(int *p = arr; p < arr + sizeof(arr)/sizeof(arr[0]);++p) action; |
| enum 强类类型 |
enum class Type{ General,Light,Medium,Heavy}; 强类型enum Type t = Type::Light; t = 2;//报错,强类型enum |
enum Type{ General,Light,Medium,Heavy}; 强类型enum Type t = Type::Light; t = 2;//允许,因为枚举会隐式转化为int 型 |
| 智能指针 | unique_ptr,shared_ptr,weak_ptr等智能指针来自动回收分配对象 | auto_ptr(); // 返回左值不能调用delete,在C++11 被废弃 |
C++11是C++的一个重大更新,它引入了许多新特性,如静态断言、右尖括号智能推导、auto类型推断、初始化列表、lambda表达式、强类型枚举等。这些改进提升了代码的清晰度、效率和安全性,同时也为泛型编程提供了更多支持。例如,static_assert用于在编译时检查条件,auto简化了类型声明,for循环迭代器语法更加简洁,智能指针(unique_ptr, shared_ptr, weak_ptr)则解决了内存管理问题。
6348

被折叠的 条评论
为什么被折叠?



