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的一些功能的更多相关文章

  1. Apache Kafka 0.11版本新功能简介

    Apache Kafka近日推出0.11版本.这是一个里程碑式的大版本,特别是Kafka从这个版本开始支持“exactly-once”语义(下称EOS, exactly-once semantics) ...

  2. Kafka 0.11版本新功能介绍 —— 空消费组延时rebalance

    在0.11之前的版本中,多个consumer实例加入到一个空消费组将导致多次的rebalance,这是由于每个consumer instance启动的时间不可控,很有可能超出coordinator确定 ...

  3. 【Android】3.11 地理编码功能

    分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 一.简介 地理编码指的是将地址信息建立空间坐标关系的过程,提供了地理坐标和地址之间相互转换的能力. 地理编码分 ...

  4. 第11章 PADS功能使用技巧(1)-最全面

    一.如何走蛇形线? 蛇形线是布线过程中常用的一种走线方式,其主要目的是为了调节延时满足系统时序设计要求,但是设计者应该有这样的认识:蛇形线会破坏信号质量,改变传输延时,布线时要尽量避免使用,因此一块P ...

  5. 第11章 PADS功能使用技巧(2)-最全面

    原文链接点击这里 七.Flood与Hatch有什么区别? 我们先看看PADS Layout Help 文档是怎么说的,如下图所示: 从检索到的帮助信息,我们可以得到Hatch与Pour的区别,原文如下 ...

  6. 802.11(wifi)的MAC层功能

    MAC层是802.11的主要功能部分.上层应用通过调用MAC层提供的接口原语调用MAC层的功能. MAC一共向上提供了2大类接口原语,共30种.数据(1)和管理(29).数据部分就是提供普通数据包的收 ...

  7. Java 11 新功能来了!

    关键时刻,第一时间送达! 目前 Oracle 已经发布了 Java Development Kit 10,下个版本 JDK 11 也即将发布.本文介绍 Java 11 的新功能. 根据Oracle新出 ...

  8. Java 11新功能抢先了解

    目前 Oracle 已经发布了 Java Development Kit 10,下个版本 JDK 11 也即将发布.本文介绍 Java 11 的新功能. 根据Oracle新出台的每6个月发布一次Jav ...

  9. CUDA 11功能清单

    CUDA 11功能清单 基于NVIDIA Ampere GPU架构的新型NVIDIA A100 GPU在加速计算方面实现了最大的飞跃.A100 GPU具有革命性的硬件功能,CUDA 11与A100一起 ...

随机推荐

  1. Android它Service

    服务是一段代码的后台执行. 无法处理,也不是螺纹,但它是在进程和线程的执行. Android该服务与Activity不同,不能与用户交互,无法启动自己. 媒体播放服务.当用户退出媒体选择用户界面,不过 ...

  2. Struts开发问题集锦

    在struts2de 1.6以前版本,都是用<s:datepicker>标签来获取时间,1.8后可以用struts-dojo.plugin里的<sx:datetimepicker&g ...

  3. [Oracle] 接线表

    于OLTP制,嵌套连接占70%左右,哈希联接占20%,合并排序连接帐户10%. 嵌套连接 算法:嵌套连接从两个表分选出小表为驱动表,大表为被驱动表.先訪问驱动表(仅仅訪问1次).然后依据驱动表返回的行 ...

  4. 关于QTP

    关于QTP,我也才接触,只是上来记录一下安装过程,免得以后忘记,又要查一堆资料. 简单介绍一下QTP: QTP的基本功能包括2个部分:一部分是提供给初级用户使用的关键字视图:另一部分是提供给熟悉VBS ...

  5. Hibernate操作Clob数据类型

    在POJO字符串可以声明为一个大型对象java.lang.String要么java.sql.Clob种类. 当程序从数据库加载Clob数据的类型.负荷只有一个Clob数据的逻辑指针类型.我们需要通过使 ...

  6. ASM时的OFM特性对影的建数据文件名称的影响及为SYSTEM表空间的数据文件使用别名

    客户遇到个DG的问题,存储使用的ASM管理,有多个磁盘盘. 在主库创建数据文件,备库自己主动创建的数据文件都在同一磁盘组,而且在主库创建数据文件是指定的是类似**.DBF的名字,到备库也变成了使用AS ...

  7. Golang在Linux环境下的POSIX风格socket编程

    这里给出一个服务端和client,服务端能够接受多个连接,而且利用Go的杀手特性go和channel来替代select进行数据的接收. 服务端: package main import ( " ...

  8. Blink: Chromium的新渲染引擎

    编自http://www.chromium.org/blink 关于blink Google Chrome/Chromium 从创始至今一直使用 WebKit(WebCore) 作为 HTML/CSS ...

  9. 工作经常使用的SQL整理,实战篇(二)

    原文:工作经常使用的SQL整理,实战篇(二) 工作经常使用的SQL整理,实战篇,地址一览: 工作经常使用的SQL整理,实战篇(一) 工作经常使用的SQL整理,实战篇(二) 工作经常使用的SQL整理,实 ...

  10. VMware vSphere 服务器虚拟化之十六 桌面虚拟化之VMware Horizon View

       VMware vSphere服务器虚拟化之十六 桌面虚拟化之VMware Horizon View  VMware Horizon View (原VMware View的升级版现在版本5.2)是 ...