Effective C++第三遍
试图调用private的copy或赋值函数是编译期错误,而调用没有具体定义的函数则是连接期错误。
以对象管理资源;智能指针RAII(资源获取立即初始化)后都是对象,但有时候,比如(API的)函数参数要求的是原始资源的指针,这时候有两种方法:
1、显式转换:智能指针提供了get成员函数可以直接获取原始资源:
std::tr1::shared_ptr<Investment> pInv(createInvestment());
int daysHeld(const Investment* pi);
int days=daysHeld(pInv.get());
2、隐式转换:智能指针重载了指针取值操作符(->和*);或者提供一个隐式转换函数。
内置类型参数通常被设计为pass-by-value,STL的迭代器和函数对象通常也被设计为pass-by-value。而其他很多class通常被设计为pass-by-reference,因为pass-by-value参数采用复制,会有很多构造和析构的成本。
public意味着不封装,而不封装几乎意味着不可改变,因为会涉及到(破坏)太多的用户代码。
能够访问private变量的只有成员函数和friend函数。因此使用非成员函数,有更好的封装性。
C++比较自然的做法是设计为非成员函数,然后位于目标class所在的同一个namespace内。
只有当参数位于参数列内时,才允许隐式转换,所以r*2正确(调用r.operater*(2),这里2被隐式转换为有理数),但2*r错误(因为没有相应函数可调用);一个可行的方法是让*成为一个non-member函数:const Rational operator*(const Rational& lhs,const Rational& rhs)。这样2*r也正确,因为2和r都位于参数列内,都被隐式转换为有理数Rational。
pimpl手法:以指针指向一个对象,内含真正数据。例如针对widget设计:
首先定义一个类widgetImpl包含实际的数据,然后类widget包含一个私有成员是widgetImpl的指针widgetImpl*。
全特化的写法:
namespace std{
template<>
void swap<widget>(widget& a,widget& b){
a.swap(b);
}
}
客户可以全特化std内的template,但不可以添加新的Template(或class或function或其他任何东西)到std里头。
因此,为使swap在尽可能多的语境下被调用,需要同时在目标class所在命名空间内写一个non-member版本及一个std::swap特化版本。
降低文件间的编译依存关系:
如果引用或指针能完全任务,就不要使用对象(这样不需要知道对象的大小,而只需要指针);
尽量以class声明式替换class定义式;
为声明式和定义式提供不同的头文件。
public继承:is-a ,适用于base classes身上的每一件事情一定也适用于派生类。现实中的is-a未必全适合这里的公有继承。
Effective C++第三遍的更多相关文章
- 团体程序设计天梯赛-练习集L1-021. 重要的话说三遍
L1-021. 重要的话说三遍 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 这道超级简单的题目没有任何输入. 你只需要把这句 ...
- 《Effective Java 第三版》新条目介绍
版权声明:本文为博主原创文章,可以随意转载,不过请加上原文链接. https://blog.csdn.net/u014717036/article/details/80588806前言 从去年的3月份 ...
- L1-021 重要的话说三遍
这道超级简单的题目没有任何输入. 你只需要把这句很重要的话 —— “I'm gonna WIN!”——连续输出三遍就可以了. 注意每遍占一行,除了每行的回车不能有任何多余字符. 输入样例: 无 输出样 ...
- Java线程——线程习题(一)子线程执行10次后,主线程再运行5次,这样交替执行三遍
题目:子线程执行10次后,主线程再运行5次,这样交替执行三遍 代码如下: package com.itheima.gan; /** * 子线程执行10次后,主线程再运行5次,这样交替执行三遍 * @a ...
- Effective Java 第三版——1. 考虑使用静态工厂方法替代构造方法
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——3. 使用私有构造方法或枚类实现Singleton属性
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——7. 消除过期的对象引用
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——9. 使用try-with-resources语句替代try-finally语句
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Effective Java 第三版——10. 重写equals方法时遵守通用约定
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
随机推荐
- EBS R12.2安装,使用的操作系统用户
在安装时,错误使用了oracle rdbms的对应的操作系统用户,导致安装前,验证时"web server install prerequisites"选项验证失败: (本图其它两 ...
- Java基础之写文件——创建通道并且写文件(TryChannel)
控制台程序,创建一个文件并且使用通道将一些文本写入到这个文件中. import static java.nio.file.StandardOpenOption.*; import java.nio.c ...
- 学习OpenCV——hand tracking手势跟踪
这几日,岛上风云突变,我这个倒霉孩子终究木有躲过感冒的魔掌,中枪鸟~~~ 这几天只写了个简单的手势跟踪的代码. 原理是:背景差分+肤色检测. 背景差分:取前30帧图像取平均值,计算前30帧之差的和,再 ...
- Vagrant配置与使用
Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境.它 使用Oracle的开源VirtualBox虚拟化系统,使用 Chef创建自动化虚拟环境. Vagrant is an amaz ...
- How to wipe silicon to CPU 如何给CPU正确涂抹硅脂
随 着计算机性能的提升,CPU的功耗也在不断的增大,虽然现在由于改进了工艺使得在功耗方面得到了一定的缓解,但由于近年来显卡性能的不断增强,也开始走上 了CPU功耗性能成正比的老路,功耗依然还是一个值得 ...
- [转]WEB开发者必备的7个JavaScript函数
我记得数年前,只要我们编写JavaScript,都必须用到几个常用的函数,比如,addEventListener 和 attachEvent,并不是为了很超前的技术和功能,只是一些基本的任务,原因是各 ...
- Css3中的变形与动画
新的转换属性 下面的表格列出了所有的转换属性: 属性 描述 CSS transform 向元素应用 2D 或 3D 转换. 3 transform-origin 允许你改变被转换元素的位置. 3 2D ...
- Spark朴素贝叶斯(naiveBayes)
朴素贝叶斯(Naïve Bayes) 介绍 Byesian算法是统计学的分类方法,它是一种利用概率统计知识进行分类的算法.在许多场合,朴素贝叶斯分类算法可以与决策树和神经网络分类算法想媲美,该算法能运 ...
- Android activity的回传数据
package com.example.myact3; import android.content.Intent; import android.os.Bundle; import android. ...
- Bootstrap布局设计
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...