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. Java获取函数参数名称

    原理 编译之后的class文件默认是不带有参数名称信息的,使用 IDE 时,反编译jar包得到的源代码函数参数名称是 arg0,arg1......这种形式,这是因为编译 jar 包的时候没有把符号表 ...

  2. 注意Hibernate4在开发当中的一些改变(转)

    注意Hibernate4在开发当中的一些改变 原文:http://hi.baidu.com/austincao/item/fc9907da3d854e44fa576861 Hibernate4的改动较 ...

  3. java struts2入门学习---中文验证、对错误消息的分离、结果(result)类型细节配置

    一.需求 利用struts2实现中文验证并对错误消息的抽离. 详细需求:用户登录-->不填写用户名-->页面跳转到用户登录页面,提示用户名必填(以英文和中文两种方式提示)-->填写英 ...

  4. UICollectionView Demo

    1. 利用系统自动布局UICollectionViewFlowLayout进行布局. ViewController1 #import "ViewController1.h" @in ...

  5. lsof命令详解(转)

    lsof命令详解(转) 上一篇 / 下一篇  2011-06-09 21:56:41 / 个人分类:Linux 查看( 351 ) / 评论( 0 ) / 评分( 0 / 0 ) 在Linux中,ls ...

  6. 【HTML】如何判断当前浏览器是否是IE

    HTML里: HTML代码中,在编写网页代码时,各种浏览器的兼容性是个必须考虑的问题,有些时候无法找到适合所有浏览器的写法,就只能写根据浏览器种类区别的代码,这时就要用到判断代码了.在HTML代码中, ...

  7. CentOS7.2安装python2.7.12

    目前CentOS7.2自带的python版本是python2.7.5.由于yum这个软件需要系统自带的python工作. 如果冒然用自己安装的python替换掉系统自带的,可能造成yum不工作. 先安 ...

  8. Swift 值类型/引用类型

    1.值类型/引用类型 在 Swift 语言中,所有的类型都可以被分为 "值类型" 或者 "引用类型",可以将其理解为函数参数传递的方式. 值类型表示的是将它传递 ...

  9. 【php】thinkphp以post方式查询时分页失效的解决方法

    好久没有写博客了,最近说实话有点忙,各个项目都需要改bug.昨天晚上一直没有解决的php项目中的bug,就在刚才终于搞定,在这里还需要感谢博客园大神给的帮助! 具体问题描述 最近遇到一个非常棘手的问题 ...

  10. redis cluster 集群重新启动关闭

    找遍了redis cluster官方文档,没发现有关集群重新启动和关闭的方法.为啥会没有呢,推測redis cluster至少要三个节点才干执行,三台同一时候挂掉的可能性比較小,仅仅要不同一时候挂掉. ...