C++11的一些功能
1.断言是将一个须要为真的表达式放在语句中,在debug模式下检查一些逻辑错误的參数。C++中使用assert须要使用<assert.h>或者<cassert>头文件。有函数定义例如以下:
void fun(int a[],int n)
{
assert(n>0);
//dosomething;
}
这样就能够检查n<=0的情况。假设遇到这样的情况,程序会调用abort()函数而终止。
C++11提供了static_assert断言,它的函数原型接受两个參数,一个是断言表达式。一个是警告信息,能够用字符串表示。
static_assert(sizeof(int)==8,”64-bitmachine should follow this”);
int main()
{
return 0;
}
可见。static_assert()比assert提供了很多其它的信息。另外,static_assert()用于在编译期做断言推断,而assert()用于在执行期间做断言推断。
2.__func__是C++99标准中提前定义的标识符,功能是返回所在函数的名字,C++11标准中,__func__能够用于结构体中。如:
#include <iostream>
#include <cstdlib>
using namespace std;
struct Test
{
Test():name(__func__){}
const char *name;
};
int main()
{
Test t;
cout<<t.name<<endl;
return 0;
}
3.委派构造函数
class A
{
public:
A(){init();}
A(int i):x(i){init();}
A(double d ):f(d){init();}
private:
void init();
int x;
double f;
};
上面的代码中,三个版本号的构造函数都调用了init()函数。有没有办法简化这段代码呢?
能够使用委派构造函数:
class A
{
public:
A(){init();}
A(int i):A(){x=i;}
A(double d):A(){f=d;}
private:
void init();
int x;
double f;
};
4.初始化列表
#include <vector>
#include <iostream>
using namespace std;
int main()
{
int a[]={1,2,3};
int b[]{1,2,3};
vector<int> c{1,3,5};
return 0;
}
C++11支持这样几种初始化的方式:
赋值符号 如int a=1+2;
赋值符号加上初始化列表
int a={1+2};
圆括号
int a(1+2);
花括号加上初始化列表
int a{1+2}
5.右尖括号的改进
template <class T>
classA
{};
vector<A<int>>v;//c++98编译失败,C++11编译成功
vector<A<int> > v;//C++98编译成功,C++11编译成功
6.auto类型推导
#include<iostream>
using namespace std;
int main()
{
auto name=”world\n”;
cout<<”hello ”<<name<<enld;
return 0;
}
auto会自己主动推导出name的类型为constchar
*,然后在cout语句中输出
基于auto的上述特点。auto能够初始化复杂类型变量,能够支持泛型编程
7.for循环的改进
#include <isotream>
using namespace std;
void action(int &e)
{
cout<<e<<endl;
}
int main()
{
int arr[3]={1,2,3};
int *p=arr;
for(;p<a+3;++p)
cout<<*p<<endl;
for_each(arr,arr+sizeof(arr)/sizeof(arr[0]),action);//for_each
for(int &e:arr) //第二种写法
{
cout<<e<<endl;
}
for( auto e:arr) //auto自己主动类型推导
{
cout<<e<<endl;
}
return 0;
}
8.智能指针
C++使用的是auto_ptr,在C++11中它被废弃了,取而代之的是unique_ptr,shared_ptr和weak_ptr,
unique_ptr的缺点是必须独自占有内存,不能直接用=来进行赋值,并且使用move方法赋值之后。指针会失去全部权。
#include <iostream>
#include <memory>
using namespace std;
int main()
{
unique_ptr<int > p1(new int(1));
unique_ptr<int> p2=p1; //编译错。不能直接赋值
unique_ptr<int> p3=move(p1);
cout<<*p3<<endl;
cout<<*p1<<endl; //执行出错。p1的全部权已经交给了p3
return 0;
}
shared_ptr是表现的最像指针的智能指针。它使用引用计数来表示当前多少指针指向同一块内存,一个指针被释放。引用计数就会降低1。直到引用计数降低为0时,指针指向的内存才会真正的释放。
weak_ptr是作为shared_ptr的辅助。它本身不会引起引用计数的添加,它能够用来检验share_ptr的有效性。
#include <iostream>
#include <memory>
using namespace std;
void check(weak_ptr<int> &p)
{
shared_ptr<int> t=p.lock();
if(t!=nullptr)
cout<<”ok”<<endl;
else
cout<<”error”<<endl;
}
int main()
{
shared_ptr<int> p1(new int(1));
shared_ptr<int> p2=p1;
weak_ptr<int> wp=p1;
check(wp); //ok
p1.reset();
check(wp); //ok
p2.reset();
check(wp);
return 0;
}
9.空指针nullptr
C++98中。空指针NULL是一个宏,类似于#define
NULL0的形式,所以NULL本质上是个整型。C++11提出了nullptr取代NULL作为空的指针常量。
nullptr相对于NULL有什么优势,能够看下这个函数重载的样例。
void f(int i){}
void f(char *c){}
f(NULL)将会调用f(int)的版本号。由于NULL是0
而f(nullptr)将会调用f(char*c),由于nullptr是nullptr_t类型的
nullptr与nullptr_t的关系:nullptr_t是指针类型。nullptr是nullptr_t类型的常量
nullptr_t的性质有:
nullptr_t类型数据能够隐式转换成随意一个指针类型
nullptr_t不能转换为非指针类型,
nullptr_t能够用于关系运算,但不能用于算术运算
#include <iostream>
#include <typeinfo>
using namespace std;
int main()
{
char*p=nullptr; //转换为指针类型
int t=reinterpret_cast<int>(nullptr);//编译出错,nullptr_t类型不能转换为int
nullptr_tptr;
if(ptr==nullptr) //能够用于关系运算
cout<<”nullptr”<<endl;
nullptr+=1;//编译出错,不能用于算术运算
return 0;
}
10.lamda函数
#include <iostream>
using namespace std;
int main()
{
int a=1;
int b=2;
auto fun=[=]()->int{return a+b;};
cout<<fun()<<endl;;
return 0;
}
auto fun=[=]()->int{return a+b}定义了fun函数,它是lamda函数
lamda函数的定义方法例如以下:
[capture](parameter list) mutable ->return type {//do something;}
有关各个字段的含义这里不再赘述。
以下是lamda在stl中应用的一个样例:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
inline void cmp(int i)
{
if(i>7)
cout<<"larger than 7"<<endl;
}
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,0};
vector<int> v(a,a+10);
for(auto it=v.begin();it!=v.end();++it)
{
if(*it>7)
cout<<"largerthan 7"<<endl;
}
for_each(v.begin(),v.end(),cmp);
for_each(v.begin(),v.end(),[=](int i){
if(i>7)
cout<<"largerthan 7"<<endl;
});
return 0;
}
上面的代码遍历一个容器vector,使用了三种方法,一是利用迭代器。逐个推断,二是利用仿函数,三是利用了lamda函数。
版权声明:本文博客原创文章。博客,未经同意,不得转载。
C++11的一些功能的更多相关文章
- Apache Kafka 0.11版本新功能简介
Apache Kafka近日推出0.11版本.这是一个里程碑式的大版本,特别是Kafka从这个版本开始支持“exactly-once”语义(下称EOS, exactly-once semantics) ...
- Kafka 0.11版本新功能介绍 —— 空消费组延时rebalance
在0.11之前的版本中,多个consumer实例加入到一个空消费组将导致多次的rebalance,这是由于每个consumer instance启动的时间不可控,很有可能超出coordinator确定 ...
- 【Android】3.11 地理编码功能
分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 一.简介 地理编码指的是将地址信息建立空间坐标关系的过程,提供了地理坐标和地址之间相互转换的能力. 地理编码分 ...
- 第11章 PADS功能使用技巧(1)-最全面
一.如何走蛇形线? 蛇形线是布线过程中常用的一种走线方式,其主要目的是为了调节延时满足系统时序设计要求,但是设计者应该有这样的认识:蛇形线会破坏信号质量,改变传输延时,布线时要尽量避免使用,因此一块P ...
- 第11章 PADS功能使用技巧(2)-最全面
原文链接点击这里 七.Flood与Hatch有什么区别? 我们先看看PADS Layout Help 文档是怎么说的,如下图所示: 从检索到的帮助信息,我们可以得到Hatch与Pour的区别,原文如下 ...
- 802.11(wifi)的MAC层功能
MAC层是802.11的主要功能部分.上层应用通过调用MAC层提供的接口原语调用MAC层的功能. MAC一共向上提供了2大类接口原语,共30种.数据(1)和管理(29).数据部分就是提供普通数据包的收 ...
- Java 11 新功能来了!
关键时刻,第一时间送达! 目前 Oracle 已经发布了 Java Development Kit 10,下个版本 JDK 11 也即将发布.本文介绍 Java 11 的新功能. 根据Oracle新出 ...
- Java 11新功能抢先了解
目前 Oracle 已经发布了 Java Development Kit 10,下个版本 JDK 11 也即将发布.本文介绍 Java 11 的新功能. 根据Oracle新出台的每6个月发布一次Jav ...
- CUDA 11功能清单
CUDA 11功能清单 基于NVIDIA Ampere GPU架构的新型NVIDIA A100 GPU在加速计算方面实现了最大的飞跃.A100 GPU具有革命性的硬件功能,CUDA 11与A100一起 ...
随机推荐
- Android它Service
服务是一段代码的后台执行. 无法处理,也不是螺纹,但它是在进程和线程的执行. Android该服务与Activity不同,不能与用户交互,无法启动自己. 媒体播放服务.当用户退出媒体选择用户界面,不过 ...
- Struts开发问题集锦
在struts2de 1.6以前版本,都是用<s:datepicker>标签来获取时间,1.8后可以用struts-dojo.plugin里的<sx:datetimepicker&g ...
- [Oracle] 接线表
于OLTP制,嵌套连接占70%左右,哈希联接占20%,合并排序连接帐户10%. 嵌套连接 算法:嵌套连接从两个表分选出小表为驱动表,大表为被驱动表.先訪问驱动表(仅仅訪问1次).然后依据驱动表返回的行 ...
- 关于QTP
关于QTP,我也才接触,只是上来记录一下安装过程,免得以后忘记,又要查一堆资料. 简单介绍一下QTP: QTP的基本功能包括2个部分:一部分是提供给初级用户使用的关键字视图:另一部分是提供给熟悉VBS ...
- Hibernate操作Clob数据类型
在POJO字符串可以声明为一个大型对象java.lang.String要么java.sql.Clob种类. 当程序从数据库加载Clob数据的类型.负荷只有一个Clob数据的逻辑指针类型.我们需要通过使 ...
- ASM时的OFM特性对影的建数据文件名称的影响及为SYSTEM表空间的数据文件使用别名
客户遇到个DG的问题,存储使用的ASM管理,有多个磁盘盘. 在主库创建数据文件,备库自己主动创建的数据文件都在同一磁盘组,而且在主库创建数据文件是指定的是类似**.DBF的名字,到备库也变成了使用AS ...
- Golang在Linux环境下的POSIX风格socket编程
这里给出一个服务端和client,服务端能够接受多个连接,而且利用Go的杀手特性go和channel来替代select进行数据的接收. 服务端: package main import ( " ...
- Blink: Chromium的新渲染引擎
编自http://www.chromium.org/blink 关于blink Google Chrome/Chromium 从创始至今一直使用 WebKit(WebCore) 作为 HTML/CSS ...
- 工作经常使用的SQL整理,实战篇(二)
原文:工作经常使用的SQL整理,实战篇(二) 工作经常使用的SQL整理,实战篇,地址一览: 工作经常使用的SQL整理,实战篇(一) 工作经常使用的SQL整理,实战篇(二) 工作经常使用的SQL整理,实 ...
- VMware vSphere 服务器虚拟化之十六 桌面虚拟化之VMware Horizon View
VMware vSphere服务器虚拟化之十六 桌面虚拟化之VMware Horizon View VMware Horizon View (原VMware View的升级版现在版本5.2)是 ...