C++新特性汇总

C++ 11

使用{}做变量初始化

传统编码方式中,可以使用“=”进行变量初始化,这个大家都知道,而C++ 11中引入了使用{}进行初始化的功能,样例如下:

int abc {5}
int bc = {5}
for (int i {0}; i<100; i++){...}

这样做的好处是,如果使用int a=3.5f进行变量赋值,那么会对变量进行截断,a的值为3;而使用int a{3.5f}则会直接编译不通过, 直接语法报错,这样做的好处是不会使得数据被误截断,进一步提高代码的健壮性

auto关键字:自动类型推断

auto主要用于变量的自动类型推断,使用过python的都知道,python变量并不需要显式指定对象类型,而c++中使用auto关键字可以根据变量赋初值的时候的类型自动选择匹配的类型,auto的自动类型推断发生在编译期,不会导致运行效率的降低。

constexp关键字:运行时求值

在C++ 11中引入的概念,用于定义一个常量,但是和const的区别在于会在编译时求值,所以能够提升运行时性能。编译的时候就进行求值可以带来其他好处,比如更利于做一些系统优化工作。

constexpr int var1 = 1;
constexpr ubt var2 = 11 * func(12);

上述代码中的func()函数,由于const是编译时求值的,所以在constexpr中调用的函数也需要是常量函数,也就是函数定义前带constexpr

constexpr int func(int a){
	return a*2;
}

范围for语句

在C++ 11中进一步扩展了for语句的功能性,类似于Java中的foreach和python中的遍历元素功能

int v[] = {12. 23. 34, 45, 56, 67, 78, 89};

for (auto x: v){
	cout<<x<<endl;
}

空指针nullptr

用于优化空指针的定义

智能指针

智能指针本质是一个封装了一个原始C++指针的类模板,为了确保动态内存的安全性而产生的。实现原理是通过一个对象存储需要被自动释放的资源,然后依靠对象的析构函数来释放资源。

https://blog.csdn.net/weixin_45434953/article/details/140962499

匿名函数

Lambda表达式是C++11中最重要的新特性之一,而Lambda表达式,实际上就是提供了一个类似于匿名函数(匿名函数实际上就是一个没有名字的函数)的特性,在多线程,并发中具有及其重要的作用。

在我们使用某个函数时,可能这个函数我们只需要调用一次,只在当前的情况下会使用这个函数,在其他地方不会在复用了。这时候我们要是在专门写一个函数就不太划算,但是要是不写这个函数呢,我们的代码就会显得很紊乱,故为了针对这种情况我们就有了匿名函数。

优点:使用匿名函数,可以免去函数的声明和定义。这样匿名函数仅在调用函数的时候才会创建函数对象,而调用结束后立即释放,所以匿名函数比非匿名函数更节省空间。

https://blog.csdn.net/mayue_web/article/details/87916209

右值引用

左值引用却没有彻底的解决问题:函数传返回值时,如果返回值是出了作用域销毁的(出了作用域不存在的),那还需要多次的拷贝构造,导致消耗较大,效率较低

右值引用是为一个临时变量取别名,它只能绑定到一个临时变量或表达式(将亡值)上。实际开发中我们可能需要对右值进行修改(实现移动语义时就需要)而右值引用可以对右值进行修改。

详细看下面的文章吧,解释起来太多东西了- -

https://blog.csdn.net/weixin_55582891/article/details/134980889

条件变量condition variable

c++11中,当条件不满足时,相关线程被一直阻塞,直到某种条件出现,这些线程才会被唤醒

  • 线程的阻塞是通过成员函数wait()/wait_for()和wait_until()实现
  • 线程唤醒是通过函数notify_all()和notify_one()实现

虚假唤醒:在正常情况下,wait类型函数返回时要么是因为被唤醒,要么是因为超时才返回,但是在实际中发现,因此操作系统的原因,wait类型在不满足条件时,它也会返回,这就导致了虚假唤醒。

if (不满足xxx条件) {
    //没有虚假唤醒,wait函数可以一直等待,直到被唤醒或者超时,没有问题。
    //但实际中却存在虚假唤醒,导致假设不成立,wait不会继续等待,跳出if语句,
    //提前执行其他代码,流程异常
    wait();  
}
 
//其他代码
...

// 实际使用:
    
while (!(xxx条件) )
{
    //虚假唤醒发生,由于while循环,再次检查条件是否满足,
    //否则继续等待,解决虚假唤醒
    wait();  
}
//其他代码
....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值