自动类型扣除
auto关键字允许使用C ++ 11的内置类型推导。小编c++学习群825414254获取c++一整套系统性的学习资料还有数十套pdf
std::string something = somethingthatreturnsastring.getString();
auto something = somethingthatreturnsastring.getString();
自动自动推断所需变量必须是一个字符串,并将为您填写空格代替auto关键字。这对迭代器特别有用。
for(std::vector<T>::iterator it = x.begin(); it != x.end(); i++)
{
it->something();
}
现在可以
for(auto it = x.begin(); it != x.end(); i++)
{
it->something();
}
哇!更清洁的代码!
强类型枚举
这对于防止枚举名称冲突很有用,这是一个潜在的错误来源。在较旧的C ++中,必须指定整个程序中唯一的枚举。以前,如果您使用None作为枚举值,则没有其他枚举组可以使用None。但现在你可以!
枚举 类 myEnum {None,One,All};
myEnum o = myEnum :: All;
auto p = myEnum :: All; //也行得很好
Lambda表达式
Lambdas是基本的就地功能。它在迭代器和for循环中特别有用,它可能只需要在整个程序中使用此“函数”一次,因此没有任何定义该函数的点。使用lambdas之前,你实际上无法实现一些你无法做到的事情,它更像是一种受功能编程影响的便利功能。一个裸骨的看起来像这样:
[]() { }
使用所有可能的lambda运算符。
[]() mutable -> T { }
其中[]是捕获列表,()参数列表和{}是函数体。
捕获列表
捕获列表定义了lambda外部应该在函数体内可用的内容以及如何使用。它可以是:
- 一个值:[x]
- 参考文献[&x]
- 目前在参考范围内的任何变量[&]
- 与3相同,但按值[=]
您可以在逗号分隔列表中混合上述任何内容[x, &y]
。
参数列表
参数列表与任何其他C ++函数相同。
功能体
实际调用lambda时将执行的代码。
退货类型扣除
如果lambda只有一个return语句,则返回类型可以省略,并且隐式类型为decltype(return_statement)
。
易变的
如果lambda被标记为可变(例如[]() mutable { }
),则允许变异已经通过值捕获的值。
这是一个实际的例子。
int main()
{
char s[]="Hello World!";
int Uppercase = 0; //modified by the lambda
for_each(s, s+sizeof(s), [&Uppercase] (char c) {
if (isupper(c))
Uppercase++;
});
cout<< Uppercase<<" uppercase letters in: "<< s<<endl;
}
独特的指针
唯一指针是C ++ 11中的一类智能指针。
使用unique_ptr定义对象时,如果发生以下任一情况,对象将被销毁并释放其内存:
- 管理对象的
unique_ptr 被销毁- 管理对象的unique_ptr通过operator =或reset()分配另一个指针。
但对于外行人来说,这意味着当您使用唯一指针惯用法声明对象时,您不必在超出范围之前手动删除该对象。
以前,人们会这样做:
YourObject * obj = new YourObject();
而在最后,你必须要确保
删除(OBJ);
否则你会有内存泄漏。
现在,
std :: unique_ptr <YourObject> obj(new YourObject());
当obj超出范围时,内存将为您自由编辑。
static_assert
static_assert基本上是在编译期间执行的断言。例如,您可以执行以下操作:
<span style="color:#333333"><code>static_assert(sizeof(unsigned int) * CHAR_BIT == 32);</code></span>
如果由于某种原因上述比较对您的系统无效,则static_assert将失败。
可以使用的另一种方法是将它与C ++类型特征一起使用。例如,
static_assert(std :: is_pod <yourstruct> :: value,“不是pod结构!”);
POD代表普通旧数据 - 即没有构造函数,析构函数和虚拟成员函数的类(无论是使用关键字struct
还是关键字定义class
)。所以基本上,如果一个愚蠢的新程序员出现并决定将构造函数添加到特定的结构或类,则此static_assert将阻止编译并单独输出此错误。用于维护代码!
C ++ 11中还有很多有用的东西。当我发现更多时,我会发布它们,也许是第2部分。感谢阅读。