C++两种方式创建对象

来源:互联网 发布:新浪微博数据 编辑:程序博客网 时间:2024/05/23 14:01
 

C++两种方式创建对象(new和申明)

分类: C/C++/VC 281人阅读 评论(0) 收藏 举报

环境:VS2010

问题:

1.如何让一个类的对象只能够在堆上创建(即使用new创建,如:T *p=new T;), 而不能在栈上创建(即直接申明方式,如:T t;);

2.如何让一个类的对象只能够在栈上创建(即直接申明方式,如:T t;),而不能在堆上创建(即使用new方式,如:T *p=new T;);

解决:

1.只能使用new创建,而不能使用申明明方式,只需要把类T的析构函数设为私有即可

2.只能使用申明方式,而不能使用new新建,只需要把new和delete运算符设为私有,并重载这两个运算符

代码:(只给出头文件和主函数)

问题1:

[cpp] view plaincopy
  1. #include <iostream>  
  2.   
  3.    
  4.   
  5. using namespace std;  
  6.   
  7.    
  8.   
  9. #ifndef HEAD_H  
  10.   
  11. #define HEAD_H  
  12.   
  13. class T{  
  14.   
  15. public:  
  16.   
  17.         void*operator new(size_t s){  
  18.   
  19.         void*p = new char[s];  
  20.   
  21.         cout<<"调用函数new(size_t s)分配空间,空间为"<<s<<endl;  
  22.   
  23.         returnp;  
  24.   
  25. }  
  26.   
  27.    
  28.   
  29. void operator delete(void *p){  
  30.   
  31.         delete(p);  
  32.   
  33.         cout<<"调用函数delete(void *p)释放空间"<<endl;  
  34.   
  35. }  
  36.   
  37. void Test();  
  38.   
  39. void Delete();  
  40.   
  41. T();  
  42.   
  43. <span style="color:#ff0000;">private:         
  44.   
  45.         ~T();  
  46.   
  47. </span>       int i;  
  48.   
  49. };  
  50.   
  51. #endif  
  52.   
  53.    
  54.   
  55. #include "head.h"  
  56.   
  57. #include <iostream>  
  58.   
  59.    
  60.   
  61. using namespace std;  
  62.   
  63.    
  64.   
  65. int main(void){  
  66.   
  67.    
  68.   
  69.        <span style="color:#ff0000;"> T*t1;  
  70.   
  71.         t1= new T;  
  72. </span>  
  73.         t1->Test();  
  74.   
  75.         t1->Delete();  
  76.   
  77.    
  78.   
  79.         return0;  
  80.   
  81. }  

 

 

注意:这里要写一个成员函数对new的对象进行delete

问题2:

[cpp] view plaincopy
  1. #include <iostream>  
  2.   
  3.    
  4.   
  5. using namespace std;  
  6.   
  7.    
  8.   
  9. #ifndef HEAD_H  
  10.   
  11. #define HEAD_H  
  12.   
  13. class T{  
  14.   
  15. public:  
  16.   
  17.         T();  
  18.   
  19.         ~T();  
  20.   
  21.         voidTest();  
  22.   
  23.           
  24.   
  25. <span style="color:#ff0000;">private:  
  26.   
  27. void *operatornew(size_t s){  
  28.   
  29.         void *p = new char[s];  
  30.   
  31.         cout<<"调用函数new(size_t s)分配空间,空间为"<<s<<endl;  
  32.   
  33.         return p;  
  34.   
  35. }  
  36.   
  37. void operatordelete(void *p){  
  38.   
  39.         delete (p);  
  40.   
  41.         cout<<"调用函数delete(void *p)释放空间"<<endl;  
  42.   
  43. }         
  44.   
  45. </span>int i;  
  46.   
  47. };  
  48.   
  49. #endif  
  50.   
  51.    
  52.   
  53. #include "head.h"  
  54.   
  55. #include <iostream>  
  56.   
  57.    
  58.   
  59. using namespace std;  
  60.   
  61.    
  62.   
  63. int main(void){  
  64.   
  65.    
  66.   
  67.         <span style="color:#ff0000;">Tt;  
  68. </span>  
  69.         t.Test();  
  70.   
  71.    
  72.   
  73.         return0;  
  74.   
  75. }