C++11的新特征
来源:互联网 发布:淘宝上的安踏官方网店 编辑:程序博客网 时间:2024/06/05 14:22
C++11对从前的语言做了很大的扩展,在我的感觉来看,加入了很多类似于python的语法,在以前严谨完整的基础上增加了便捷性,更加人性化了,这里摘取一部分书上提到的新特征,做一个读书笔记。
1. 使用auto自动声明变量或者对象
比如说:
auto i = 42; // i has type intdouble f();auto d = f(); // d has type double
这个功能实在是太便捷了,特别是在声明一些类型特别复杂的变量的时候,就显得更加可爱了,比如说:
vector<string> v;...auto pos = v.begin(); // pos has type vector<string>::iteratorauto l = [] (int x) -> bool { // l has the type of lambda ..., // taking an int and }; // returning a bool
但是要记住的是,它是根据初值自动判断变量类型的,所以必须在使用auto的时候对变量进行初始化。
2. 统一的初始化形式和Initializer_list<>
初始化有各种各样的形式,诸如各种括号、等号、空格等等,有时候就会弄不清楚对于什么变量需要使用哪种初始化的形式,因此C++11开始使用统一的初始化形式,使用者可以用一种通用的形式对各种类型的变量进行初始化,比如说:
int values[] {1, 2, 3};std::vector<int> v {2, 3, 5, 7, 11, 13, 17};std::vector<std::string> cities { "Berlin", "New York", "London", "Beijing" };std::complex<double> c{4.0,3.0};
C++11提供了std::initializer_list<>的模板让用户可以对自定义的类型进行初始化,用法如下:
void print (std::initializer_list<int> vals){ for (auto p=vals.begin(); p!=vals.end(); ++p) { std::cout << *p << std::endl; }}print ({12, 3, 5, 7, 11, 13, 17});
对于initializer_list<>还有一些详细的语法规则,以后遇到再详细介绍。
3. for 循环
这是我觉得十分人性化的一个改进,不多说,上例子:
for (int i : {2, 3, 5, 7, 9}) { std::cout << i << std::endl;}
这语法简直就是shell脚本的同胞兄弟,读起来简直让人神清气爽,但是现在并没有多少人真的在一个C程序中使用这种语法。
这种循环语法可以通用的这样写:
template <typename T>void printElements (const T& coll){ for (const auto& elem : coll) { std::cout << elem << std::endl; statement } }
这与我们平常用的循环效果一样,但是看起来会觉得更人性化。
4. Move Semantics and Rvalue References
这一节没有看懂,不是很理解Rvalue和lvalue是什么概念,copy assignment operator和move assignment operator也不是很懂,留待以后更新吧。
5. New String Literals
这一节主要就是解决了碰到特殊字符时需要不停加转义符的困扰,在C++11中可以使用raw string literal 很棒的解决:
R"(\\n)"
等价于
"\\\\n"
有没有很棒,更棒的是还可以使用分隔符,如:
R"nc(a\ b\nc()" )nc";
等价于
"a\\\n b\\nc()\"\n "
从此就不用再去数backslash的数量了。
6. lambdas
其实今天还是我第一次接触,还并不了解lambda的作用体现在哪里,简单贴上最简单的lambda 函数的使用:
[] { std::cout << "hello, lambdas" << std::endl;}
在我现在看来lambda就是一种函数,你可以传递给它参数,让它实现特定功能,返回需要的结果,不知道这和普通的自定义的函数有什么区别?
其实还有一些新特征我没有放上来,主要是我还不是很理解那些规则的用处,这一章就写到这里了,关于上文中的疑问(用粗体标示),希望以后能够解决,或者有热心的朋友可以帮助解答。
- C++11的新特征
- JavaEE5的新特征
- PHP4的新特征
- Struts2的新特征
- iOS10的新特征
- Servlet 2.5的新特征
- MIDP 2.1的新特征
- html5的一些新特征
- OpenCV2.4.3的新特征
- OpenCV2.4.3的新特征
- OpenCV2.4.3的新特征
- OpenCV2.4.3的新特征 .
- OpenCV2.4.3的新特征
- jdk1.5的新特征
- PHP 7 的新特征
- JDK5.0的11个主要新特征
- JDK5.0的11个主要新特征
- JDK5.0的11个主要新特征
- hdu1203 01背包+简单概率论
- sql分组函数使用
- maven-最短路径
- Leetcode之快速划分应用一主元素
- 忆2015年辽宁省赛
- C++11的新特征
- 学习 链表 总结一
- 获得 frame
- Error:(1, 1) 错误: 需要class, interface或enum
- 3.0.4、认识docker架构
- [转载]安卓jni控制GPIO LED
- ios 设置cell的selectedBackgroundView的大小
- hdu 1097 a hard puzzle
- 网络部分(三)