const的用法 part 1

  • 1584
  • 0
  • c++
  • 2010-06-30

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();