C++11教程0 Welcome back to C++!
来源:互联网 发布:1984书评知乎 编辑:程序博客网 时间:2024/05/20 22:36
C++作为一门广泛使用的语言,从其问世起,距今已有30年历史。在这30年中,C++本身在不断的更新、变化,在2011年,更是推出了其最新标准C++11(据说C++14也要推出了)。
我们是否要学习C++11那?如果你现在还在为内存(资源)泄露问题而苦恼,还在为多线程的创建同步而编写大量代码,还在使用老旧臃肿的for循环(特别是遍历容器类型时)语法,那么,是时候做出改变了!
C++11以现代的方式,赋予了传统C++更强大的功能及灵活性,甚至像是魔术一样的功能(你之前想象过函数的形参个数可以动态变化而无需重载吗?!)。
作为当代C++程序员,当然要紧跟形势,拿着石器时代的锤子是无法编写出简洁而优雅强壮高效的现代C++代码的!那么,让我们一起开始全新的C++11之旅吧!
现代C++
上面说了这么多,那么具体什么是现代C++呢?我个人的感觉是,现代C++,其风格更为纯粹的面向对象,语法更为简洁,代码更为健壮同时不易出错。
下面是MSDN中对于传统C++及C++11标准的代码(注:vs2013中对于C++11标准更为完善,大家可以自行下载)的比较,他们均实现了相同的功能。
传统C++:
// circle and shape are user-defined typescircle* p = new circle( 42 ); vector<shape*> v = load_shapes();for( vector<circle*>::iterator i = v.begin(); i != v.end(); ++i ) { if( *i && **i == *p ) cout << **i << “ is a match\n”;}for( vector<circle*>::iterator i = v.begin(); i != v.end(); ++i ) { delete *i; // not exception safe}delete p;
C++11 标准:
#include <memory>#include <vector>// ...// circle and shape are user-defined typesauto p = make_shared<circle>( 42 );vector<shared_ptr<shape>> v = load_shapes();for_each( begin(v), end(v), [&]( const shared_ptr<shape>& s ) { if( s && *s == *p ) cout << *s << " is a match\n";} );
注意,delete不是异常安全的,而利用智能指针shared_ptr可以自动释放其指向的资源,同时能够保证是异常安全的。而auto关键字则极大的简化了编程,在你定义变量时,他会自动根据上下文来推断你变量的类型(在这里他是shared_ptr<circle>类型,在别的地方auto还可能是int类型……),而不用你自己明确写出变量类型!
现代C++强调:
- 基于堆栈的范围而不是堆或静态全局范围。
- 自动类型推断而不用显示的类型名称。(上面的auto而非shared_ptr<circle>)
- 利用string或wstring类型而非char[]字符串
- 利用stl中的容器而非数组
- 利用Exception机制来返回错误信息并处理错误(try……catch,例如对于类似函数的错误,不要用返回值如return 0表示正确,非0错误,而是在错误情况下直接抛出异常并catch之)
- 使用 STL std::atomic<>而非其他线程间通信机制的无锁线程间通信。
- 对于功能单一的简单小函数,使用Inline lambda functions.(类似之前的inline函数)
- 对于基于范围的for循环(如遍历数组、STL容器,Windows运行时集合),使用具有更强鲁棒性的 for-range-declaration : expression 形式的循环,而非传统for循环。
上面是MSDN中对于现代C++编程所强调的地方。个人感觉有些一时编程感觉会比较别扭,比如不返回错误值而是直接抛出异常,使用 for-range-declaration : expression 形式的循环。
总之,我们现在已经踏上了现代C++编程之路。
(本系列教程是基于MSDN关于vs2013支持C++11标准文档为基础的,MSDN原文网址 http://msdn.microsoft.com/zh-cn/library/hh279654.aspx)
- C++11教程0 Welcome back to C++!
- Welcome Back to C++ (Modern C++)
- 函数输出 Welcome to c++!
- Welcome & Welcome Back !
- c语言:输出(Welcome??)和(Welcome\?\?)
- call lua function from c and called back to c
- Google Code Jam 2009资格赛 题目C Welcome to Code Jam
- (C#)单词反转 位置不变 e.g., Welcome to my blog! -> emocleW ot ym !golb
- Swift Tutorial(swift 教程) 1: Welcome to Programming
- MAC SSH Raspberry Pi perl: warning: Falling back to the standard locale ("C").
- welcome to enigma blog
- Welcome to XMLBeans
- Welcome to Lin Guo!
- Welcome to Struts
- WELCOME TO `ICE WORLD`
- Welcome to my Blog!
- Welcome to my blog.
- welcome to firefox world
- 工作总结
- 描述:override保留字表示当前函数重写了基类的虚函数。
- 几种必知的oracle结构图
- Java中的String类
- 《VS2010中给VC开发的应用添加Installer》
- C++11教程0 Welcome back to C++!
- [windows+cocos2dx]CCSprite精灵类
- 使用rewrite中的301转移权重到一起
- 10.9
- 2014-6-18任务完成情况
- 现货交易常见的投资模式
- 所谓自救
- 手游过时了?开发者转向安卓电视平台
- LogBack的使用