C++只能在棧上或堆上創建對象

只能在堆上創建對象

方法一:構造函數私有化

  1. 將類的構造函數私有,拷貝構造聲明成私有。防止別人調用拷貝在棧上生成對象。
  2. 提供一個靜態的成員函數,在該靜態成員函數中完成堆對象的創建
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;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章