只能在堆上創建對象
方法一:構造函數私有化
- 將類的構造函數私有,拷貝構造聲明成私有。防止別人調用拷貝在棧上生成對象。
- 提供一個靜態的成員函數,在該靜態成員函數中完成堆對象的創建
class only_heap1
{
public:
static only_heap1* create(int k) //有參
{
return new only_heap1(k);
}
static only_heap1* create() //無參
{
return new only_heap1;
}
~only_heap1(){}
private:
only_heap1(){}
only_heap1(int k)
: _k(k)
{}
only_heap1(const only_heap1& a) = delete; //C++11寫法
//也可以直接將拷貝構造函數私有化,不實現也可
//only_heap1(const only_heap1& a);
private:
int _k;
};
方法二:將析構函數私有化。
注意:此時可以用new創建對象,但使用delete的時候會失敗,因爲不能直接使用delete
class only_heap2
{
public:
only_heap2(int n)
: _n(n)
{}
private:
~only_heap2(){}
private:
int _n;
};
當創建對象時會報錯:
原因:對象建立在棧上面時,是由編譯器分配空間的,調用構造函數來構造棧對象,當對象使用完之後,編譯器會調用析構函數來釋放棧對象所佔的空間,編譯器管理了對象的整個生命週期,編譯器爲對象分配空間的時候,只要是非靜態的函數都會檢查,包括析構函數,但是此時析構函數不可訪問,編譯器無法調用類的析構函數來釋放內存,那麼編譯器將無法在棧上爲對象分配內存。
只能在棧上創建對象
方法一:構造函數私有化。(與上面類似)
class only_stack1
{
public:
static only_stack1 create() //無參
{
return only_stack1;
}
static only_stack1 create(int n) //帶參
{
return only_stack1(n);
}
private:
only_stack1(){}
only_stack1(int n)
: _n(n)
{}
private:
int _n;
};
方法二:將new的功能屏蔽掉即可(注意:屏蔽了operator new,實際也將定位new屏蔽掉。)
class only_stack
{
public:
only_stack(){}
only_stack(int n)
: _n(n)
{}
void* operator new(size_t size) = delete;
void operator delete(void* v) = delete;
private:
int _n;
};