C++ 11 之学习总结
感慨时间过的好快,C++ 11出来都5年了,现在才开始学习,但为时也不晚;
主要是网上及身边的朋友大肆宣扬C++ 11的某些优化,弄得别人心里痒痒的,所以就花了3天学习了点基本知识,相对于整个C++ 11的新增来说就是九牛一毛;
先上一张C++ 11的图:
1.推导关键词 auto & decltype;
详解:http://www.cnblogs.com/viscount/p/5842872.html
2.Lambda的使用;
详解:http://www.cnblogs.com/viscount/p/5842805.html
3.统一初始化的语法;
详解:http://www.cnblogs.com/viscount/p/5842916.html
4.Delete和Default函数
.简介 我们知道C++的编译器在你没有定义某些成员函数的时候会给你的类自动生成这些函数,比如,构造函数,拷贝构造,析构函数,赋值函数。有些时候,我们不想要这些函数,比如,构造函数,因为我们想做实现单例模式。传统的做法是将其声明成private类型。 在新的C++中引入了两个指示符,delete意为告诉编译器不自动产生这个函数,default告诉编译器产生一个默认的 .例子 Default: structA { A()=default; //C++11 virtual~A()=default; //C++11 }; Delete: structNoCopy { NoCopy & operator =( constNoCopy & ) = delete; NoCopy ( constNoCopy & ) = delete; }; NoCopy a; NoCopy b(a); //compilation error, copy ctor is deleted 解析:default看起来貌似毫无用处,本来就会默认构造,但如果有定义构造,编译器就不会默认构造,这时候你用到default就是让默认构造和自定义构造共存;如下: structSomeType { SomeType() = default; // 使用编译器生成的默认构造函数 SomeType(OtherType value); }; .Delete两个有用点: a.让对象只能生成在栈内存上; structNonNewable { void*operator new(std::size_t) = delete; }; b.阻止函数的形参类型的调用;(若尝试以 double 的形参调用 f(),将会引发编译期错误, 编译器不会自动将 double 形参转型为 int 再调用f()) voidf(inti); voidf(double) = delete;
5.nullptr 和委托构造函数
.题外话 C/C++的NULL宏是个被有很多潜在BUG的宏。因为有的库把其定义成整数0,有的定义成 (。在C的时代还好。但是在C++的时代,这就会引发很多问题 .nullptr 是强类型的。 voidf(int); //#1 voidf(char*);//#2 //C++03 f(); //二义性 //C++11 f(nullptr) //无二义性,调用f(char*) .所有和指针相关的地方都用nullptr,包括函数指针和成员指针; const char *pc=str.c_str(); //data pointers if (pc!=nullptr) cout<<pc<<endl; int (A::*pmf)()=nullptr; //指向成员函数的指针 void (*pmf)()=nullptr; //指向函数的指针 --------------委托构造函数-------------- .题外话 在以前的C++中,构造函数之间不能互相调用,所以,我们在写这些相似的构造函数里,我们会把相同的代码放到一个私有的成员函数中 .定义: C++ 中构造函数可以调用同一个类的另一个构造函数: .例子 class M //C++11 delegating constructors { int x, y; char *p; public: M(), p(new char [MAX]) {} //#1 target M(): M() {cout<<"delegating ctor"<<end;} //#2 delegating 解析:# 就是所谓的委托构造函数,调用了真正的构造函数 #。
6.右值引用和move语意
.目的 a.消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率; b.能够更简洁明确的定义泛型函数; .左值的声明符号为“&”,为了和左值区分,右值声明符为“&&”; 例子: void process_value(int& i) { std::cout << "LValue processed: " << i << std::endl; } void process_value(int&& i) { std::cout << "RValue processed: " << i << std::endl; } int main() { ; process_value(a); //输出Lvalue 0; process_value(); //输出Rvalue 1 } .但是如果临时对象通过一个接受右值的函数传递给另一个函数时,就会变成左值,因为这个临时对象在传递过程中,变成了命名对象。 void process_value(int& i) { std::cout << "LValue processed: " << i << std::endl; } void process_value(int&& i) { std::cout << "RValue processed: " << i << std::endl; } void forward_value(int&& i) { process_value(i); } int main() { ; process_value(a); //Lvalue 0 process_value(); //Rvalue 1 forward_value(); //Lvalue 2 }
7.Override和final
.解释; Override:表示派生类应当重写这个基类中的这个虚函数; Final: 表示派生类不应当重写这个虚函数; //Overrride例子 classB { public: virtualvoidf(int){std::cout<<"B::f"<<std::endl;} }; classD:publicB { public: virtualvoidf(int)override{std::cout<<"D::f"<<std::endl;} }; //Final例子 classB { public: virtualvoidf(int){std::cout<<"B::f"<<std::endl;} }; classD:publicB { public: virtualvoidf(int)overridefinal{std::cout<<"D::f"<<std::endl;} }; classF:publicD { public: virtualvoidf(int)override{std::cout<<"F::f"<<std::endl;} }; 报错,在类D中就已经声明不再重写这个虚函数
8.区间迭代
.意义:所有语言都有一种对一个区间写for循环的便捷方式; 例子: vector<, , , , }; for (auto i:vec) { cout << i << endl; }
C++ 11 之学习总结的更多相关文章
- 201521123082 《Java程序设计》第11周学习总结
201521123082 <Java程序设计>第11周学习总结 标签(空格分隔):java 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. Answe ...
- 201521123067 《Java程序设计》第11周学习总结
201521123067 <Java程序设计>第11周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线 ...
- 201521123045 <java程序设计>第11周学习总结
201521123045 <java程序设计>第11周学习总结 1. 本周学习总结 2. 书面作业 2. 书面作业 Q1.1.互斥访问与同步访问完成题集4-4(互斥访问)与4-5(同步访问 ...
- 2018面向对象程序设计(Java)第11周学习指导及要求
2018面向对象程序设计(Java)第11周学习指导及要求 (2018.11.8-2018.11.11) 学习目标 (1) 掌握Vetor.Stack.Hashtable三个类的用途及常用API: ...
- 20172333 2017-2018-2 《Java程序设计》第11周学习总结
20172333 2017-2018-2 <Java程序设计>第11周学习总结 教材学习内容 对于Android Studio的安装以及对安卓的一些基本组成,比如说四大组件Acticity ...
- 20145202马超 2016-2017-2 《Java程序设计》第11周学习总结
20145202马超 2016-2017-2 <Java程序设计>第11周学习总结 教材学习内容总结 XX 教材学习中的问题和解决过程 教材学习有问题先去https://shimo.im/ ...
- C++11并发学习之三:线程同步(转载)
C++11并发学习之三:线程同步 1.<mutex> 头文件介绍 Mutex又称互斥量,C++ 11中与 Mutex 相关的类(包括锁类型)和函数都声明在 <mutex> 头文 ...
- 面向对象程序设计(JAVA) 第11周学习指导及要求
2019面向对象程序设计(Java)第11周学习指导及要求 (2019.11.8-2018.11.11) 学习目标 理解泛型概念: 掌握泛型类的定义与使用: 掌握泛型方法的声明与使用: 掌握泛型接 ...
- 20175316盛茂淞 2018-2019-2 《Java程序设计》第11周学习总结
20175316 <Java程序设计> 第11周学习总结 教材内容学习总结 第十三章 URL类 URL类是java.net包中的一个重要的类,URL的实例封装着一个统一资源定位符,使用UR ...
- 20175212童皓桢 《Java程序设计》第11周学习总结
20175212童皓桢 <Java程序设计>第11周学习总结 教材学习内容总结 一.URL类 1.一个URL对象通常包含最基本的三部分信息:协议.地址.资源 2.构造方法: public ...
随机推荐
- 20 Free Open Source Web Media Player Apps
free Media Players (Free MP3, Video, and Music Player ...) are cool because they let web developers ...
- 引入第三方库错误Undefined symbols for architecture i386: _OBJC_CLASS_$的解决方案
引起标题上所导致的错误是因为你的第三方库没有放入到Compile Sources里面去. 需要到你项目的Targets>>Build Phases>>Compile Sourc ...
- Centos系统使用vpnc连接cisco的vpn服务
安装vpnc 因为Centos官方源中,所含的软件安装包较少,这里需增加Fedora的源,依次执行: sudo rpm -ivh http://dl.fedoraproject.org/pub/epe ...
- Linux 测试网速
Linux 测试网速 1.直接wget -O /dev/null http://speedtest.wdc01.softlayer.com/downloads/test10.zip 一个10M的文件, ...
- c++ 设计模式8 (Factory Method 工厂方法)
5. “对象创建”类模式 通过“对象创建”类模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 5.1 工厂方法 动机: ...
- Xcode代码格式化教程,可自定义样式
来源:iOS_小松哥 链接:http://www.jianshu.com/p/a725e24d7835 为什么要格式化代码 当团队内有多人开发的时候,每个人写的代码格式都有自己的喜好,也可能会忙着写代 ...
- iOS 抓取 UIwebview 上 所有 图片 并进行滚动播放
关于在UIwebview上添加滚动图片 两种滚动手势会混淆,应为webview有webview.scrollview的属性 故参照昨天的随笔 scrollview嵌套解决方案. 本篇随笔主要讲循环使用 ...
- ios-为银行卡号格式化 每隔四位添加一个空格
-(NSString *)formatterBankCardNum:(NSString *)string { NSString *tempStr=string; NSInteger size =(te ...
- SQL Server 2008 表值参数用法
下面的示例使用 Transact-SQL 并演示如何执行以下操作:创建表值参数类型,声明变量来引用它,填充参数列表,然后将值传递到存储过程. USE AdventureWorks; GO /*创建表值 ...
- [Java,MVC] Eclipse下搭建Spring MVC
转自:http://blog.csdn.net/blue_jjw/article/details/8752466 一.新建Dynamic Web Project 一个web工程最基本的,只看3个地方, ...