1. Initialization和Assignment不一样。其中Initialization包括direct-initialization (如A a(...))和copy-initialization (如 A a = b;)

注意A a = b为copy-initialization,

而A a; A b; a = b;为Assignment。

2. We cannot copy objects of the IO types, so we cannot use copy-initialization on objects of these types.

3. As the copy constructor is used (implicitly) to pass and return objects to and from objects, it usually should not be made explicit.

4. 为了防止复制,我们可以把拷贝构造函数设置为private,同时只在类中声明,但不在任何地方定义。

5. Rule of Three, if you need a destructor, then you need all three copy-control members.

6. Even if we write our own destructor, the synthesized destructor is still run.

7. 编译器会为我们生成一个拷贝构造函数,但是一旦我们自己来写拷贝构造函数,那么我们必须对每个成员变量显示赋值,否则成员变量由其自身的默认构造函数来赋值。

8. 简单的Smart pointer示例。

#include <iostream>
using std::ostream; using std::cout; using std::endl;
#include <string>
#include <cstddef>
using std::size_t;
/* smart pointer class: takes ownership of the dynamically allocated*                      object to which it is bound * User code must dynamically allocate an object to initialize a HasPtr* and must not delete that object; the HasPtr class will delete it
*/
//private class for use by HasPtr only
class U_Ptr {friend class HasPtr;int *ip;size_t use;U_Ptr(int *p): ip(p), use(1) { }~U_Ptr() { cout << "U_Ptr destructor" << endl; delete ip; }
};class HasPtr {
public:// HasPtr owns the pointer; p must have been dynamically allocatedHasPtr(int *p, int i): ptr(new U_Ptr(p)), val(i) { }// copy members and increment the use countHasPtr(const HasPtr &orig):ptr(orig.ptr), val(orig.val) { ++ptr->use; }HasPtr& operator=(const HasPtr&);// if use count goes to zero, delete the U_Ptr object~HasPtr() { if (--ptr->use == 0) {cout << "HasPtr destructor" << endl;delete ptr; }} friend ostream& operator<<(ostream&, const HasPtr&);// copy control and constructors as before// accessors must change to fetch value from U_Ptr objectint *get_ptr() const { return ptr->ip; } int get_int() const { return val; }// change the appropriate data membervoid set_ptr(int *p) { ptr->ip = p; }void set_int(int i) { val = i; }// return or change the value pointed to, so ok for const objects// Note: *ptr->ip is equivalent to *(ptr->ip)int get_ptr_val() const { return *ptr->ip; } void set_ptr_val(int i) { *ptr->ip = i; }
private:U_Ptr *ptr;        // points to use-counted U_Ptr classint val;
};HasPtr& HasPtr::operator=(const HasPtr &rhs)
{++rhs.ptr->use;     // increment use count on rhs firstif (--ptr->use == 0) {cout << "operator= delete" << endl;delete ptr;    // if use count goes to 0 on this object, delete it
    }ptr = rhs.ptr;      // copy the U_Ptr objectval = rhs.val;      // copy the int memberreturn *this;
}ostream& operator<<(ostream &os, const HasPtr &hp)
{os << "*ptr: " << hp.get_ptr_val() << "\tval: " << hp.get_int() << endl;return os;
}int main()
{int *obj = new int(0);HasPtr ptr1(obj, 42);HasPtr ptr2(ptr1);cout << "(1) ptr1: " << ptr1 << endl << "ptr2: " << ptr2 << endl;ptr1.set_ptr_val(42); // sets object to which both ptr1 and ptr2 pointptr2.get_ptr_val();   // returns 42
cout << "(2) ptr1: " << ptr1 << endl << "ptr2: " << ptr2 << endl;ptr1.set_int(0);   // changes s member only in ptr1ptr2.get_int();    // returns 42ptr1.get_int();    // returns 0
cout << "(3) ptr1: " << ptr1 << endl << "ptr2: " << ptr2 << endl;
}

9. Define Valuelike Class

构造函数和析构函数

转载于:https://www.cnblogs.com/null00/archive/2013/05/31/3107928.html

C++ Primer 读书笔记 - 第十三章相关推荐

  1. 《Java编程思想》读书笔记 第十三章 字符串

    <Java编程思想>读书笔记 第十三章 字符串 不可变String String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以及包含修 ...

  2. 《C++ Primer》读书笔记——第十三章_拷贝控制

    一个类有5种特殊的成员函数:拷贝构造函数.拷贝赋值运算符.移动构造函数.移动赋值运算符.析构函数.如果没有定义这些拷贝控制成员,编译器会自动为它定义缺失的操作. A a; A b = a;//报错 1 ...

  3. 《APUE》读书笔记—第十三章守护进程

    守护进程也称为精灵进程是一种生存期较长的一种进程.它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.他们常常在系统引导装入时启动,在系统关闭时终止.unix系统有很多守护进程,大多数 ...

  4. 《深入浅出DPDK》读书笔记(十三):DPDK虚拟化技术篇(加速包处理的vhost优化方案)

    Table of Contents 加速包处理的vhost优化方案 142.vhost的演进和原理 143.Qemu与virtio-net 144.Linux内核态vhost-net 145.用户态v ...

  5. Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据

    Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据 Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据 7.1 程序数据的命名 PL/SQL要求在给数据结构命名的时候应 ...

  6. Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理

    Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 ACID原则:即一个事务具有原子性.一致性. ...

  7. PMP读书笔记(第9章)

    大家好,我是烤鸭:     今天做一个PMP的读书笔记. 第九章 项目资源管理 项目资源管理 项目资源管理的核心概念 项目资源管理的趋势和新兴实践 裁剪考虑因素 在敏捷或适应型环境中需要考虑的因素 9 ...

  8. PMP读书笔记(第2章)

    大家好,我是烤鸭:     今天做一个PMP的读书笔记. 第二章 项目运行环境 2.1 概述 2.2 事业环境因素 2.2.1 组织内部的事业环境因素 2.2.2 组织外部的事业环境因素 2.3 组织 ...

  9. PMP读书笔记(第1章)

    大家好,我是烤鸭:     今天做一个PMP的读书笔记. 第一章 引论 1.1 概述指南和目的 1.1.1 项目管理标准 1.1.2 通用词汇 1.1.3 道德与专业行为规范 1.2 概述指南和目的 ...

最新文章

  1. 再论c++模板之类型识别之如何得到类型信息
  2. maven项目 错误: 找不到或无法加载主类
  3. 吐槽net下没有靠谱的FastDFS的sdk之使用thrift实现JAVA和C#互通
  4. MySQL进阶:从删库到跑路
  5. html中th 与thead tbody的 使用
  6. python去除视频中的logo_Python音视频开发:消除抖音短视频Logo和去电视台标的实现详解...
  7. 电商3.0:构建互利共赢的生态圈
  8. php 数组的深度,有没有办法找出PHP数组的“深度”?
  9. matlab无法打开.m文件查看
  10. 【图像去噪】基于matlab小波域双重局部维娜滤板图像去噪【含Matlab源码 1642期】
  11. 诺基亚PC套件在windows 2003安装的方法
  12. WOS/EI/SCOPUS 三大文献检索数据库区别你了解吗?
  13. Python爬取实习僧职位信息
  14. 证书服务器 过期,iis7服务器证书过期如何换新的以及证书服务器
  15. R绘图: figure margins too large错误
  16. android手机壁纸
  17. Java多线程同步和异步详解
  18. php base62,base62编码
  19. 自己私藏的一篇:和现在做网络营销、咨询公司业务有关 和技术无关 和CRM有点关系 可能给网络社区和网络营销从业者有启发
  20. 树莓派魔镜MagicMirror —— 3 HDMI连接显示器

热门文章

  1. 一致 先验分布 后验分布_浅谈Loki分布式架构中的一致性哈希
  2. 网站的 计算机主机作用是什么意思,网关是什么意思?网关的作用是什么?
  3. mysql show命令用不了_MySQL show命令的用法 | 很文博客
  4. 和12岁小同志搞创客开发:如何驱动 12864 OLED液晶显示屏?
  5. 1. 编程规范和编程安全指南--python
  6. 【camera-radar】自动驾驶相机-毫米波雷达融合方案综述
  7. P1505 [国家集训队]旅游 树链剖分
  8. 多重继承_多重继承和菱形问题
  9. c语言编号程序,c语言中如何在一个程序语句前加编号c语言中如何在一个程序语句前加...
  10. c++ to_string用法