1 =default构造函数限定符

c++11针对构造函数提供了=default限定符,可以用于显式指定编译器自动生成特定的构造函数、析构或赋值运算函数。参考代码如下:

class CtorDftType
{
public:
CtorDftType()=default;
CtorDftType(const CtorDftType&)=default;
CtorDftType & operator = (const CtorDftType &)=default;
~CtorDftType()=default;
};

使用=default限定符的构造函数,不需要实现,编译器会自动生成默认的函数实现。

2 =delete函数限定符

如果需要禁止类对象间的复制或者赋值,传统的做法是将复制构造函数和赋值运算符设置为private。c++11提供了的=delete限定符用于实现类似的功能,=delete限定符可用于任何函数,主要用于类成员函数的访问控制。

参考代码如下:

class DelModType
{
public:
DelModType()=default;
DelModType(const DelModType&)=delete;// no copy ctor
DelModType& operator = (const DelModType&)=delete; // no assignment
~DelModType() = default;
};

需要说明的是=delete可用于普通成员函数。建议析构函数不要使用=delete限定符。

=delete限定符会传递,引起包含、引用该成员的类的自动生成的构造函数、析构函数、赋值运算符变成私有的。(这个私有构造函数一个意思)

新的标准不建议使用私有构造函数、赋值运算符的形式。

3 显式转换运算符

c++11针对重载类型转换运算符很容易误用、滥用的问题,引入了explicit限定符用于描述转换运算符的重载,必须显示调用才可以进行转换。示例代码如下:

class ExplicitConversion
{
public:
explicit operator bool() const{return true;}
};

4 override成员函数限定词

c++11提供了override限定词,用于显示的说明子类中的某个接口是继承自父类的,并且在子类中重写了。其用法如下:

class Base
{
public:
Base()=default;
virtual ~Base()=default;
virtual int GetType() const{return ;}
};
class Derived: public Base
{
public:
Derived()=default;
~Derived()=default;
int GetType() const override{return ;}
};

5 final关键字

c++11引入final关键字用于修饰类名字,表示该类是不能作为基类或父类的。

class NoDerived final
{};

final也可以用于修饰成员函数,用于表示不能被重写的成员函数。

6 继承的构造函数

c++11引入了继承的构造函数,虽然说是继承的,但是用法和实际意义不太一样。使用using声明引入这种机制。代码如下:

class InBase
{
public:
InBase(int x, int y): m_x(x), m_y(y){}
virtual ~InBase(){}
protected:
int m_x, m_y;
};
class InDerived: public InBase
{
public:
using InBase::InBase;
};

子类InDerived的构造函数等同于以下代码:

class InDerived: public InBase
{
public:
InDerived(int x, int y):InBase(x,y){}
};

也就是说继承的构造函数表示子类有一个和父类同样参数的构造函数。需要注意的是继承的构造函数不支持默认参数的继承。

7 右值引用 RVal Reference和移动构造函数Move Ctor、移动赋值运算符Move Assignment

所谓的右值引用指的是该对象即将销毁,只有一个指针或引用指向该对象,比较常见的比如字面量、栈中即将销毁的变量。类似的右值引用如果存在指针或者其他动态动态分配的资源,我们可以使用移动构造函数或者移动赋值运算符将其资源重新使用,并将原有指针置空的机制。鉴于内容比较多,想深入了解的建议参考c++primer ch13.6或者c++11标准。

附加说明

本文内容主要是关于 c++ primer 第五版的第13章到第15章中涉及c++11内容的整理。涉及default、delete、explicit、override、final等关键字、继承构造函数、移动构造函数等机制。

所有代码都在gcc v4.8.1的版本中编译测试过,相关源码可以从我的git下载,url如下:https://git.oschina.net/Tocy/SampleCode.git,位于c++11目录下的cpp_primer_test3.cpp文件中。

c++ primer读书笔记之c++11(三)的更多相关文章

  1. c++ primer读书笔记之c++11(一)

    1 新的关键词nullptr c++11引入新的关键词nullptr,用于表示空指针,用于替换之前c提供的NULL(最初NULL是定义在stdlib中的宏定义,通常是0). 2 新的别名定义机制 al ...

  2. c++ primer读书笔记之c++11(四)

    1  带有作用域的枚举 scoped-enumeration 相信大家都用过枚举量,都是不带有作用域的,在头文件中定义需要特别注意不要出现重名的情况.为了解决这种问题,c++11提供了带作用于的枚举. ...

  3. c++ primer读书笔记之c++11(二)

    1 新的STL模板类型,std::initializer_list<T> c++11添加了initializer_list模板类型,用于提供参数是同类型情况的可变长度的参数传递机制,头文件 ...

  4. C++ Primer 读书笔记:第11章 泛型算法

    第11章 泛型算法 1.概述 泛型算法依赖于迭代器,而不是依赖容器,需要指定作用的区间,即[开始,结束),表示的区间,如上所示 此外还需要元素是可比的,如果元素本身是不可比的,那么可以自己定义比较函数 ...

  5. Key Technologies Primer 读书笔记,翻译 --- Struct 学习 1

    原文链接:https://struts.apache.org/primer.html 本来想写成读书笔记的,结果还是变成翻译,谨作记录,学习.   1.HTML -- 见我前面文章 2.Interne ...

  6. Chrome插件安利!可以一键导出微信读书笔记|支持Markdown等三种格式

    众所周知,微信读书App 是一款非常优秀的阅读类App ,周围也有不少人在用.虽然工作比较忙.但是也没少在上面看书做笔记. 美中不足的是,目前微信读书虽然支持笔记导出,但是提供的是将笔记复制到剪切板, ...

  7. 读书笔记_Effective_C++_条款三十:了解inline的里里外外

    学过基本程序课的同学都知道,inline是内联的关键字,它可以建议编译器将函数的每一个调用都用函数本体替换.这是一种以空间换时间的做法.把每一次调用都用本体替换,无疑会使代码膨胀,但可以节省函数调用的 ...

  8. c++ primer 读书笔记

    顺序容器:为程序提供控制元素存储和访问顺序的能力,这种顺序与元素加入到容器时的位置相对应,而与元素值无关. 另外还有根据关键字的值来存储元素的容器:有序.无序关联容器. 另外STL还有三种容器适配器, ...

  9. 【读书笔记】2016.11.19 北航 《GDG 谷歌开发者大会》整理

    2016.11.19 周六,我们在 北航参加了<GDG 谷歌开发者大会>,在web专场,聆听了谷歌公司的与会专家的技术分享. 中午免费的午餐,下午精美的下午茶,还有精湛的技术,都是我们队谷 ...

随机推荐

  1. CE lua脚本

    CE递归遍历主界面控件 local fnGetSpace = function(n) local ret = "" ,n do ret = (ret .. "-" ...

  2. iOS 持续集成

    iOS 持续集成系列 - 开篇 前言 iOS 开发在经过这几年的野蛮生长之后,慢慢地趋于稳定.无论开发语言是 Objective-C 还是 Swift,工程类型是 Hybird 还是原生,开发思想是 ...

  3. 完善_IO, _IOR, _IOW, _IOWR 宏的用法与解析

    _IO, _IOR, _IOW, _IOWR 宏的用法与解析  原文地址:http://www.eefocus.com/ayayayaya/blog/12-03/245777_20cdd.html 作 ...

  4. JAVA中线程池的简单使用

    比如现在有10个线程,但每次只想运行3个线程,当这3个线程中的任何一个运行完后,第4个线程接着补上.这种情况可以使用线程池来解决,线程池用起来也相当的简单,不信,你看: package com.dem ...

  5. Redis学习之路(008)- Redis C语言客户端库hiredis文档翻译

    Hiredis是Redis数据库一个轻量的C语言客户端库. 之所以轻量是由于它只是简单的提供了对redis操作语句支持的接口,并没有实现具体的操作语句的功能.但正是由于这种设计使我们只要熟悉了通用的r ...

  6. HDU 1907 John (Nim博弈)

    John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  7. Android APP通用型拒绝服务、漏洞分析报告

    点评:记得曾经有段时间很多SRC平台被刷了大量APP本地拒绝服务漏洞(目前腾讯金刚审计系统已经可检测此类漏洞),移动安全团队发现了一个安卓客户端的通用型拒绝服务漏洞,来看看他们的详细分析吧. 0xr0 ...

  8. numpy.linspace()等差数列函数

    在numpy中的linspace()函数类似与arange().range()函数: arange() .range() 可以通过指定开始值.终值和步长创建一维等差数组,但其数组中不包含终值 通过   ...

  9. xtrabackup部分备份数据库 Partial Backups

    官方文档: 部分备份: http://www.percona.com/doc/percona-xtrabackup/2.1/innobackupex/partial_backups_innobacku ...

  10. android控件拖动,移动、解决父布局重绘时控件回到原点

    这是主要代码: 保证其params发生改变,相对于父布局的位置就能达到位置移动到原来的位置 // 每次移动都要设置其layout,不然由于父布局可能嵌套listview,当父布局发生改变冲毁(如下拉刷 ...