1、新标准的诞生
C++11 是 C++ 的第二个主要版本(前一个是 C++98 而后一个是 C++17 ),并且是从 C++98 起的最重要更新。它引入了大量更改,标准化了既有实践,并改进了对 C++ 程序员可用的抽象。
在它最终由 ISO 在 2011 年 8 月 12 日承认前,人们曾使用名称 ‘C++0x’ ,因为它曾被期待在 2010 年之前发布。 C++03 与 C++11 期间花了 8 年时间,故而这是迄今为止最长的版本间隔。从那时起, C++ 规则地每 3 年更新一次。
C++11相对于C++98/03有哪些显著的增强呢?事实上,这包括一下几点:
- 通过内存模型、线程、原子操作等来支持本地并行编程(Native Concurrency);
- 通过统一初始化表达式、auto、decltype、移动语义等来统一对泛型编程的支持;
- 通过constexpr、POD(概念)等更好地支持系统编程;
- 通过内联命名空间、继承构造函数和右值引用等,以更好地支持库的构建。
C++11主要的新语言特性:
2、保持稳定性和兼容性
2.1 保持与C99兼容
2.1.1 预定义宏
2.1.2 __func__预定义标识符
在C++11中,允许其使用在类或结构体中。
2.1.3 _Pragma操作符
#pragma once
_Pragma("once") // 等价
2.1.4 变长参数的宏定义以及__VA_ARGS__
2.1.5 宽窄字符串的连接
2.2 long long整型
/**
* @file 2.2.cpp
* @brief
* @author YongDu
* @date 2021-07-17
*/
#include <climits>
#include <iostream>
int main() {
long long ll_min = LLONG_MIN;
long long ll_max = LLONG_MAX;
unsigned long long ull_max = ULLONG_MAX;
std::cout << "min of long long: " << ll_min << std::endl;
std::cout << "max of long long: " << ll_max << std::endl;
std::cout << "max of unsigned long long: " << ull_max << std::endl;
return 0;
}
// min of long long: -9223372036854775808
// max of long long: 9223372036854775807
// max of unsigned long long: 18446744073709551615
2.3 扩展的整型
C/C++是一种弱类型语言,当运算、传参等类型不匹配的时候,整型间会发生隐式转换,即整型提升。
2.4 宏__cplusplus
std::cout << __cplusplus << std::endl;
2.5 静态断言
断言assert宏只有在程序运行时才能起作用,而#error只在编译器预处理时才能起作用。
static_assert是编译时期的断言,其使用范围不像assert受限制,在通常情况下,static_assert可以用于任何名字空间。必须注意的是,static_assert的断言表达式必须是编译时期可以计算的表达式,即必须是常量表达式。如果使用变量,则会导致错误。
2.6 noexcept修饰符和noexcept操作符
断言适用于排除逻辑上不可能存在的状态,异常通常用于逻辑上可能发生的错误。
C++11标准中让类的析构函数默认是noexcept(true)的。
2.7 快速初始化成员变量
2.8 非静态成员的sizeof
在C++11中,对非静态成员变量使用sizeof操作是合法的,而在C++98中,只有静态成员,或者对象的实例才能对其成员进行sizeof操作。
2.9 扩展的friend语法
在C++11中,声明一个类为另外一个类的友元时,不再需要使用class关键字。因此可以为类模板声明友元类了。
class Poly;
typedef Poly P;
class LiLei {
friend class Poly; // C++98通过,C++11通过
};
class Jim {
friend Poly; // C++98失败,C++11通过
};
class HanMeiMei {
friend P; // C++98失败,C++11通过
};
class P;
template <typename T>
class People {
friend T;
};
People<P> PP; // P为People的友元
People<int> Pi; // 对于int类型模板参数,有元声明被忽略
2.10 final/override控制
final关键字:使派生类不可覆盖它所修饰的虚函数
struct Object {
virtual void fun() = 0;
};
struct Base : public Object {
void fun() final;
};
struct Derive : public Base {
void fun(); // 无法通过编译
};
虚函数描述符override:如果派生类在虚函数声明时使用了override描述符,那么该函数必须重载其基类中的同名函数,否则代码无法通过编译。