C++ 一些特性
1、 初始化列表std::initializer_list,头文件<initializer_list>
C++11提供了模板类template<class T> class initializer_list,可将其用于构造函数的参数,如果类有接受initializer_list作为参数的构造函数,则初始化列表语法就只能用于该构造函数。列表中的元素必须是同一种类型或可转换为同一种类型。除了可以用于构造函数外,还可将initializer_list用作常规函数的参数。用法如下
int sum(const std::initializer_list<int> &list)
{
int sum = 0;
for (auto it = list.begin(); it < list.end(); it++)
{
sum = sum + *it;
}
return sum;
}
int _tmain(int argc, _TCHAR* argv[])
{
int s = sum({ 1, 2, 3, 4 });
std::cout << s << std::endl;
return 0;
}
2、 C++提供了多种简化声明的功能,尤其在使用模板时。
C++11将auto用于实现自动类型推断。
auto num = 10;//num is type int
同时还可以简化模板。
for (auto it = list.begin(); it < list.end(); it++)
关键字decltype将变量的类型声明为表达式指定的类型,下面的语句的含义是,让y的类型与x相同,其中x是一个表达式。
decltype(x)y;
返回类型后置,即在函数名和参数列表后面指定返回类型。如下所示:
double f1(double, int);
auto f2(double, int) -> double;
这样就能解决在编译器遇到参数列表之前,T和U还不在作用域内,因此必须在参数列表后使用decltype。
template<typename T,typename U>
auto f3(T, U) ->decltype(T*U);
3、
在函数后noexcept来指出函数不会发生异常。
void get() noexcept;
在函数前加上explicit解决自动类型转换的问题。
explicit Test(double);//指定只能是double值,像int值就不行
关键字delete可用于禁止编译器使用特定方法。
关键字default只能用于6个特殊函数,可以显示地声明这些方法的默认版本。
虚函数说明符override指出你要覆盖一个虚函数,将其放在参数列表后面。这样,如果参数类型不对,编译器就会报错。
说明符final禁止派生类覆盖特定的虚方法。
4、 lambda表达式
int count = 6;
[&count](int x){count += (x % 13); };
lambda表达式对提使用函数谓词的STL算法来说尤其如此。
什么是函数谓词?函数谓词是一个判断式,一个返回bool值的函数/函数符/lambda函数。
我们以计算一个vector<int>中有多少个被3整除的数为例,使用标准模板库中count_if函数:
函数指针:
bool f3(int x){ return x % 3 == 0; }
vector<int> temp = { 1, 2, 3, 4, 5, 6 };
count = count_if(temp.begin(), temp.end(), f3);
函数符( 它是一个类对象,重载了操作符() ):
class f_mode
{
private:
int dv;
public:
f_mode(int d = 1) :dv(d){}
bool operator()(int x) { return x % 3 == 0;}
};
f_mode f4(3);
bool result = f4(7);//返回7%3 == 0, 即返回false
vector<int> temp = { 1, 2, 3, 4, 5, 6 };
count = count_if(temp.begin(), temp.end(), f4);
最后是使用lambda的情况,在C++11中对于接受函数指针或函数符的函数,可使用匿名函数定义(lambda)作为其参数。
[](int x){return x%3 == 0;}
这与函数f3很像
bool f3(int x){ return x % 3 == 0; }
使用[]替代了函数名(这就是匿名的由来);没有声明返回类型。返回类型相当于使用decltype根据返回值推断得到的,这里为bool。如果lambda不包含返回语句,推断出的返回类型为void。就当前这个示例而言,可以写成如下:
vector<int> temp = { 1, 2, 3, 4, 5, 6 };
count = count_if(temp.begin(), temp.end(),[](int x){return x%3 == 0;});
仅当lambda表达式完全由一条返回语句组成时,自动类型推断才管用;否则需要使用新增的返回类型后置语法:
[](double x)->double{int y=x;return x-y;}
我们在使用时,如果想重复使用一个lambda,那我们可以为这个lambda指定一个名称,这样就不用编写多次lambda了。
auto f5 = [](int x){return x%3 == 0;}
vector<int> temp = { 1, 2, 3, 4, 5, 6 };
count = count_if(temp.begin(), temp.end(),f5);
也可以直接当成函数来使用:
bool result = f5(13);
lambda还有一些额外的功能。lambda可访问作用域内的任何动态变量;要捕获要使用的变量,可将其名称放在中括号内。如果只指定了变量名[z],将按值访问变量;如果在名称前加上引用[&count],将按引用访问变量。[&]让您能够按引用访问所有动态变量,[=]让您能够按值访问所有动态变量,还能混合使用,[&, ted]让你能够按值访问ted,按引用访问其他所有动态变量。
C++ 一些特性的更多相关文章
- Fis3的前端工程化之路[三大特性篇之声明依赖]
Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...
- Fis3的前端工程化之路[三大特性篇之资源定位]
Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...
- Fis3的前端工程化之路[三大特性篇之内容嵌入]
Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...
- .NET 4.6.2正式发布带来众多特性
虽然大多数人的注意力都集中在.NET Core上,但与原来的.NET Framework相关的工作还在继续..NET Framework 4.6.2正式版已于近日发布,其重点是安全和WinForms/ ...
- SQL Server 2014 新特性——内存数据库
SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 ...
- 探索ASP.NET MVC5系列之~~~4.模型篇---包含模型常用特性和过度提交防御
其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...
- InnoDB关键特性学习笔记
插入缓存 Insert Buffer Insert Buffer是InnoDB存储引擎关键特性中最令人激动与兴奋的一个功能.不过这个名字可能会让人认为插入缓冲是缓冲池中的一个组成部分.其实不然,Inn ...
- ElasticSearch 5学习(10)——结构化查询(包括新特性)
之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...
- HTML5新特性有哪些,你都知道吗
一.画布(Canvas) 画布是网页中的一块区域,可所以用JavaScript在上面绘图.下面我们来创建一个画布并在上面绘制一个坦克(后面将用HTML5做一个坦克大战游戏),代码如下: <!DO ...
- C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)
#include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...
随机推荐
- grep -iq 与grep -qi 意思
就是有的时候你不需要直接打印出结果,比如在shell脚本中,你只需要知道grep有没有找到指定的字符串,而不需要满屏幕打印出来,因为那样会很难看.这只可以加-q选项,执行结果是:如果找到了,会返回0, ...
- idea使用svn or git
有时候项目开始使用svn 后来切换为git, 配置文件还在,导致有时候默认是svn,配置文件在 .idea --> vcs.xml 中, <mapping directory=" ...
- mysql 文件
慢查询日志 log_query_time 查询时间超过这个值则会出现在慢查询日志中,默认值是10 log_slow_queries 是否开启慢查询 log_queries_not_using_ind ...
- 有关在Eclipse中安装STS(Spring Tool Suite)的若干问题总结
1.之前说明 在网上找了很多安装的方法,每次在线安装总会出现各种各样的问题,本地安装也是出现同样的问题(后来发现是下载的包有问题) 还有其他问题(忘记截图了,上图来自网络),大概就是这些各种各样的错误 ...
- 现代编译原理——第二章:语法分析之LL(K)
转自: http://www.cnblogs.com/BlackWalnut/p/4472122.html LL(K)语法分析技术是建立在预测分析的技术之上的.我们先来了解预测分析技术.考虑以下文法: ...
- 外部tomcat发布springboot项目步骤和异常处理:java.lang.NoClassDefFoundError: javax/el/ELManager
- OO第一单元单元总结
总述 三周的时间一晃而过,也到了和表达式说再见的时候了.想起来,现在已经能够优雅地在互测“攻击”别人,然后笑对被别人“攻击”,就觉得OO这三周还是很有意义,也多多少少改变了我.周六已经快习惯早上背着包 ...
- 对于新版本的webstorm对vue的支持
webstorm 对于官方vue的支持,直到2017.1,这个版本,之后的版本不能直接安装vue插件,这时候就需要自己手动新建vue模板了
- "车羊门问题"作业
作业完成人: 学号:20171301008 潘松泉: 学号:20171301022 陈霖彬: 1.按照你的第一感觉回答,你觉得不换选择能有更高的几率获得汽车,还是换选择能有更高的几率获得汽车?或几率没 ...
- Eclipse 安装 AmaterasUML 插件
网上很多Eclipse 安装UML插件教程,可能对高版本Eclipse都无法安装成功,本文提供的安装方式,亲测可用. 一.安装GEF插件 1.打开eclipse官网 https://www.eclip ...