改善程序与设计的55个具体做法 day2
条款05:了解C++默默编写并调用哪些函数
如果没有为类定义构造函数、析构函数、拷贝构造函数、重载赋值操作符,并且这些函数被需要(调用)时,编译器会为类生成默认的函数,而这些函数是public inline的。
需要主意的是带引用成员的类和带const成员的类。
带引用成员的类,如果不为其主动编写operator=,则对象之间的赋值操作是不能编译通过的;
带const成员的类,如果不为其编写operator=,则对象之间的赋值是不能通过编译的。
条款06:若不想使用编译器自动生成的函数,就该明确拒绝
根据条款05我们知道编译器会为类(在一定条件下)创建默认的构造、析构、拷贝构造、operator=函数,而当我们明确不需要编译器自作多情时,就该明确告诉编译器:别费劲了,老子有主了~ 即把这些函数声明(可以只声明而不定义)为private的。
当然这种方法并不保险,因为成员函数和friend函数仍然可以访问到这些函数,我们可以谨慎的不在成员函数和friend函数中对其进行调用(这一点,当只声明而不定义这些函数的时候,linker会帮助我们把不期望的调用找出来)。
另一种方法:
定义一个基类,该基类的作用是把不想让编译器自动生成的函数在该基类中声明为private的,然后让其他类继承该基类。
当客户端在我们的类没有主动定义一个这样的函数的时候去调用这些函数事,则编译器会自动生成对应的函数,而其【编译器生成版本】会尝试调用基类的对应兄弟而就会被决绝(private)。
改善程序与设计的55个具体做法 day2的更多相关文章
- 改善程序与设计的55个具体做法 day9
条款23:宁以non-member.non-friend替换member函数 即 以非成员函数 非友元函数 替换成员函数. 直观上,面向对象应该尽可能的封装,封装数据.封装操作等等,所以这个条款可能有 ...
- 改善程序与设计的55个具体做法 day7
条款18:让接口容易被正确使用,不易被误用 这里说的接口是广义上的接口,即包括但不限于函数接口.类接口.template接口等,每一种接口都是客户与你的代码进行交互的手段. 我们对客户的所谓“资质或水 ...
- 改善程序与设计的55个具体做法 day3
条款07:为多态基类声明virtual析构函数 任何一本C++语法教材上都会讲这一点(如果没讲,扔掉它),这么做到原因是可以让delete pBase操作能够正确的执行子类的析构函数. 需要说明的是当 ...
- 改善程序与设计的55个具体做法 day8
条款20:宁以pass-by-reference-to-const 替换 pass-by-value 即 以const引用 替换值传递. 采用引用传递参数时,底层往往是用指针方式实现,因此参数传递内置 ...
- 改善程序与设计的55个具体做法 day6
条款13:以对象管理资源 资源,包括但不限于内存.句柄.GDI对象.数据库连接等. 内存要记得释放,句柄要记得closehandle, GDI对象要记得删除,数据库连接要记得关闭,等等等等. 以对象来 ...
- 改善程序与设计的55个具体做法 day5
条款12:复制对象时勿忘其每一个成分 这里的复制是拷贝构造和operator= 每一个成分有几个维度: 1.每个成员变量 这个很好理解,添加新的成员时也要记得为每个新添加的成员执行合适的复制操作 2. ...
- 改善程序与设计的55个具体做法 day4
今天晚上回到小区门口,买了点冬枣,要结账的时候想起来,钥匙没带,落公司了! TNND,没办法再回趟公司,拿了钥匙,来回一个小时,汗~ 条款10:令operator=返回一个reference to * ...
- 改善程序与设计的55个具体做法 day1
博客好久没更新了,就从这本读书笔记开始吧. 条款01: 视C++为一个语言联邦 C++可视为有四个次语言组成的: 1.C语言 2.Object-Oriented C++ (面向对象C++) 3.Tem ...
- 重构HTML改善web应用设计
本文从良构,有效性,布局三个角度,结合往日项目开发经历, 整理总结重构HTML改善Web应用设计的几点规则和做法.部分参考自<重构HTML改善Web应用设计>. 重构.什么是重构?为什么要 ...
随机推荐
- 【VBA】查看窗口当前状态
Excle的窗口分为:最大化,最小化,一般 使用VB代码如何查看窗口的状态呢?代码如下所示: Sub 获取窗口状态() Dim State As String State = Application. ...
- 51单片机 | 使用D/A转换器实现三角波发生器
———————————————————————————————————————————— D/A转换器 CS=0.ILE=1时,WR1信号有效时将数据总线上的信号写入8位输入锁存器 XFER=0时,W ...
- 51单片机 | 实现SMG12864液晶显示器操作
———————————————————————————————————————————— SMG12864液晶显示器 128*64个点位,可以显示图形或8*4个汉字 - - - - - - - - - ...
- 【C语言疯狂讲义】(三)C语言运算符
1.运算符: 连接两个操作数(常量.变量)的符号 用运算符依照一定的规则连接的式子称为表达式 运算符的分类: 1)操作数的个数: 单目运算(++ sizeof !) 双目运算符:... ...
- Linux下Java、Maven、Tomcat的安装
1.安装Java(此处假定安装文件夹位/usr/local) 1)下载jdk(jdk-7),下载地址例如以下: 32位:http://download.oracle.com/otn-pub/java/ ...
- lua学习笔记(十一)
面向对象编程 对象的实现 在lua中table就是一种对象 1.有自己的状态 2.有自己的唯一标识self 3.有自己的生命周期 ...
- IIS 实现一个主机部署多个网站 共享80端口
如果一个主机只是建立一个80端口的网站就有点浪费了,通过本文你就可以实现,在一个主机上建立多个80端口的站点,并通过不同的域名进行访问. 打开iis软件:控制面板-->管理工具-->Int ...
- #define的使用方法体会
#define 创建一个宏,该宏是标识符或參数化标识符与标记字符串的关联. 在定义宏之后.编译器可用标记字符串替换源文件里标识符的每一个匹配项. 双击以所有折叠.">语法 #defin ...
- 转载 iOS全局检测网络变化的实时状态
昨天浏览了cocoaChina,发现了一遍文章是优化Reachablity框架的出来的检测网络类,大家都知道这个Reachablity框架是用来检测网络变化的!但是也是有一点bug,事实上,基于此 ...
- vscode 全局安装和配置 stylelint 像 webstorm 等 ide 一样来检查项目
商店里安装完插件以后全局安装或者在项目中(记得加--save-dev)安装配置: npm install stylelint-config-recommended -g 然后在vscode setti ...