Lambda表达式有什么作用?
最直观的作用就是使得代码变得异常简洁。防止污染环境。基本上就是为了防止污染环境吧。一般用两次的,函数内定义一个匿名表达式,这就很爽了。
C++的匿名表达式还是蛮强大的。
断言通常是用来验证参数的正确性的(判断一个表达式,如果结果为假,输出诊断消息并中止程序。),不至于说传过来一个null,在不知道的地方给空指针报错了。。。或者说,条件没有想全,一个assert填充位置,等到后期完善的时候改。
ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略掉。(在C中,ASSERT是宏而不是函数),使用ASSERT“断言”容易在debug时输出程序错误所在。
而assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。
使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。
在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include <stdio.h>
#define NDEBUG
#include <assert.h>
在新的C++标准中C++0x中,加了对静态断言的支持,引入了新的关键字static_assert来表示静态断言。使用静态断言,我们可以在程序的编译时期检测一些条件是否成立。但这个关键字太新了,没有几个编译器是支持的(好像VC2008支持,我用VC很少,主要是在linux下C++编程)。于是可以使用C++现有的模板特性来实现静态断言的功能。
静态断言在编译时进行处理,不会产生任何运行时刻空间和时间上的开销,这就使得它比assert宏具有更好的效率。另外比较重要的一个特性是如果断言失败,它会产生有意义且充分的诊断信息,帮助程序员快速解决问题。
语法:
static_assert(常量表达式,"提示字符串")
注解:如果第一个参数常量表达式的值为false,会产生一条编译错误。错误位置就是该static_assert语句所在行,第二个参数就是错误提示字符串。
我死了,C++新特性真的太多了。。。
只能规划着做。
class D1 : B1 {
using B1::B1;//表示继承B1的构造函数
};
相当于java.super();感觉不错啊。。。但是,他只能完全继承。这个构造能自动对应所有的构造。
std::map<int, int> tmp;
//对于std::map的[]运算符重载函数,在使用[]新增key时,std::map就已经插入了一个新的键值对
tmp[0] = tmp.size();//此处不知道插入的是{0, 0}还是{0, 1}
①后缀表达式从左到右求值。这包括函数调用和成员选择表达式。
②赋值表达式从右向左求值。这包括复合赋值。
③从左到右计算移位操作符的操作数。
给模板定义新类型用
template <typename T>
using NewType = SuckType<int, T, 1>; // 合法
模板的默认参数
template<typename T = int, typename U = int>
auto add(T x, U y) -> decltype(x+y) {
return x+y;
}
这些新特性真的,哇,多姿多彩。