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中timer的schedule()和schedualAtFixedRate()函数的区别

    本文主要讨论java.util.Timer的schedule(timerTask,delay,period)和scheduleAtFixedRate(timerTask,delay,period)的区 ...

  2. Nginx+FastCGI运行原理(二)

    1.4 PHP与PHP-FPM的安装及优化(2) 标签rlimit_files用于设置PHP-FPM对打开文件描述符的限制,默认值为1024.这个标签的值必须和Linux内核打开文件数关联起来,例如, ...

  3. ant执行jar包中的main方法

    <project name= "myproject" basedir= "." default="main">    <p ...

  4. C# 因IIS回收导致定时器失效的解决方案

    首先不要设置iis自动回收,一般设置凌晨1-2点左右回收一次,当凌晨iis回收应用程序池的时候,会调用Application_End,执行里面的代码, 重新启动网站,建议定时器的代码放在Session ...

  5. numpy 基于数值范围创建ndarray()

    基于数值范围创建函数创建ndarray 1 numpy.arange arange([start=0,] stop[, step=1,][, dtype=None]) >>> np. ...

  6. MySQL -- 全文检索(自然语言全文检索)

    自然语言全文本检索缺省或者modifier被设置为in natural language mode,都是进行自然语言检索.对于表中的每一行,match()都会返回一个关联值. mysql> CR ...

  7. MySQL中模拟oracle中的rownum列

    mysql> select @rn := @rn + 1 as rownum, emp_no, dept_no, from_date, to_date -> from dept_emp, ...

  8. linux arm的高端内存映射

    linux arm的高端内存映射(1) vmalloc 高端内存映射   与高端映射对立的是低端映射或所谓直接映射,内核中有关变量定义它们的它们的分界点,全局变量high_memory,该变量定义在m ...

  9. 使用GDI+进行图片处理时要注意的问题

    原文链接: http://blog.csdn.net/chenlycly/article/details/24112955 与GDI相比,GDI+要强大很多.对于Windows应用程序来说,用GDI是 ...

  10. Java Nashorn--Part 1

    伴随 Java 8 的发布,Oracle 也一同发布了 Nashorn,它是在 Java 虚拟机上运行 Javascript 语言的一个引擎.Nashorn 的设计是为了替换最初的运行在 JVM 上的 ...