C++11 新特性

C++11是C++的一个重大更新,它引入了许多新特性,如静态断言、右尖括号智能推导、auto类型推断、初始化列表、lambda表达式、强类型枚举等。这些改进提升了代码的清晰度、效率和安全性,同时也为泛型编程提供了更多支持。例如,static_assert用于在编译时检查条件,auto简化了类型声明,for循环迭代器语法更加简洁,智能指针(unique_ptr, shared_ptr, weak_ptr)则解决了内存管理问题。

   在制定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禁止/必须 重写基类虚函数
decltypedecltype 在C++11标准制定时引入的,主要为泛型编程而设计,通过表达式推断出变量类型

               相比于C++98 更改扩改的项有:

C++11

更改或者扩展项

C++11C++98
__cpluspluc值为201103L
NDEBUG将这个值未定义,断言assert将不起作用
快速初始化在定义类时就可初始化成员在定义类时不可初始化成员
sizeofsizeof(Car::wheels) 编译通过sizeof(Car::wheels) 编译报错,可通过sizeof((Car*)0->wheels)解决
扩展friendclass 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 被废弃

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值