编写C++中的两个类 一个只能在栈中分配空间 一个只能在堆中分配
2015-08-07 07:34:12
CSDN-
fycy2010-
点击数:17
id="iframeu848856_0" src="http://pos.baidu.com/ecsm?rdid=848856&dc=2&di=u848856&dri=0&dis=0&dai=2&ps=268x275&dcb=BAIDU_SSP_define&dtm=BAIDU_DUP_SETJSONADSLOT&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1458977100809&ti=%E7%BC%96%E5%86%99C%2B%2B%E4%B8%AD%E7%9A%84%E4%B8%A4%E4%B8%AA%E7%B1%BB%20%E4%B8%80%E4%B8%AA%E5%8F%AA%E8%83%BD%E5%9C%A8%E6%A0%88%E4%B8%AD%E5%88%86%E9%85%8D%E7%A9%BA%E9%97%B4%20%E4%B8%80%E4%B8%AA%E5%8F%AA%E8%83%BD%E5%9C%A8%E5%A0%86%E4%B8%AD%E5%88%86%E9%85%8D-C%2B%2B-%E7%AC%AC%E4%B8%83%E5%9F%8E%E5%B8%82&ari=1&dbv=2&drs=1&pcs=1430x920&pss=1430x269&cfv=17&cpl=6&chi=1&cce=true&cec=UTF-8&tlm=1458977100<u=http%3A%2F%2Fwww.th7.cn%2FProgram%2Fcp%2F201508%2F522368.shtml<r=http%3A%2F%2Fcn.bing.com%2Fsearch%3Fq%3D%25E4%25BD%25BF%25E4%25B8%2580%25E4%25B8%25AA%25E7%25B1%25BB%25E7%259A%2584%25E5%25AE%259E%25E4%25BE%258B%2B%25E5%258F%25AA%25E8%2583%25BD%25E5%259C%25A8%25E5%25A0%2586%25E4%25B8%25AD%25E5%2588%2586%25E9%2585%258D%25E5%2586%2585%25E5%25AD%2598%2B%25E4%25B8%258D%25E8%2583%25BD%25E5%259C%25A8%25E6%25A0%2588%25E4%25B8%25AD%25E5%2588%2586%25E9%2585%258D%25E5%2586%2585%25E5%25AD%2598%26go%3DSubmit%26qs%3Dn%26form%3DQBLH%26pq%3D%25E4%25BD%25BF%25E4%25B8%2580%25E4%25B8%25AA%25E7%25B1%25BB%25E7%259A%2584%25E5%25AE%259E%25E4%25BE%258B%2B%25E5%258F%25AA%25E8%2583%25BD%25E5%259C%25A8%25E5%25A0%2586%25E4%25B8%25AD%25E5%2588%2586%25E9%2585%258D%25E5%2586%2585%25E5%25AD%2598%2B%25E4%25B8%258D%25E8%2583%25BD%25E5%259C%25A8%25E6%25A0%2588%25E4%25B8%25AD%25E5%2588%2586%25E9%2585%258D%25E5%2586%2585%25E5%25AD%2598%26sc%3D0-0%26sp%3D-1%26sk%3D%26cvid%3D6EA44C28CA9B4D909AE1FB5551502CFC&ecd=1&psr=1920x1080&par=1920x1019&pis=-1x-1&ccd=24&cja=true&cmi=8&col=en-US&cdo=-1&tcn=1458977101&qn=9ac2bda4d15895db&tt=1458977100771.122.175.176" width="336" height="280" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="border-width: 0px; border-style: initial; vertical-align: bottom; margin: 0px;">
- #include<iostream>
- using namespace std;
- //只能在堆上分配内存
- class HeapOnly
- {
- public:
- HeapOnly()
- {
- cout<<"Construct."<<endl;
- }
- //pseudo dtor,注意为const,因为const也可能需要被销毁
- void destory() const
- {
- delete this;
- }
- //声明为private也是可以的,但阻碍了继承,并且即便声明为protected还是不能把它包含于对象,而使能用一个它的指针替代它
- protected:
- ~HeapOnly() //客户定义HeapOnly h;时由于稍后要调用dctor,不合法
- {
- }
- };
- //只能在栈上分配空间
- class StackOnly
- {
- public:
- StackOnly()
- {
- }
- ~StackOnly()
- {
- }
- private:
- //将new操作符私有化,在外面无法调用,因为new表达式总是调用operator new,声明为static,只为类服务,不为具体对象服务
- //注意还得把将delete与new置于同一访问层次,并且针对数组的new delete也最好一并定义为private
- static void* operator new(size_t size);
- static void operator delete(void *ptr);
- static void* operator new[] (size_t size);
- static void operator delete[] (void *ptr);
- };
- int main()
- {
- HeapOnly *hO=new HeapOnly();
- hO->destory();
- //HeapOnly he; //编译错误:HeapOnly::~HeapOnly”: 无法访问 private 成员(在“HeapOnly”类中声明),所以不能通过栈来分配这个对象的空间
- StackOnly so;
- //StackOnly *st=new StackOnly(); //StackOnly::operator new”: 无法访问 private 成员(在“StackOnly”类中声明)
- }