当前位置: 首页 > 编程日记 > 正文

C++ Primer 读书笔记 - 第十三章

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

相关文章:

Linux-LNMP(静态元素不记录日志和过期时间,防盗链,解析php,代理,支持ssl)

Linux-LNMP-Nginx配置二 静态文件不记录日志和过期时间Nginx防盗链Nginx访问控制Nginx解析php相关配置Nginx代理Nginx负载均衡SSL原理生成SSL密钥对Nginx配置SSL静态文件不记录日志和过期时间在Nginx服务器的虚拟主机配置文件(/usr/local/nginx/conf/vhost/norecord.conf)中定义…

mysql数据库优化命令_MySQL数据库优化总结

一个&#xff1a;MySQL标准数据库优化注意事项1.数据库设计(表设计合理)三范式(规范的模式)三范式包含&#xff1a;第一范式&#xff1a;1NF是对属性的原子性的约束。要求属性具有原子性&#xff0c;不可再分解。(仅仅要是关系型数据库都满足)第二范式&#xff1a;2NF是记录的唯…

C++ 卸载程序

目的&#xff1a;用C写一个自己的卸载程序来完成程序的卸载工作&#xff0c;同时运行后要删除卸载程序本身&#xff0c;并删除卸载程序所在的文件夹。 注&#xff1a;在程序退出的时候写上 自己的卸载代码。 // FileName: Uninstall.h #pragma onceclass CUninstall { private:…

《火星救援VR》原班人马打造全新AR游戏,让可爱小飞龙伴随你左右

曾开发了《火星救援》的VR团队即将发布AR游戏《Follow Me Dragon》&#xff0c;让可爱小飞龙“融入”真实世界。 开发商The Virtual Reality Company曾经打造过风靡一时的《火星救援》VR游戏。今日&#xff0c;他们刚刚发布了一款名为《Follow me Dragon》的AR游戏。 目前&…

【组队学习】【30期】时间序列分析

时间序列分析 航路开辟者&#xff1a;李岳昆、易远哲领航员&#xff1a;王洲烽航海士&#xff1a;李岳昆、易远哲 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/team-learning-data-mining/tree/master/TimeSeries内容属性&#xff1a;打磨课程内容说明…

mysql二进制日志管理_MYSQL二进制日志管理脚本

MYSQL二进制日志管理脚本脚本原理是每小时对进行flush生成新的二进制日志&#xff0c;将二进制日志备份至NFS&#xff0c;并压缩存放&#xff1a;#!/bin/bash#Purpose:管理二进制日志&#xff0c;每小时刷新二进制日志&#xff0c;并将日志复制到nfs服务器上&#xff0c;方便以…

iPhone App开发实战手册学习笔记(5)之IOS常用机制

1 前言 在IOS开发中&#xff0c;相信大家一定听说过委托&#xff0c;数据源&#xff0c;target&#xff0c;action等等&#xff0c;今天我们就来简单的学习一下这些内容。 2 详述 2.1 委托和数据源 大家是否曾经有不知道如何去执行一项任务的时候&#xff1f;或许是修理一台洗碗…

Datawhale组队学习周报(第035周)

希望开设的开源内容 目前Datawhale的开源内容分为两种&#xff1a;第一种是已经囊括在我们的学习路线图内的Datawhale精品课&#xff0c;第二种是暂未囊括在我们的学习路线图内的Datawhale打磨课。我们根据您的投票来确定精品课程的排期&#xff0c;打磨课程一旦完成&#xff…

【Project Euler】530 GCD of Divisors 莫比乌斯反演

【题目】GCD of Divisors 【题意】给定f(n)Σd|n gcd(d,n/d)的前缀和F(n)&#xff0c;n10^15。 【算法】莫比乌斯反演 【题解】参考&#xff1a;任之洲数论函数.pdf 这个范围显然杜教筛也是做不了的&#xff0c;而且考虑直接化简f(n)也遇到了困难&#xff0c;所以考虑将前缀和的…

php mysql 星级评分_jQuery+PHP实现星级评分

本例实现的效果&#xff1a;过渡动画显示评分操作。及时更新平均得分和用户所评的分数。后台限制用户重复评分操作&#xff0c;并在前端及时显示。XHTMLHTML结构分为用于显示灰星星div#big_rate、亮星星div#big_rate_up、分数span#s及span#g和提示信息div#my_rate。CSS.rate{wi…

Xt800、DEFY自带号码归属地更新包,更新至2013.4【数据总数278360条】

总结了http://bbs.gfan.com/forum.php?modviewthread&tid5603346&extrapage%3D1&page1和http://bbs.mfunz.com/thread-706813-1-1.html&#xff0c;经测试在我的XT800上可用&#xff0c;可以把其他的第三方来电软件通通删掉了。 特点&#xff1a;能够显示运营商&a…

中国电子学会图形化四级编程题:程序优化

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 我们将有关编程题目的教学视频已经发布到抖音号21252972100&#xff0c;小马老…

当代艺术遇上虚拟现实:幻境视界打造基业VR美术馆

VR展览也许并不少&#xff0c;但专业的艺术展却难得一见。幻境世界周志强希望能借助VR技术&#xff0c;实现“一地办展、全球同展、永不闭馆”&#xff0c;更好地传播当代艺术。 从米开朗琪罗到库尔贝&#xff0c;再到雷诺阿&#xff0c;大师们不断找到新的艺术语言来阐释人体…

python二叉搜索树建立_700. 二叉搜索树的搜索(Python)

题目难度&#xff1a;★☆☆☆☆类型&#xff1a;二叉树给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 NULL。例如&#xff0c;给定二叉搜索树:4/ \2 7/ \1 3和值: 2你应该返回…

CF484E Sign on Fence

题意 给定一个长度为n的数列&#xff0c;有m次询问&#xff0c;询问形如l r k 要你在区间[l,r]内选一个长度为k的区间&#xff0c;求区间最小数的最大值 Sol 二分答案 怎么判定&#xff0c;每种数字开一棵线段树 某个位置上的数大于等于它为1 那么就是求区间最大的1的序列长度大…

【组队学习】【30期】吃瓜教程——西瓜书+南瓜书

吃瓜教程——西瓜书南瓜书 航路开辟者&#xff1a;谢文睿、秦州领航员&#xff1a;邱振波航海士&#xff1a;谢文睿、秦州 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/pumpkin-bookB 站视频&#xff1a;https://www.bilibili.com/video/BV1Mh411e7VU内…

如何破解压缩文件密码-省时省力的方法

压缩文件破解工具下载地址&#xff1a;http://www.cnblogs.com/spring_wang/archive/2013/06/14/3135163.html 应该很多人都碰到过RAR加密、解密的问题吧。简单给大家介绍下如何用工具来破解RAR密码&#xff01;我们所利用的工具&#xff0c;就是“ARPR”、相信有些人肯定知道。…

学完javase和mysql_Java基础学完接下来应该学什么呢?

谢谢邀请&#xff01;Java基础部分涵盖了类、对象、属性和方法四大概念&#xff0c;以及封装、继承、多态的理解及使用。Java基础部分是Java学习过程中相对来说比较难的部分&#xff0c;Java语言属于开头难&#xff0c;之后越学越简单的语言。基础部分要清晰Java面向对象的开发…

Linux文件分割与合并:splitcat(转载)

转自&#xff1a;http://os.51cto.com/art/201104/255359.htm Linux下文件分割可以通过split命令来实现&#xff0c;而用cat进行文件合并。而分割可以指定按行数分割和安大小分割两种模式。Linux下文件合并可以通过cat命令来实现&#xff0c;非常简单。 在Linux下用split进行文…

【组队学习】【30期】李宏毅机器学习(含深度学习)

李宏毅机器学习&#xff08;含深度学习&#xff09; 航路开辟者&#xff1a;王茂霖、陈安东&#xff0c;刘峥嵘&#xff0c;李玲领航员&#xff1a;初晓宇航海士&#xff1a;王茂霖 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/leeml-notes开源内容&am…

mac下用Dosbox搭建dos下的汇编环境

安装Dosbox&#xff0c;下载地址 pan.baidu.com/s/1qZfgGc0 安装汇编编译器,下载masm pan.baidu.com/s/1c4k5fCc&#xff0c;在个人目录下新建 ~/Dosbox目录&#xff0c;把masm拷贝到Dosbox目录中 设置Dosbox autoexec, 编辑&#xff5e;/Library/Preferences/DOSBox\ 0.74\ …

java线程安全的set_Java并发编程之set集合的线程安全类你知道吗

Java并发编程之-set集合的线程安全类Java中set集合怎么保证线程安全&#xff0c;这种方式你知道吗&#xff1f;在Java中set集合是本篇是《凯哥(凯哥并发编程学习》系列之《并发集合系列》教程的第二篇&#xff1a;本文主要内容&#xff1a;Set集合子类底层分别是什么&#xff1…

亮剑.NET的系列文章之.NET实现三层架构(三)

最近一直在学习三层架构&#xff0c;前些天同样也写了一篇同样的博客&#xff0c;今天主要是通过一个登录的实例给大家讲解每部分的作用和相应代码的实现。先将实现三层架构的UML图给大家&#xff0c;帮助大家更好的理解三层。&#xff11;. UI作用 (1) 向用户展示特定业务数据…

【组队学习】【30期】6. 树模型与集成学习

树模型与集成学习 航路开辟者&#xff1a;耿远昊领航员&#xff1a;姜萌航海士&#xff1a;耿远昊 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/machine-learning-toy-code内容属性&#xff1a;打磨课程内容说明&#xff1a;本课程将对机器学习中的集成…

mysql整理碎片和显示语句错误

2019独角兽企业重金招聘Python工程师标准>>> &#xff11;、myisam存储引擎清理碎片方法 OPTIMIZE TABLE table_name &#xff12;、innodb存储引擎清理碎片方法 ALTER TABLE tablename ENGINEInnoDB &#xff13;、查看表碎片的方法 select ROW_FORMAT,TABLE_ROWS…

java 查询 代码_java使用es查询的示例代码

众所周知&#xff0c;elasticsearch简称es,它是基于基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是当前流行的企业级搜索…

【转】解密“设计模式”

有些人问我&#xff0c;你说学习操作系统的最好办法是学习程序设计。那我们是不是应该学习一些“设计模式”&#xff08;design patterns&#xff09;。这是一个我很早就有定论&#xff0c;而且经过实践检验的问题&#xff0c;所以想在这里做一个总结。 总的来说&#xff0c;如…

Qt Installer Framework实战

Qt Installer Framework是Qt发布的安装程序支持框架&#xff0c;只需要简单的配置就可以生成安装文件&#xff0c;同时可以通过javascript脚本来定制安装过程。 目录结构 config packages data meta 配置文件 config/config.xml packages/[product]/meta/package.xml packages/…

【NCEPU】徐韬:街景字符编码识别比赛

徐韬是华北电力大学数理系大四的学生&#xff0c;Datawhale成员/Dreamtech成员&#xff0c;参加了多期Datawhale的组队学习&#xff0c;也在天池/CCF/讯飞等比赛中取得了不错的成绩&#xff0c;现保送大连理工大学深造。 这篇图文是他在线下组队学习时&#xff0c;为大家分享自…

java 程序启动界面_程序启动界面java代码

最近写了个程序启动界面&#xff0c;分享一下import javax.swing.*;import java.awt.*;import java.net.*;//Download by http://www.codefans.net//程序启动界面/*dkplus专业搜集和编写实用电脑软件教程&#xff0c;*搜集各种软件资源和计算机周边&#xff0c;独立制作视频和p…