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. Spring MVC中一般 普通类调用service

    在Spring MVC中,Controller中使用service只需使用注解@Resource就行,但是一般类(即不使用@Controller注解的类)要用到service时,可用如下方法: 1.S ...

  2. SQLServer2012 分页语句执行分析

    上一篇文章提到了,SQLServer2012在使用Offset,Fetch语句分页时,获取了大量不需要的数据,导致查询效率低的问题. 现在让我们来看看,究竟是什么导致SQLServer不能按需取数呢? ...

  3. 【android自己定义控件】自己定义View属性

    1.自己定义View的属性 2.在View的构造方法中获得我们自己定义的属性 3.重写onMesure 4.重写onDraw 3这个步骤不是必须,当然了大部分情况下还是须要重写的. 1.自己定义Vie ...

  4. HDU ACM 2586 How far away ?LCA-&gt;并查集+Tarjan(离线)算法

    题意:一个村子有n个房子,他们用n-1条路连接起来,每两个房子之间的距离为w.有m次询问,每次询问房子a,b之间的距离是多少. 分析:近期公共祖先问题,建一棵树,求出每一点i到树根的距离d[i],每次 ...

  5. Javascript语言精粹之String常用方法分析

    Javascript语言精粹之String常用方法分析 1. String常用方法分析 1.1 String.prototype.slice() slice(start,end)方法复制string的 ...

  6. python学习笔记--for循环

    推荐一个学习语言的网站:http://www.codecademy.com 有教程,可以边学边写,蛮不错的. for循环: 1.for loops allow us to iterate throug ...

  7. Oracle SQL Lesson (1) - 使用SQL Select语句获取数据

    第一节课: 启动数据库并且使用特定用户连接:su - oracle; 启动sqlplus并且使用sys连接:conn / as sysdba; 启动数据库:startup; 解锁用户:alter us ...

  8. JDBC连接数据库和释放连接

    用久了hibernate现在对于JDBC是怎么实现数据库的连接和释放,所以特地总结下关于JDBC的知识,目的是用于提醒自己很多Java的基础知识需要健全. package com.ssh.action ...

  9. openGL点精灵PointSprite具体解释: 纹理映射,旋转,缩放,移动

    第一,什么是点精灵 openGL的图形由顶点构成,以后利用顶点进行纹理的映射.点精灵就是,一个顶点被当作一个精灵来处理.特别之处就是,一个顶点也可进行纹理贴出.比如,原来是个顶点构成的一个矩形,如今一 ...

  10. hdu3452 无向树去掉最小的边集使不论什么叶子与根不连通 / 最小割

    思路一下就上来了,叶子向汇点连边,inf保证不会成为割,跑根到汇点最小割就可以.注意无向树双向建边.基础题,分分钟1A: #include<iostream> #include<qu ...