类中指针数据成员的处理
上一篇 / 下一篇 2012-10-16 16:00:00 / 个人分类:杂谈
一般而言,类中只含有内置类型时,只使用编译器提供的默认constructor函数、默认destructor和默认overloaded assignment operator(重载操作符)即可,但是一旦有了指针数据成员,具体的说是指向堆中的值的指针数据成员,就得另当别论了。51Testing软件测试网5tob2u3J%?
51Testing软件测试网&BB_o {^:g由于编译器添加的默认函数都比较简单,对于比较简单的类而言,通常没有什么问题,但是当类中有数据成员指向堆中的值时,什么都需要程序员自己做了。
8h(UO2X-q [0.]r'M-@#{H0 “实践出真知”,现在拿出一个比较好的代码分析:51Testing软件测试网#|;h3gM&k]/{(H
51Testing软件测试网lJi3D!Eq2f这是一个简单的animal的类,只有两个数据成员,但其中又一个是string*类型的,它是我们讨论的对象。51Testing软件测试网(C_)e(p1q
tB,j^"zm,k0//Heap Data Member51Testing软件测试网7|dm7H6nV
//Demonstrates an object with a dynamically allocated data member
Q9@1od!|"yZ P0#include <iostream>
s&bdn cM0#include <string>
8wi8~E
`of!^k;F0
ci1GK$f;`)j0using namespace std;
51Testing软件测试网(v
n1BOM,fqd
Cd
class Animal51Testing软件测试网
g2dP Q6W#j;C
a3?
{
o
I,Oo,bsU|R5J?0public:
]P3^kB3~3o9D8Y [0 Animal(const string& name = "", int age = 0);
F4^/ZLi&E"F]
E0
~Animal();
<SPAN
style="WHITE-SPACE: pre"> </SPAN> <SPAN
style="WHITE-SPACE: pre"> </SPAN>//destructor prototype
4jY-L]@W1R%iq0 Animal(const Animal&
c); <SPAN style="WHITE-SPACE:
pre"> </SPAN>//copy constructor prototype51Testing软件测试网E1B AdC"BTN(D
Animal& Animal::operator=(const Animal& c);
<SPAN style="WHITE-SPACE:
pre"> </SPAN>//assignment operator 51Testing软件测试网{ x]ho`"j#w#{;N
void Greet() const; 51Testing软件测试网yV \6Ly6y+d?
51Testing软件测试网!]?.CAG
private:
nGMN8?Y0OI0 string* m_pName;<SPAN style="WHITE-SPACE: pre"> </SPAN>//★要注意的关键 51Testing软件测试网 Z5kQ0pXtgTG*T
int m_Age;51Testing软件测试网%l)N7g6k-L!b3E*U
};
4E!c0d{I3{'I0Animal::Animal(const string& name, int age)
0yQ
y1Zb t,{0{
,[ d9x @|7k1DP0 cout << "(构造函数被调用)\n";
3xlH an4OF!T wQ0 m_pName = new string(name);<SPAN style="WHITE-SPACE: pre"> </SPAN>//另外分配内存空间
&G&|'S&K |6r
||it3{0 m_Age = age; 51Testing软件测试网#z
YL9L;}
}51Testing软件测试网N'd_#^0UK(Q#YX
/W\DFt0Animal::~Animal()
//手工定义析构函数的必要性 51Testing软件测试网(y0as xC*^J
{51Testing软件测试网)Y5PE6A&U0s'J
cout << "(析构函数被调用)\n";51Testing软件测试网lQ0J0]Ub(^
delete m_pName;<SPAN style="WHITE-SPACE: pre"> </SPAN>//释放内存空间 51Testing软件测试网4vW
IbR0{zh
}