类中指针数据成员的处理
上一篇 / 下一篇 2012-10-16 16:00:00 / 个人分类:杂谈
一般而言,类中只含有内置类型时,只使用编译器提供的默认constructor函数、默认destructor和默认overloaded assignment operator(重载操作符)即可,但是一旦有了指针数据成员,具体的说是指向堆中的值的指针数据成员,就得另当别论了。51Testing软件测试网ql%HhN
!\CA0i:do Vm0 由于编译器添加的默认函数都比较简单,对于比较简单的类而言,通常没有什么问题,但是当类中有数据成员指向堆中的值时,什么都需要程序员自己做了。
j&`r1D'~1n8Be0z0C2pA R^0 “实践出真知”,现在拿出一个比较好的代码分析:51Testing软件测试网GM!r dZ6G3`3J
51Testing软件测试网F"~6CkP"J!?p2I这是一个简单的animal的类,只有两个数据成员,但其中又一个是string*类型的,它是我们讨论的对象。51Testing软件测试网p0WTo$f4aA
51Testing软件测试网JV;w lZm$B3K//Heap Data Member51Testing软件测试网#UkT;D6qp*~
//Demonstrates an object with a dynamically allocated data member
51Testing软件测试网Hq4X:t$ne\x
#include <iostream>
%EQ['Ti6NVJJ5w2y6e0#include <string>
[m^5q
{8Fr051Testing软件测试网R
w4`%z2Y1m zR+y
using namespace std;51Testing软件测试网uPj%[3Y
4T Kb'T9N/Ax051Testing软件测试网#y0FV'g-l
class Animal
]u6LQ;Y%]3HJ7R0{
`Pp]G0?0public:
4QN GV@2|6|UV!R0 Animal(const string& name = "", int age = 0);
4z4OC(UJ%c#n0
~Animal();
<SPAN
style="WHITE-SPACE: pre"> </SPAN> <SPAN
style="WHITE-SPACE: pre"> </SPAN>//destructor prototype
oI[%\1T0 Animal(const Animal&
c); <SPAN style="WHITE-SPACE:
pre"> </SPAN>//copy constructor prototype51Testing软件测试网v-U i&]G-{{1Zc
Animal& Animal::operator=(const Animal& c);
<SPAN style="WHITE-SPACE:
pre"> </SPAN>//assignment operator
_Y,tBc0 void Greet() const; 51Testing软件测试网:~q6?H.B
#Rz
YHCs+f
c{o051Testing软件测试网v(Ak:R_)p#V$S$dj)c
private:51Testing软件测试网;Q&|6Y \6xb+@$v
string* m_pName;<SPAN style="WHITE-SPACE: pre"> </SPAN>//★要注意的关键
T][m%Wn l:i6c8bg0 int m_Age;
2sX"to8U7h1k sxW7o0};
51Testing软件测试网yF)y3?ucc7E
Animal::Animal(const string& name, int age)51Testing软件测试网]"UpV:I$|,i
{51Testing软件测试网%B-x$Ii&S-N3@ Z A
cout << "(构造函数被调用)\n";51Testing软件测试网.I%j`V'k)P3c{
m_pName = new string(name);<SPAN style="WHITE-SPACE: pre"> </SPAN>//另外分配内存空间 51Testing软件测试网-@)F&P)b"m$H
m_Age = age;
6fD]sw2j6ZB0}
w4|x1^Nx0
b6];aR}pY0Animal::~Animal()
//手工定义析构函数的必要性
g
hk"a(qs+NM+m0{
;g,j ]$WGP2z"}d0{0 cout << "(析构函数被调用)\n";
^:W#j.E[6n]Y6Sz a0 delete m_pName;<SPAN style="WHITE-SPACE: pre"> </SPAN>//释放内存空间
[.LS*\#]8?0}51Testing软件测试网*H
X[;d
[$~8Z"c;bed9t4t)P
lX_V\B2SI0Animal::Animal(const
Animal& c) <SPAN
style="WHITE-SPACE: pre"> </SPAN>//手工定义拷贝构造函数的必要性 51Testing软件测试网LSM4o0?_e|p
{
!G1Q3_gQ2eV!D0e$O2Y K0 cout << "(拷贝构造函数被调用)\n";
+VE9NA]:]|+?0
m_pName = new string(*(c.m_pName));<SPAN
style="WHITE-SPACE: pre"> </SPAN>//实现“深拷贝”的关键
/D7W#f(|:Q0 m_Age = c.m_Age;
Lu{B+h1cc,W0}51Testing软件测试网O?ay
wb