《Effective C++》读书笔记06:如果不要编译器自动生成的函数,就明确拒绝

有时候,我们需要定义一些独一无二的类,这些类是如此的特别,以至于我们不能将 其拷贝或者赋值:

1 class Family {};
2
3 Family mine;
4 Family your;
5 Family her(mine);//不能通过编译
6 mine = your;     //也不能通过

可是上一个专题讲到,即使我们不定义copy构造函数和copy assignment函数,编译器 还是会自动定义它们,所以,为了阻止上述行为,我们一般的解决方法就是:
1 class Family
2 {
3 public:
4
5 private:
6   Family(const Family&);  //我们将其定义在private中
7   Family& operator=(const Family&); //并且故意不实现它们:)
8 }

这样,如果用户无意中调用它们,就会在编译期间得到错误。而如果你在member函数 和friend函数中调用,则会是连接器发出抱怨;

也可以将连接期间的问题移到编译期间,可以这么做:

1 class Uncopyable
 2 {
 3 protected:
 4   Uncopyable() {};
 5   ~Uncopyable() {};
 6 private:
 7   Uncopyable(const Uncopyable&); //阻止copy
 8   Uncopyable& operator=(const Uncopyalbe&);  //阻止
 9 };
10
11 class Family: private Uncopyable //继承以后就完成了
12 {
13
14 };

时间: 2024-08-02 23:34:09

《Effective C++》读书笔记06:如果不要编译器自动生成的函数,就明确拒绝的相关文章

MYSQL必知必会读书笔记第十和十一章之使用函数处理数据_Mysql

 mysql简介 MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理. 拼接字段 存储在数据库表中的数据一般不是应用程序所需要的格式.我们需要直接从数据库中检索出转换.计算或格式化过的数据:而不是检索出数据,然后再在客户机应用程序或报告程序中重新格式化. 计算字段(字段 = 列,不过数据库列一般称为列,而字段通常用于计算字段中)并不实际存在于数据库表中,计算字段是运行时在select语句内创建的

《SQL Server企业级平台管理实践》读书笔记——SQL Server如何设置自动增长和自动收缩项

原文:<SQL Server企业级平台管理实践>读书笔记--SQL Server如何设置自动增长和自动收缩项 SQL Server允许用户设置数据库初始值和最大值,可以通过自动增长或者自动收缩进行配置.通过这些配置,我们可以防止数据库空间问题而导致的应用程序修改失败或者SQL Server磁盘空间耗尽的事情发生.一般来讲,如果数据库不是很忙,默认的设置为自动增长,这种方式能够满足大部分的需求.但是在大量并发的情况下,申请数据文件和日志文件增长本身是一件非常消耗系统资源和影响性能的工作.所以如果

More Effective C++ 读书笔记六——临时对象

条款19:了解临时对象的来源 c++真正的所谓的临时对象是不可见的--不会再你的源代码中出现.此等匿名对象通常发生于两种情况:一是当隐式类型转换(implicit type conveersions)被施行起来以求函数调用能够成功:二是当函数返回对象的时候. 第一种情况的例子: [cce lang="cpp"] #include <iostream> class Int { public: Int(int value) { _value = value; std::cout

Effective C++ 读书笔记之Part2.Constructors, Destructors, and Assignment Operators

5.Know what functions C++ silently writes and calls. 总结:编译器可以暗自为class创建default构造函数.copy构造函数.copy assginment操作符,以及析构函数.这些函数都是public的,并且是inline的. 6.Explicitly disallow the use of compiler-generated functions you to not want. 总结:为驳回编译器自动(暗自)提供的机能,可将相应的成

More Effective C++ 读书笔记五——异常

条款12:了解"抛出一个exception"与"传递一个参数"或"调用一个虚函数"之间的差异 第一,exception object总是会被复制,如果以by value方式捕捉,它们甚至被复制两次.至于传递给函数参数的对象不一定得复制.第二,"被抛出成为exceptions"的对象,其被允许的类型转换动作,比"被传递到函数去"的对象少.第三,catch子句以其"出现于源代码的顺序"被编译

More Effective C++ 读书笔记二

条款4:非必要不提供default constructor 这里主要是列举下默认构造函数的优点和缺点. 如果没有默认构造函数,定义对象数组会比较麻烦,因为对象数组初始化的时候没法传递非默认构造函数的值,如果要使用,书中提到的方法是给数组每个变量初始化的时候调用构造函数,另一个就是使用指针数组. 第一个的缺点很明显,没法声明类似A a[10];这样的数组,在堆上申请,还得用到placement new这个之前没讲过的东西,另外还得一个个去初始化:后者的缺点当然是,数组里面的每个指针都需要记得去de

Effective C++ 读书笔记之Part1.Accustoming Yourself to C++

1.View C++ as a federation of languages C++的四个次语言: 1)C 2)Object-Oriented C++ 3)Template C++ 4)STL 2.Prefer consts, enums, and inlines to #defines 一方面是因为使用宏定义不利于调试的时候定位错误,另一方面主要是因为预处理器和编译器两者分工不同所导致的. 同时,宏定义太复杂的情况下很容易出现错误. 总结: 第一,对于单纯常量,最好以const对象或enum

Effective C++ 读书笔记之Part5.Implementations

 26. Postpone variable definitions as long as possible. 总结: 尽可能延后变量定义式的出现.这样做可增加程序的清晰度并改善程序效率. 批注: 纯C语言此处有冲突,C语言要求变量定义出现在代码快的开始部分. 27. Minimize casting. 1)const_cast 通常被用来将对象的常量性转除(cast away the constness) .它也是唯一有此能力的 C++-style 转型操作符. 2)dynamic_cast主

Effective C++ 读书笔记之Part8.Customizing new and delete

49. Understand the behavior of the new-handler. 总结: 第一,set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用. 第二,Nothrow new是一个颇为局限的工具,因为它只适用于内存分配:后继的构造函数调用还是可能抛出异常. 50. Understand when it makes sense to replace new and delete. 替换编译器提供的operator new或operator dele