【C++ Primer 第13章】3. 交换操作
交换操作
class HasPtr {
friend void swap(HasPtr &rhs, HasPtr &yhs);
//其他成员定义
};
void swap(HasPtr &rhs, HasPtr &yhs)
{
using std::swap;
swap(rhs.ps, yhs.ps); //交换指针,而不是string
swap(rhs.i, yhs.i); //交换int成员
}
• 在赋值运算符中使用swap
// 注意rhs是按值传递的。意味着HasPtr的拷贝构造函数
// 将右侧运算对象中的string拷贝到rhs
HasPtr& HasPtr::operator=(HasPtr rhs)
{
swap(*this, rhs);
return *this;
}
13.3节练习
• 13.30
#include<iostream>
#include<string>
using namespace std; class HasPtr {
friend void swap(HasPtr &rhs, HasPtr &yhs);
public:
HasPtr(const string &s = string()): ps(new string(s)), i() {}
HasPtr(const HasPtr &rhs): ps(new string(*rhs.ps)), i(rhs.i) {}
~HasPtr(); HasPtr& operator=(const HasPtr &rhs);
HasPtr& operator=(const string &rhs);
string& operator*();
private:
string * ps;
int i;
}; HasPtr::~HasPtr()
{
delete ps;
} HasPtr& HasPtr::operator=(const HasPtr &rhs)
{
auto newp = new string(*rhs.ps);
delete ps;
ps = newp;
i = rhs.i;
return *this;
} HasPtr& HasPtr::operator=(const string &rhs)
{
*ps = rhs;
return *this;
} string& HasPtr::operator*()
{
return *ps;
} void swap(HasPtr &rhs, HasPtr &yhs)
{
cout << "交换" << *rhs.ps << "和" << *yhs.ps << endl;
using std::swap;
swap(rhs.ps, yhs.ps);
swap(rhs.i, yhs.i);
} int main()
{
HasPtr h("hi, mom!");
HasPtr h2 = h;
HasPtr h3 = h;
h2 = "hi, dad!";
h3 = "hi, friend";
cout << "h2: " << *h2 << endl;
cout << "h3: " << *h3 << endl;
swap(h2, h3);
cout << "h2: " << *h2 << endl;
cout << "h3: " << *h3 << endl;
return ;
}
运行结果:

【C++ Primer 第13章】3. 交换操作的更多相关文章
- [C++ Primer] : 第13章: 拷贝控制
拷贝, 赋值与销毁 当定义一个类时, 我们显示地或隐式地指定在此类型的对象拷贝, 移动, 赋值和销毁时做什么. 一个类通过定义5种特殊的成员函数来控制这些操作, 包括: 拷贝构造函数, 拷贝赋值运算符 ...
- 第13章 GPIO-位带操作—零死角玩转STM32-F429系列
第13章 GPIO—位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- 【C++ Primer 第13章】6.对象移动
右值引用 左值和右值 (1)两者区别: ①左值:能对表达式取地址.或具名对象/变量.一般指表达式结束后依然存在的持久对象. ②右值:不能对表达式取地址,或匿名对象.一般指表达式结束就不再存在的临时对象 ...
- 【C++ Primer 第13章】2. 拷贝控制和资源管理
拷贝控制和资源管理 • 类的行为像一个值.意味着它应该有自己的状态,当我们拷贝一个像值得对象时,副本和原对象是完全独立的,改变副本不会对原对象有任何影响. • 行为像指针的类则共享状态.当我们拷贝一个 ...
- 【C++ Primer 第13章】1. 拷贝控制、赋值和销毁
拷贝控制.赋值和销毁 如果一个构造函数的第一个参数是自身类的引用,且额外的参数都有默认值,则此构造函数是拷贝控制函数(拷贝构造函数不应该是explicit的). 如果我们没有为一个类定义拷贝构造函数, ...
- 【C++ Primer 第13章】5. 动态内存管理类
StrVec类的设计 [题目描述]:我们将实现标准库vector类的一个简化版本,我们所做的一个简化是不使用模板,我们类只用于string,因此,它被命名为StrVec. #include<io ...
- 第13章 GPIO—位带操作
第13章 GPIO—位带操作 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- C++ primer plus读书笔记——第13章 类继承
第13章 类继承 1. 如果购买厂商的C库,除非厂商提供库函数的源代码,否则您将无法根据自己的需求,对函数进行扩展或修改.但如果是类库,只要其提供了类方法的头文件和编译后的代码,仍可以使用库中的类派生 ...
- ASM:《X86汇编语言-从实模式到保护模式》第13章:保护模式下内核的加载,程序的动态加载和执行
★PART1:32位保护模式下内核简易模型 1. 内核的结构,功能和加载 每个内核的主引导程序都会有所不同,因为内核都会有不同的结构.有时候主引导程序的一些段和内核段是可以共用的(事实上加载完内核以后 ...
随机推荐
- python---session(tornado中使用)缓存
session.py插件 # coding:utf8 # __author: Administrator # date: // # /usr/bin/env python import config ...
- 在 github 新建一个文件夹
创建新文件的时候名字后面加个斜杠(/)就可以了.
- 设置MyBatis在控制台打印SQL语句
在调试阶段,打印SQL会极大方便开发者.MyBatis有提供配置,只需要在MyBatis的配置文件mybatis-config.xml中<configuration>节点下,添加如下配置: ...
- Java编程思想 学习笔记5
五.初始化与清理 1.用构造器确保初始化 在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造 ...
- Linux 命令详解(十)Shell脚本的数组详解
1.数组定义 [root@bastion-IDC ~]# a=( ) [root@bastion-IDC ~]# echo $a 一对括号表示是数组,数组元素用“空格”符号分割开. 2.数组读取与赋值 ...
- 用ajax传递json,返回前台的中文乱码问题
java项目中用ajax传递json,返回前台时中文出现问号(乱码问题)的解决办法 首先看一下没有解决前的状态: 我用的框架是ssm,在springMVC中我配置了编码格式为utf-8,每个jsp页面 ...
- 阿里云服务器安装SQLServer本地无法远程访问
新买的阿里云服务器,安装上sqlserver2012,本机连接测试没有问题,但是回到本地,使用ip远程连接报错. 尝试了网上各种办法,都是失败.最后找到原因,原来在阿里云的控制台上有设置: 首先进入安 ...
- html 替换元素
参考博客:http://www.cnblogs.com/wkylin/archive/2011/05/12/2044328.html 可替换元素也是行内元素 替换元素是浏览器根据其标签的元素与属性来判 ...
- Freemarker导出带格式的word的使用
1.新建一个doc文档
- 说说流控制(RTS/CTS/DTR/DSR 你都明白了吗?)【转】
转自:http://bbs.ednchina.com/BLOG_ARTICLE_129041.HTM 以前写的博文,转过来 ============== 先引用一篇网文,作者不详,因几个地方都说自己是 ...