C/C++中的const理解測試與const_cast

const的理解和測試---待補充,2019-6-29


知乎大神-const理解1

// ConsoleApplication4.cpp: 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#include "stdio.h"
#include "string.h"
using namespace std;

//以下程序說明const 修飾常規變量,類,對象,函數,成員函數,參數,返回值,引用等情況下的使用和說明


class _constTest
{

	//默認構造函數,拷貝構造函數,拷貝賦值函數
private:
	_constTest():m_iconstMenber2(0){}
	_constTest(int n) : m_iconstMenber2(n){}

	int m_iMember1;
	const int m_iconstMenber2;

protected:

public:

};

int main()
{

	//unsigned int a = 100;
	//int aa = 102;
	//unsigned  int const b = aa;
	//a = b;


/*const 修飾常規變量,*/
	//iPtr
	const int b = 100;
	//b = 101;//不允許通過b變量來修改數值,b變量的數據類型也不能變
	//b = (unsigned int)102;

	char icd = 0;
	char * iPtr = &icd;
	*iPtr = 100;
	iPtr = NULL;


	/*底層const,指針指向的對象不能變,規律:const在*的左邊*******************************************************************/
	char const * iPtr1 = NULL;//OK:const修飾iPtr指向的對象(內容)不可修改
	iPtr1 = &icd;
	icd = 101;
	//*iPtr = 101;//ERR:iPtr指針指向的對象(內容)不可通過iPtr修改,
	
	
	const char * iPtr2 = &icd;
	//*iPtr2 = 102;//ERR:iPtr指針指向的對象(內容)不可通過iPtr修改,
	iPtr2 = NULL;//ERR:說明指針是可以修改的
	icd = 102;//
	//iPtr1 = (const unsigned char *)iPtr1;


	const char const * iPtr5 = &icd;//其實這裏兩個const是重複的,只需要一個就可以了的
	iPtr5 = NULL;
	//*iPtr5 = 105;







	/*頂層const,指針不能變,規律:const在*的右邊*******************************************************************/
	char * const iPtr3 = &icd;
	//iPtr3 = NULL;//ERR:const 修飾的是int* 的指針iPtr1,就是這個指針變量的值不能變,就是iPtr1指向的地址不能變
	*iPtr3 = 103;
	icd = 103;






	/*指針不能變,指針指向的對象也不能變,規律:* 左右都有const********************************************/
	char const * const iPtr4 = &icd;
	//iPtr4 = NULL;
	//*iPtr4 = 103;


	const char * const iPtr6 = &icd;
	//iPtr6 = NULL;
	//*iPtr6 = 106;


	//char * const const iPtr7 = &icd;
	//iPtr6 = NULL;
	//*iPtr6 = 106;

	//const * char str14[10] = 100;


/*二級指針的const實例說明*/
	//這是一個二級指針,一級指針
	const int strLen = 4;
	char const strArray[strLen][10] = {"aaa","bbbb","cc66666cc", "ddddddd"};
	//const char strArray[4][10] = {"aaa","bbbb","ccccc", "ddddddd"};//和上面一行是一樣的

	//二位指針初始化,兩級指針都要分別new空間
	char **cPtr = new char *[strLen];
	for (int i = 0; i < strLen; i++)
	{
		cPtr[i] = new char[10];
		strcpy_s(cPtr[i], strlen(strArray[i]) + 1, strArray[i]);
		printf("cPtr[%d] 地址 = %p, cPtr[%d] = %s \n", i, cPtr[i], i, cPtr[i]);	
	}
	for (int i = 0; i < strLen; i++)
	{
		delete cPtr[i];
		cPtr[i] = NULL;
	}

	delete cPtr;
	cPtr = NULL;


	const char * iPPtr[4] = {NULL};//首先是一個數組,數組裏面存放char *的指針,初始化爲NULL,
	const char * const iPPtr1[4] = { "AAA", "BBBB", "CCCCC", "DDDDDD" };

	for (int i = 0; i < 4; i++)
	{
		iPPtr[i] = strArray[i];
		printf("i = %d, iPPtr = %s \n", i, iPPtr[i]);
		//strArray[i] = iPPtr1[i];
		//strArray = NULL;
	}



	const char * const * iPtr8 = iPPtr;
	iPtr8 = iPPtr1;



	const char * const * const iPtr9 = iPPtr;
	//iPtr9 = iPPtr1;

	const char ** const iPtr10 = iPPtr;
	//iPtr10 = iPPtr1;


	//char * const * const iPtr11 = iPPtr;
	//iPtr11 = iPPtr1;
	//*iPtr11 = NULL;
	

	getchar();
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章