感慨时间过的好快,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 之学习总结的更多相关文章

  1. 201521123082 《Java程序设计》第11周学习总结

    201521123082 <Java程序设计>第11周学习总结 标签(空格分隔):java 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. Answe ...

  2. 201521123067 《Java程序设计》第11周学习总结

    201521123067 <Java程序设计>第11周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线 ...

  3. 201521123045 <java程序设计>第11周学习总结

    201521123045 <java程序设计>第11周学习总结 1. 本周学习总结 2. 书面作业 2. 书面作业 Q1.1.互斥访问与同步访问完成题集4-4(互斥访问)与4-5(同步访问 ...

  4. 2018面向对象程序设计(Java)第11周学习指导及要求

    2018面向对象程序设计(Java)第11周学习指导及要求 (2018.11.8-2018.11.11)   学习目标 (1) 掌握Vetor.Stack.Hashtable三个类的用途及常用API: ...

  5. 20172333 2017-2018-2 《Java程序设计》第11周学习总结

    20172333 2017-2018-2 <Java程序设计>第11周学习总结 教材学习内容 对于Android Studio的安装以及对安卓的一些基本组成,比如说四大组件Acticity ...

  6. 20145202马超 2016-2017-2 《Java程序设计》第11周学习总结

    20145202马超 2016-2017-2 <Java程序设计>第11周学习总结 教材学习内容总结 XX 教材学习中的问题和解决过程 教材学习有问题先去https://shimo.im/ ...

  7. C++11并发学习之三:线程同步(转载)

    C++11并发学习之三:线程同步 1.<mutex> 头文件介绍 Mutex又称互斥量,C++ 11中与 Mutex 相关的类(包括锁类型)和函数都声明在 <mutex> 头文 ...

  8. 面向对象程序设计(JAVA) 第11周学习指导及要求

    2019面向对象程序设计(Java)第11周学习指导及要求 (2019.11.8-2018.11.11)   学习目标 理解泛型概念: 掌握泛型类的定义与使用: 掌握泛型方法的声明与使用: 掌握泛型接 ...

  9. 20175316盛茂淞 2018-2019-2 《Java程序设计》第11周学习总结

    20175316 <Java程序设计> 第11周学习总结 教材内容学习总结 第十三章 URL类 URL类是java.net包中的一个重要的类,URL的实例封装着一个统一资源定位符,使用UR ...

  10. 20175212童皓桢 《Java程序设计》第11周学习总结

    20175212童皓桢 <Java程序设计>第11周学习总结 教材学习内容总结 一.URL类 1.一个URL对象通常包含最基本的三部分信息:协议.地址.资源 2.构造方法: public ...

随机推荐

  1. 关于THIS_FILE

    VC++中本身就有内存泄漏检查的机制,可以在向导生成的支持MFC的工程中看到如下代码:  #ifdef _DEBUG  #define new DEBUG_NEW  #undef THIS_FILE  ...

  2. 30款css3实现的鼠标经过图片显示描述特效

    今天给大家分享30款css3实现的鼠标经过图片显示描述特效,鼠标经过这些图片的时候以非常炫的方式显示图片的描述.为保证最佳的效果,请在 IE10+.Chrome.Firefox 和 Safari 等现 ...

  3. 项目源码--IOS自定义视频播放器

    下载源码 技术要点: 1. 视频播放器功能的实现 2. 视频文件的扫描与管理 3. Ipad UI的实现 4.源码详细的中文注释 ……. 详细介绍: 1. 视频播放器功能的实现 源码基于MediaPl ...

  4. Replace INTO与INSERT INTO的不同之处

    Replace INTO和INSERT INTO的区别: REPLACE的运行与INSERT很相似.只有一点例外,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有 ...

  5. 3.3html学习笔记之链接

    iframe 元素会创建包含另外一个文档的内联框架 <iframe src=""/> 跳转链接 <a href="#here" target= ...

  6. c#删除转义字符的方法,删除\0后所有字符串(菜鸟级别)

    string str = "78738\01212"; string str_2= Regex.Unescape(str); int index = str_2.IndexOf(& ...

  7. 智能 RPC框架 (C++)

    RPC中文叫远程函数调用,它是一种通信方式,只是看起来像普通的函数调用. 它包括三个基本要素: 1:服务端注册相应的(服务)函数(用于调用方调用) 2:调用方通过函数调用的方式将一些信息和参数打包到消 ...

  8. SQL 必知必会-- 第1课:数据库基础和什么是SQL

    第1课 了解SQL 1 1.1 数据库基础 11.2 什么是SQL 61.3 动手实践 71.4 小结 8 第一课主要是一些概念,具体笔记如下: 1,数据库(database):保存有组织的数据的容器 ...

  9. 【Shell脚本学习11】Shell注释

    以“#”开头的行就是注释,会被解释器忽略. sh里没有多行注释,只能每一行加一个#号.只能像这样: #-------------------------------------------- # 这是 ...

  10. IE浏览器部分版本不支持background-siza属性问题

    background-size是CSS3新增的属性,但是IE8以下还是不支持,可以通过滤镜来实现这样的一个效果 background-size:contain; // 缩小图片来适应元素的尺寸(保持像 ...