试图调用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++第三遍的更多相关文章

  1. 团体程序设计天梯赛-练习集L1-021. 重要的话说三遍

    L1-021. 重要的话说三遍 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 这道超级简单的题目没有任何输入. 你只需要把这句 ...

  2. 《Effective Java 第三版》新条目介绍

    版权声明:本文为博主原创文章,可以随意转载,不过请加上原文链接. https://blog.csdn.net/u014717036/article/details/80588806前言 从去年的3月份 ...

  3. L1-021 重要的话说三遍

    这道超级简单的题目没有任何输入. 你只需要把这句很重要的话 —— “I'm gonna WIN!”——连续输出三遍就可以了. 注意每遍占一行,除了每行的回车不能有任何多余字符. 输入样例: 无 输出样 ...

  4. Java线程——线程习题(一)子线程执行10次后,主线程再运行5次,这样交替执行三遍

    题目:子线程执行10次后,主线程再运行5次,这样交替执行三遍 代码如下: package com.itheima.gan; /** * 子线程执行10次后,主线程再运行5次,这样交替执行三遍 * @a ...

  5. Effective Java 第三版——1. 考虑使用静态工厂方法替代构造方法

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  6. Effective Java 第三版——3. 使用私有构造方法或枚类实现Singleton属性

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  7. Effective Java 第三版——7. 消除过期的对象引用

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  8. Effective Java 第三版——9. 使用try-with-resources语句替代try-finally语句

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  9. Effective Java 第三版——10. 重写equals方法时遵守通用约定

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

随机推荐

  1. shapely and geos break在distance方法

    问题 from shapely.geometry import Point print Point(0,0).distance(Point(1,1)) 报错 python: GeometryCompo ...

  2. UISegment属性

    1.segmentedControlStyle 设置segment的显示样式. typedefNS_ENUM(NSInteger, UISegmentedControlStyle) { UISegme ...

  3. tengine安装lua

    转子: http://www.cnblogs.com/shengshuai/p/4244851.html 参考: http://www.ttlsa.com/nginx/nginx-lua/ 学习:ht ...

  4. MongoDB(一):安装

    安装 从度娘上搜索MongoDB,找到官网地址:https://www.mongodb.com 找到下载中心地址:https://www.mongodb.com/download-center 我下载 ...

  5. 《30天自制操作系统》03_day_学习笔记

    harib00a: 添加的部分从P46开始,制作IPL准备开始从磁盘装载程序了 笔者讲解了软盘的驱动的构造,以及汇编语言读取软盘的方法 MOV AX,0x0820 MOV ES,AX ; 柱面0 ; ...

  6. 研究实验1_搭建一个精简的C语言开发环境(包含部分经典的前言)

    综合研究:      在这部分内容中,将启示我们如何进行独立研究和深度思考(一定要注意这一点,相应的调整自己的学习思想).同时使我们:          (1)认识到汇编语言对于深入理解其他领域知识的 ...

  7. Lintcode: Minimum Subarray

    Given an array of integers, find the subarray with smallest sum. Return the sum of the subarray. Hav ...

  8. BZOJ 1010 玩具装箱toy(四边形不等式优化DP)(HNOI 2008)

    Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...

  9. CCF真题之命令行选项

    201403-3 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项.每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔.这些字符串中的第一个为该命令行工具的名字,由小写字母 ...

  10. [转]IP动态切换脚本

    因为公司办公室要设置固定IP才行,而家里的IP段和公司是不一样的,家里采用了DHCP机制,这样每次就得改IP设置,很是不方便,就写了这个脚本来动态切换,很流畅的说!WINXP,WIN7测试通过~嘿嘿~ ...