C++類的預設成員函式
C++類有六個預設的成員函式,分別是建構函式、解構函式、拷貝建構函式、賦值運算子過載函式、&運算子過載函式、const &運算子過載函式。
下面分別說明:
定義一個class CTestClass{};類。
1、建構函式
類例項化時執行的函式。
CTestClass();
2、解構函式
類釋放時執行的函式。
~CTestClass();
3、拷貝建構函式
CTestClass(const CTestClass& cls);
預設的拷貝建構函式執行的是淺拷貝,即對成員變數直接按值拷貝(若成員變數不存在指標或申請動態記憶體的情況下深淺拷貝沒有區別)。拷貝建構函式傳遞引數為const是為了防止函式引數傳值時複製拷貝(執行拷貝建構函式),因為本身已經是拷貝建構函式,若傳遞引數再執行拷貝建構函式則會陷入死迴圈。
4、賦值運算子過載函式
CTestClassExt& operator=(const CTestClassExt& cls);
5、&運算子過載函式
CTestClassExt* operator&();
6、const &運算子過載函式
const CTestClassExt* operator&()const;
測試程式碼:
定義了兩個類,CTestClass和CTestClassExt。CTestClassExt對預設的成員函式做了修改。
CTestClass定義:
class CTestClass
{
public:
CTestClass();
~CTestClass();
public:
int m_iValue;
};
CTestClass::CTestClass()
{
}
CTestClass::~CTestClass()
{
}
CTestClassExt定義:
class CTestClassExt
{
public:
CTestClassExt();
CTestClassExt(const CTestClassExt& cls);
virtual ~CTestClassExt();
CTestClassExt& operator =(const CTestClassExt& cls)
{
m_iValue = cls.m_iValue + 2;
return *this;
}
CTestClassExt* operator&()
{
m_iValue+=3;
return this;
}
const CTestClassExt* operator&()const
{
//m_iValue+=4;//const函式無法修改成員變數的值
return this;
}
public:
int m_iValue;
};
CTestClassExt::CTestClassExt()
{
m_iValue = 10;
}
CTestClassExt::CTestClassExt(const CTestClassExt& cls)
{
m_iValue = cls.m_iValue + 1;
}
CTestClassExt::~CTestClassExt()
{
}
main函式測試程式碼:
int main(int argc, char* argv[])
{
CTestClassExt cls_ext;
CTestClass cls;
printf("cls.m_iValue = %d\r\n", cls.m_iValue);//未初始化的值
printf("cls_ext.m_iValue = %d\r\n", cls_ext.m_iValue);//建構函式中初始化
cls.m_iValue = 0;
CTestClassExt cls_ext2(cls_ext);//拷貝建構函式
printf("cls_ext.m_iValue = %d\r\n", cls_ext.m_iValue);//建構函式中初始化
printf("cls_ext2.m_iValue = %d\r\n", cls_ext2.m_iValue);//通過拷貝建構函式初始化,拷貝建構函式中對值+1
CTestClassExt cls_ext3 = cls_ext;//這種風格執行拷貝建構函式
printf("cls_ext.m_iValue = %d\r\n", cls_ext.m_iValue);//建構函式中初始化
printf("cls_ext3.m_iValue = %d\r\n", cls_ext3.m_iValue);
cls_ext3 = cls_ext;//通過=號操作符初始化
printf("cls_ext.m_iValue = %d\r\n", cls_ext.m_iValue);//建構函式中初始化
printf("cls_ext3.m_iValue = %d\r\n", cls_ext3.m_iValue);//通過=號操作符初始化,拷貝建構函式中對值+2
//&
printf("&cls_ext = %d\r\n", &cls_ext);
printf("cls_ext.m_iValue = %d\r\n", cls_ext.m_iValue);//&的左值運算+3
cls_ext.m_iValue = 10;
//const &由於預設的函式定義為const函式,因此不能修改變數,無法測試驗證。
return 0;
}