博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Operator Overloading part 3(Chapter 12 of Thinking in C++)
阅读量:5213 次
发布时间:2019-06-14

本文共 3434 字,大约阅读时间需要 11 分钟。

ExpandedBlockStart.gif
reference counting
  1 
#include 
<
string
>
  2 
#include 
<
iostream
>
  3 
using
 
namespace
 std;
  4 
  5 
class
 Dog
  6 
{
  7 
    
string
 nm;
  8 
    
int
 refcount;
  9 
    Dog(
const
 
string
&
 name) : nm(name), refcount(
1
 10 
    {
 11 
        cout 
<<
 
"
Creating Dog:
"
 
<<
 
*
this
 
<<
 endl;
 12 
    }
 13 
 14 
    Dog
&
 
operator
=
(
const
 Dog
&
 rv);
 15 
public
:
 16 
    
static
 Dog
*
 make(
const
 
string
&
 name)
 17 
    {
 18 
        
return
 
new
 Dog(name);
 19 
    }
 20 
 21 
    Dog(
const
 Dog
&
 d) : nm(d.nm 
+
 
"
 copy
"
), refcount(
1
)
 22 
    {
 23 
        cout 
<<
 
"
Dog copy-constructor: 
"
 
<<
 
*
this
 
<<
 endl;
 24 
    }
 25 
 26 
    
~
Dog()
 27 
    {
 28 
        cout 
<<
 
"
Deleting Dog: 
"
 
<<
 
*
this
 
<<
 endl;
 29 
    }
 30 
 31 
    
void
 attach()
 32 
    {
 33 
        
++
refcount;
 34 
        cout 
<<
 
"
Attached Dog:
"
 
<<
 
*
this
 
<<
 endl;
 35 
    }
 36 
 37 
    
void
 detach()
 38 
    {
 39 
        cout 
<<
 
"
Detaching Dog: 
"
 
<<
 
*
this
 
<<
 endl;
 40 
        
if
(
--
refcount 
==
 
0
)
 41 
        {
 42 
            delete 
this
;
 43 
        }
 44 
    }
 45 
 46 
    Dog
*
 unalias()
 47 
    {
 48 
        cout 
<<
 
"
Unaliasing Dog: 
"
 
<<
 
*
this
 
<<
 endl;
 49 
        
if
(refcount 
==
 
1
)
 50 
        {
 51 
            
return
 
this
;
 52 
        }
 53 
        
--
refcount;
 54 
        
return
 
new
 Dog(
*
this
);
 55 
    }
 56 
 57 
    
void
 rename(
const
 
string
&
 newName)
 58 
    {
 59 
        nm 
=
 newName;
 60 
        cout 
<<
 
"
Dog renamed to 
"
 
<<
 
*
this
 
<<
 endl;
 61 
    }
 62 
 63 
    friend ostream
&
 
operator
<<
(ostream
&
 os, 
const
 Dog
&
 d)
 64 
    {
 65 
        
return
 os 
<<
 
"
[
"
 
<<
 d.nm 
<<
 
"
], rc = 
"
 
<<
 d.refcount;
 66 
    }
 67 
};
 68 
 69 
 70 
class
 DogHouse
 71 
{
 72 
    Dog
*
 p;
 73 
    
string
 houseName;
 74 
public
:
 75 
    DogHouse(Dog
*
 dog, 
const
 
string
&
 house) : p(dog), houseName(house)
 76 
    {
 77 
        cout 
<<
 
"
Creating DogHouse: 
"
 
<<
 
*
this
 
<<
 endl;
 78 
    }
 79 
 80 
    DogHouse(
const
 DogHouse
&
 dh) : p(dh.p), houseName(
"
copy-constructed 
"
 
+
 dh.houseName)
 81 
    {
 82 
        p
->
attach();
 83 
        cout 
<<
 
"
DogHouse copy-constructed: 
"
 
<<
 
*
this
 
<<
 endl;
 84 
    }
 85 
 86 
    DogHouse
&
 
operator
=
(
const
 DogHouse
&
 dh)
 87 
    {
 88 
        
if
(
&
dh 
!=
 
this
)
 89 
        {
 90 
            houseName 
=
 dh.houseName 
+
 
"
 assigned
"
;
 91 
            p
->
detach();
 92 
            p 
=
 dh.p;
 93 
            p
->
attach();
 94 
        }
 95 
 96 
        cout 
<<
 
"
DogHouse operator= : 
"
 
<<
 
*
this
 
<<
 endl;
 97 
        
return
 
*
this
;
 98 
    }
 99 
100 
    
~
DogHouse()
101 
    {
102 
        cout 
<<
 
"
DogHouse destructor: 
"
 
<<
 
*
this
 
<<
 endl;
103 
        p
->
detach();
104 
    }
105 
106 
    
void
 renameHouse(
const
 
string
&
 newName)
107 
    {
108 
        houseName 
=
 newName;
109 
    }
110 
111 
    
void
 unalias()
112 
    {
113 
        p 
=
 p
->
unalias();
114 
    }
115 
116 
    
void
 renameDog(
const
 
string
&
 newName)
117 
    {
118 
        unalias();
119 
        p
->
rename(newName);
120 
    }
121 
122 
    Dog
*
 getDog()
123 
    {
124 
        unalias();
125 
        
return
 p;
126 
    }
127 
128 
    friend ostream
&
 
operator
<<
(ostream
&
 os, 
const
 DogHouse
&
 dh)
129 
    {
130 
        
return
 os 
<<
 
"
[
"
 
<<
 dh.houseName 
<<
 
"
] contains 
"
 
<<
 
*
dh.p;
131 
    }
132 
133 
};
134 
135 
int
 main()
136 
{
137 
    DogHouse fidos(Dog::make(
"
Fido
"
), 
"
FidoHouse
"
), spots(Dog::make(
"
Spot
"
), 
"
SpotHouse
"
);
138 
    cout 
<<
 
"
Entering copy-construction
"
 
<<
 endl;
139 
    DogHouse bobs(fidos);
140 
    cout 
<<
 
"
After copy-constructing bobs
"
 
<<
 endl;
141 
    cout 
<<
 
"
fidos:
"
 
<<
 fidos 
<<
 endl;
142 
    cout 
<<
 
"
spots:
"
 
<<
 spots 
<<
 endl;
143 
    cout 
<<
 
"
bobs:
"
 
<<
 bobs 
<<
 endl;
144 
    cout 
<<
 
"
Entering spots = fidos
"
 
<<
 endl;
145 
    spots 
=
 fidos;
146 
    cout 
<<
 
"
After spots = fidos
"
 
<<
 endl;
147 
    cout 
<<
 
"
spots:
"
 
<<
 spots 
<<
 endl;
148 
    cout 
<<
 
"
Entering self-assignment
"
 
<<
 endl;
149 
    bobs 
=
 bobs;
150 
    cout 
<<
 
"
After self-assignment
"
 
<<
 endl;
151 
    cout 
<<
 
"
bobs:
"
 
<<
 bobs 
<<
 endl;
152 
    
//
 Comment out the following lines:
153 
    cout 
<<
 
"
Entering rename(\
"
Bob\
"
)
"
 
<<
 endl;
154 
    bobs.getDog()
->
rename(
"
Bob
"
);
155 
    cout 
<<
 
"
After rename(\
"
Bob\
"
)
"
 
<<
 endl;
156 
}

 

转载于:https://www.cnblogs.com/zhtf2014/archive/2010/11/28/1890238.html

你可能感兴趣的文章
BootScrap
查看>>
[大牛翻译系列]Hadoop(16)MapReduce 性能调优:优化数据序列化
查看>>
WEB_点击一百万次
查看>>
CodeForces - 878A Short Program(位运算)
查看>>
路冉的JavaScript学习笔记-2015年1月23日
查看>>
Mysql出现(10061)错误提示的暴力解决办法
查看>>
2018-2019-2 网络对抗技术 20165202 Exp3 免杀原理与实践
查看>>
NPM慢怎么办 - nrm切换资源镜像
查看>>
CoreData 从入门到精通(四)并发操作
查看>>
Swift - UIView的常用属性和常用方法总结
查看>>
Swift - 异步加载各网站的favicon图标,并在单元格中显示
查看>>
Java编程思想总结笔记Chapter 5
查看>>
[LeetCode]662. Maximum Width of Binary Tree判断树的宽度
查看>>
WinForm聊天室
查看>>
Python 从零学起(纯基础) 笔记(一)
查看>>
【Python学习笔记】1.基础知识
查看>>
梦断代码阅读笔记02
查看>>
Java 线程安全问题
查看>>
selenium学习中遇到的问题
查看>>
大数据学习之一——了解简单概念
查看>>