类的特殊定义&&定位new表达式

定位new表达式

  • 定义
    定位new表达式是在已分配的原始内存空间中调用构造函数初始化一个对象
new (place_address) type 
new (place_address) type(initializer-list) 

place_address必须是一个指针,initializer-list是类型的初始化列表
- 调用
定位new表达式实际调用:

T * ptr1 = allocator<T>.allocate(1);//从池对象中申请对象对应的空间, T为对象类型 
new(ptr1)T;//显式调用T类型的构造函数进行初始化
  • 使用场景

多用于对象池化处理。最常见的就是内存池技术。

对象池化:将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用,从而在一定程度上减少频繁创建对象所造成的开销。用于充当保存对象的“容器”的对象,被称为“对象池”(Object Pool,或简称Pool

请设计一个类,该类只能在堆上创建对象

将类的构造函数声明为private,但是为了创建该类的对象,则必须提供创建对象和释放对象的接口, 用static函数成员实现

#include <iostream>
using namespace std;
class HeapOnly    
{     
public:         
    static HeapOnly *CreateInstance()      
    {            
        HeapOnly * obj=new HeapOnly;            
        obj->m=2;            
        return obj;        
    }        
    static void DeleteInstance(HeapOnly * obj)      
    {            
        if(obj!=NULL)                
        delete obj;        
    }  
private:        
    HeapOnly(){};        
    ~HeapOnly(){};   
public:      
    int m;  
};    

int main()    
{        
    HeapOnly *obj=HeapOnly::CreateInstance();        
    cout<<obj->m<<endl;        
    HeapOnly::DeleteInstance(obj);        
    return 0;    
} 

请设计一个类,该类只能在栈上创建对象

思路:在堆上创建对象要用到new,为了在类外不能使用new,delete,把new,delete重载为私有

#include <iostream>    
using namespace std;    

class   StackOnly    
{    
public:        
    StackOnly()     
    {           
        cout <<   "constructor."  <<   endl;      
    }        
    ~StackOnly()      
    {          
        cout << "destructor." <<   endl;         
    }    
private:        
    void*   operator   new(size_t size);        
    void*   operator   delete(void * ptr); 
};    

int main() 
{        
    StackOnly s;    
    //StackOnly   *p   =   new   StackOnly; 
    // error     
    return   0;    
} 

请设计一个类,该类只能创建一个对象

思路:类实例化对象时,需要检查是否已经存在同类对象,所以需要静态成员变量;另外还要提供对外的全局访问 方式,所以需要静态方法来创建与销毁该实例对象。

#include <iostream>  
using namespace std;

class singleton 
{ 
public:    
    static singleton* getpsin()    
    {        
        if(psin == NULL)        
        {            
            psin = new singleton();        
        }        
        return psin;    
    }    
    static void relice()    
    {        
        if(psin != NULL)        
        {            
            delete psin;        
        }       
        psin = NULL;    
    } 
private:    
    singleton()    
    {        
        cout<<"+++++"<<endl;    
    }    
    static singleton* psin; 
};

singleton* singleton::psin = NULL; 
int main() 
{    
    singleton* p = singleton::getpsin();    
    return 0;   
} 

猜你喜欢

转载自blog.csdn.net/sifanchao/article/details/81427616