IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 句柄类_2 -> 正文阅读

[C++知识库]句柄类_2

#include <iostream>
#include <stdlib.h>
using namespace std;

/*
好事多磨,本来今天不想抄这章代码,看下一章节的,但是,我想了想,小说不可能章章都精彩
*/

///业务处理类
class Point
{
public:
?? ?Point() :xval(0), yval(0){}
?? ?Point(int x, int y) : xval(x), yval(y){}

?? ?int x() const { return xval; }
?? ?int y() const { return yval; }

?? ?Point& x(int xv){ xval = xv; return *this; }
?? ?Point& y(int yv){ yval = yv; return *this; }
?? ?
private:
?? ?int xval, yval;
};

///引用计数器类
class UseCount
{
public:
?? ?UseCount() : p(new int(1)){}

?? ?UseCount(const UseCount& u) :p(u.p)
?? ?{
?? ??? ?++*p;
?? ?}

?? ?~UseCount()
?? ?{
?? ??? ?if (--*p == 0)
?? ??? ?{
?? ??? ??? ?delete p;
?? ??? ?}
?? ?}

?? ?bool only()
?? ?{
?? ??? ?return *p == 1;
?? ?}

?? ?bool reattach(const UseCount& u)
?? ?{
?? ??? ?++*u.p;
?? ??? ?if (--*p == 0)
?? ??? ?{
?? ??? ??? ?delete p;
?? ??? ??? ?p = u.p;
?? ??? ??? ?return true;
?? ??? ?}
?? ??? ?p = u.p;
?? ??? ?return false;
?? ?}

?? ?bool makeonly()
?? ?{
?? ??? ?if (*p == 1)
?? ??? ?{
?? ??? ??? ?return false;
?? ??? ?}
?? ??? ?--*p;
?? ??? ?p = new int(1);
?? ??? ?return true;
?? ?}

private:
?? ?UseCount& operator==(const UseCount&);

private:
?? ?int* p;

};

///句柄类,包含了业务处理类和一个引用计数器
///能够自动管理内存的诀窍:构造函数在创建对象的时候就给成员变量赋了初始值,比如给类Point类创建了内存,给UseCount赋初值
///在调用析构函数的时候去检查了下引用计数器是否等于1,如果等于1就释放掉类Point的内存
///这是C++语言的特性,C无法实现的功能
///这就是C++的奇妙之处,有始有终,在创建对象的时候,给你一个函数进行一些操作,比如变量初始化,申请堆内存,在对象需要销毁的时候
///再给你一个函数进行一些操作,比如销毁堆内存,释放其他资源
class Handle
{
public:
?? ?Handle() : p(new Point){}
?? ?Handle(int x, int y) :p(new Point(x, y)){}
?? ?Handle(const Point& p0) :p(new Point(p0)){}
?? ?Handle(const Handle& h) :u(h.u), p(h.p){}
?? ?~Handle()
?? ?{
?? ??? ?if (u.only())
?? ??? ?{
?? ??? ??? ?delete p;
?? ??? ?}
?? ?}

?? ?Handle& operator=(const Handle& h)
?? ?{
?? ??? ?if (u.reattach(h.u))
?? ??? ?{
?? ??? ??? ?delete p;
?? ??? ?}
?? ??? ?p = h.p;
?? ??? ?return *this;
?? ?}

?? ?int x() const
?? ?{
?? ??? ?return p->x();
?? ?}

?? ?Handle& x(int x0)
?? ?{
?? ??? ?if (u.makeonly())
?? ??? ?{
?? ??? ??? ?p = new Point(*p);
?? ??? ?}
?? ??? ?p->x(x0);
?? ??? ?return *this;
?? ?}

private:
?? ?Point*?? ??? ?p;
?? ?UseCount?? ?u;

};

int main()
{

?? ?system("pause");
?? ?return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-24 09:11:57  更:2022-04-24 09:14:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 21:07:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码