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;
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值