c++ primer读书笔记之c++11(三)
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(三)的更多相关文章
- c++ primer读书笔记之c++11(一)
1 新的关键词nullptr c++11引入新的关键词nullptr,用于表示空指针,用于替换之前c提供的NULL(最初NULL是定义在stdlib中的宏定义,通常是0). 2 新的别名定义机制 al ...
- c++ primer读书笔记之c++11(四)
1 带有作用域的枚举 scoped-enumeration 相信大家都用过枚举量,都是不带有作用域的,在头文件中定义需要特别注意不要出现重名的情况.为了解决这种问题,c++11提供了带作用于的枚举. ...
- c++ primer读书笔记之c++11(二)
1 新的STL模板类型,std::initializer_list<T> c++11添加了initializer_list模板类型,用于提供参数是同类型情况的可变长度的参数传递机制,头文件 ...
- C++ Primer 读书笔记:第11章 泛型算法
第11章 泛型算法 1.概述 泛型算法依赖于迭代器,而不是依赖容器,需要指定作用的区间,即[开始,结束),表示的区间,如上所示 此外还需要元素是可比的,如果元素本身是不可比的,那么可以自己定义比较函数 ...
- Key Technologies Primer 读书笔记,翻译 --- Struct 学习 1
原文链接:https://struts.apache.org/primer.html 本来想写成读书笔记的,结果还是变成翻译,谨作记录,学习. 1.HTML -- 见我前面文章 2.Interne ...
- Chrome插件安利!可以一键导出微信读书笔记|支持Markdown等三种格式
众所周知,微信读书App 是一款非常优秀的阅读类App ,周围也有不少人在用.虽然工作比较忙.但是也没少在上面看书做笔记. 美中不足的是,目前微信读书虽然支持笔记导出,但是提供的是将笔记复制到剪切板, ...
- 读书笔记_Effective_C++_条款三十:了解inline的里里外外
学过基本程序课的同学都知道,inline是内联的关键字,它可以建议编译器将函数的每一个调用都用函数本体替换.这是一种以空间换时间的做法.把每一次调用都用本体替换,无疑会使代码膨胀,但可以节省函数调用的 ...
- c++ primer 读书笔记
顺序容器:为程序提供控制元素存储和访问顺序的能力,这种顺序与元素加入到容器时的位置相对应,而与元素值无关. 另外还有根据关键字的值来存储元素的容器:有序.无序关联容器. 另外STL还有三种容器适配器, ...
- 【读书笔记】2016.11.19 北航 《GDG 谷歌开发者大会》整理
2016.11.19 周六,我们在 北航参加了<GDG 谷歌开发者大会>,在web专场,聆听了谷歌公司的与会专家的技术分享. 中午免费的午餐,下午精美的下午茶,还有精湛的技术,都是我们队谷 ...
随机推荐
- Emacs显示光标在哪个函数
Emacs24中打开which-function-mode即可. 在.emacs中添加一行: (which-function-mode 1) 调整which-function在mode-line中的显 ...
- HDUOJ-----Robot Motion
Robot Motion Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- java struts2入门学习--防止表单重复提交.OGNL语言学习
一.知识点回顾 防止表单重复提交核心思想: 客户端和服务器端和写一个token,比较两个token的值相同,则非重复提交;不同,则是重复提交. 1.getSession三种方式比较: request. ...
- lucene之中文分词及其高亮显示
参考:http://www.cnblogs.com/lirenzhujiu/p/5914174.html http://www.cnblogs.com/xing901022/p/3933675.htm ...
- 转:SpringMVC中日期格式的转换
解决日期提交转换异常的问题 由于日期数据有很多种格式,所以springmvc没办法把字符串转换成日期类型.所以需要自定义参数绑定.前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestM ...
- 【JQuery】jQuery中的常用方法小结
1.层级选择器 后代选择器 "父元素 后代元素" 比如:$("div p") 选取div元素下所有的p元素 子元素选择器 "父元 ...
- 实例应用 自定义页面taglib标签
关于继承TagSupport与BodyTagSupport的区别说明 * <code>TagSupport</code>与<code>BodyTagSupport& ...
- 适合移动端与PC端的 CSS Reset - m_base.css
文章来源:http://www.cnblogs.com/HCJJ/p/6399185.html 具体代码 @charset "utf-8"; html { -ms-text-siz ...
- Python 文件 seek() 方法
概述 Python 文件 seek() 方法用于移动文件读取指针到指定位置. 语法 seek() 方法语法如下: fileObject.seek(offset[,whence]) 参数 offset ...
- notepad++添加插件管理器
notepad++ 是一个很不错的文本编辑器,添加一些插件可以更好地使用. 首先需要使用插件管理器,最新版本的github地址是:https://github.com/bruderstein/nppp ...