How to use "const". Part 1
這題材網路上已經有很多的資訊了
這邊主要是將這些整理一遍
方便自己以後查詢
畢竟const的用法只要一陣子沒用
就很容易搞混
#include "stdafx.h"
extern void AppPause();
class Parent
{
public:
Parent():_iCount(0){};
void Add()
{
::printf("%d\n", ++_iCount);
}
private:
int _iCount;
};
class SubA : public Parent
{
public:
SubA(){};
};
class SubB : public Parent
{
public:
SubB(){};
};
int _tmain(int argc, _TCHAR* argv[])
{
const Parent* pParent1 = new SubA();
pParent1 = new SubB(); // 這個是可編譯的,可是會造成 SubA的memory leak
pParent1->Add(); // 這個是不能編譯的,因為pParent的記憶體的內容不能變動
delete pParent1;
Parent const *pParent2 = new SubA();
pParent2 = new SubB(); // 這個是可編譯的,可是會造成 SubA的memory leak
pParent2->Add(); // 這個是不能編譯的,因為pParent的記憶體的內容不能變動
delete pParent2;
Parent* const pParent3 = new SubA();
pParent3 = new SubB(); // 這個是不能編譯的,因為pParent的記憶體位址不能被改變
pParent3->Add(); // 這個是可編譯的
delete pParent3;
const Parent* const pParent4 = new SubA();
pParent4 = new SubB(); // 這個是不能編譯的,因為pParent的記憶體位址不能被改變
pParent4->Add(); // 這個是不能編譯的,因為pParent的記憶體的內容不能變動
delete pParent4;
const Parent const *pParent5 = new SubA();
pParent5 = new SubB(); // 這個是可編譯的,可是會造成 SubA的memory leak
pParent5->Add(); // 這個是不能編譯的,因為pParent的記憶體的內容不能變動
delete pParent5;
AppPause();
return 0;
}
void AppPause()
{
// 不要理我, 我只是讓程式暫停的迴圈=..=a
char cPause;
do
{
cPause = getchar();
if(cPause == EOF)
break;
} while(cPause != '\n');
}
在下面這邊做個總結
記憶體的位置可以變動,但是記憶體的內容不能變動
const Parent* pParent1 = new SubA();
記憶體的位置可以變動,但是記憶體的內容不能變動
Parent const *pParent2 = new SubA();
記憶體的內容可以變動,但是記憶體的位址不能變動
Parent* const pParent3 = new SubA();
記憶體的位址與內容都不能變動
const Parent* const pParent4 = new SubA();
記憶體的位置可以變動,但是記憶體的內容不能變動
const Parent const *pParent5 = new SubA();