只允许对象生成于堆内?怎么理解?肿么办?
假如,手头上有一个类Person,当你在程序中写下Person rn时,
编译器悄悄地做了两件事:调用constructor构造对象rn,而在弹栈时,调用destructor析构对象rn。
对象rn的构造和析构全部由编译器负责,这是栈的特性!
诸所周知,对象rn生成于栈内。
而我们现在的要求是什么?“只允许对象生成于堆内。”rn明显违背了我们的要求,也就意味着它应该被禁止。
那这种 “坑爹型”的事情肿么办呢?有人想说,只要让Person的构造函数或者析构函数成为private就OK了。
也许许多人真会有这样的第一想法,假使那样,咱再往下进一步思考。
如果那样的话,这个类可以实现继承吗?No,即就是禁止继承。
另外,这个类允许其他类拥有它的对象吗?No,即就是禁止包含。
那怎么办呢? 解决的方法也很简单,解除继承的副作用只需让Person的析构函数成为protected就可以了;
解决内含的副作用只需让Test中的成员变量ps成为Person*类型并在Test的构造/析构函数中对成员变量做初始化和释放操作就可以了。
本例完整的代码如下所示。
1 #include<iostream> 2 using namespace std; 3 4 class Person 5 { 6 public: 7 Person() 8 { 9 cout<<"Con()"<<endl; 10 } 11 Person(int x) 12 { 13 a = x; 14 cout<<"Con(x)"<<endl; 15 } 16 void Destroy() 17 { 18 delete this; 19 } 20 21 protected: 22 ~Person() 23 { 24 cout<<"Des"<<endl; 25 } 26 private: 27 int a; 28 }; 29 30 class Student:public Person 31 { 32 33 }; 34 35 class Test 36 { 37 public: 38 Test() 39 { 40 ps = new Person(); //堆上对象 41 } 42 ~Test() 43 { 44 ps->Destroy(); 45 } 46 private: 47 Person *ps; 48 }; 49 50 void main() 51 { 52 Test t1; 53 }
Good Good Study, Day Day Up.
顺序 选择 循环 坚持