程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 賦值操作符和拷貝構造函數,賦值操作符構造函數

賦值操作符和拷貝構造函數,賦值操作符構造函數

編輯:C++入門知識

賦值操作符和拷貝構造函數,賦值操作符構造函數


最近開發一個項目,用到了單例模式,頭文件大概如下

class CRecGuard
{
public:
CRecGuard(){::InitializeCriticalSection(&cs);Guard();}
~CRecGuard(){UnGuard();::DeleteCriticalSection(&cs);}

private:
void Guard(){::EnterCriticalSection(&cs);}
void UnGuard(){::LeaveCriticalSection(&cs);}

private:
CRITICAL_SECTION cs;
};

template <class T>
class CSingleton
{
public:
static inline T* instance();

private:
CSingleton(){}                   //禁止構造函數
~CSingleton(){}                 //禁止虛構函數
CSingleton(const CSingleton&){}           //禁止復制構造函數
CSingleton & operator= (const CSingleton &){} //禁止賦值拷貝函數

static CRecGuard _gd;
static auto_ptr<T> _instance;
};

template <class T>
auto_ptr<T> CSingleton<T>::_instance;

template <class T>
CRecGuard CSingleton<T>::_gd;

template <class T>
inline T* CSingleton<T>::instance()
{
if(0 == _instance.get())
{
CRecGuard _gd;
if(0 == _instance.get())
{
_instance.reset(new T);
}
}
return _instance.get();
}

其它的東西都比較好理解,就是“禁止復制構造函數”和“禁止賦值拷貝函數”這兩個東西,因為這個東西在之前寫代碼中沒怎麼用到,於是就是百度一下,於是了解到了“復制構造函數”和“賦值拷貝函數”,賦值拷貝函數和復制構造函數都是用已存在的B對象來創建另一個對象A。不同之處在於:賦值運算符處理兩個已有對象,即賦值前B應該是存在的;復制構造函數是生成一個全新的對象,即調用復制構造函數之前A不存在。 

CTemp a(b); //復制構造函數,C++風格的初始化
CTemp a=b; //仍然是復制構造函數,不過這種風格只是為了與C兼容,與上面的效果一樣 
在這之前a不存在,或者說還未構造好。

CTemp a; 
a=b; //賦值拷貝函數 
在這之前a已經通過默認構造函數構造完成。

知道這兩個東西的意思以後,上面的代碼就很好理解了,這兩個函數後面的{}部分都是空的,這樣就起到了禁止的作用。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved