#define、const 的区别 const int、const int *、int *const、const int *const、const int &的用法

一、#define和const的区别

(1)就起作用的阶段而言: #define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用。
(2)就起作用的方式而言: #define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。 
(3)就存储方式而言:#define只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存中有若干个备份;const定义的只读变量在程序运行过程中只有一份备份。
(4)从代码调试的方便程度而言: const常量可以进行调试的,define是不能进行调试的,因为在预编译阶段就已经替换掉了。

二、const的优点

 (1)const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型 安全检查,并且在字符替换可能会产生意料不到的错误。
(2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
(3)const可节省空间,避免不必要的内存分配,提高效率

三、const int、const int *、int *const、const int *const、const int &的用法

(1)const int   ①在定义变量的时候必须初始化,否则报错 ② 定义后的变量只能读,不能重新赋值。  顶层 const

	/*(1) const int */
	const int i = 0; //const int i = 0;这时候的i只能读,不能赋值了 
	//i = 9;                          
	printf("i==%d\n", i);

(2)const int *  p   这里const 修饰的是int,而int定义的是一个整值,所以这里 p为指向常量的指针

    指向常量的指针变量,只能改变指向,不能改变指向的内容。 非顶层const

	/*(2)const char *p */
	const char *p = "HelloWord!";
	//p[3] = '1';                      //指针型 const char *p = "HelloWord!";  指向的内容不能更改,但可以更改指向。 
	p = "chenhui";
	printf("%s\n", p);

	/*(3) int *k 和const int *k的区别*/
	int *k = new int[3];
	for (int i = 0; i < 3; i++)
		k[i] = i;
	std::cout << k[0] << " " << k[1] << " " << k[2] << std::endl;

	const int *t = new int[3];
	//for (int i = 0;i<3;i++)                            // const int *t  指向的内容不能更改。 
	//t[i] = i;
	cout << t[0] << " " << t[1] << " " << t[2] << endl;    // 但是可以访问; 可以删除内存 delete []t;   
	delete[]t;
	delete[]k;
	t = nullptr;
	k = nullptr;

因为delete只是告诉系统,现在t所指向的这块内存已还给自由存储区,不再被使用,可以被其他程序改写。而此时t依旧指向这块不可使用的内存,故需要对p进行清零。 

(3) int *const  a  这里const修饰的是 a ,a代表的是一个指针地址,a就是常量指针

     常量指针,和上面相反,只能改变指向的内容,不能改变指向。顶层const

// int *const 和 const int * 两个恰恰相反,int *const,可以更改指向的内容,但不是更改指向;
	int *const tt = new int[3];
	int *pp = new int[3];
	for (int i = 0; i<3; i++)
		tt[i] = i;
	cout << tt[0] << " " << tt[1] << " " << tt[2] << endl;  //可以更改指向的内容
	//int a[3]{ 1,2,3 };
	int *a = new int[3]{ 1,2,3 };    // 和上一行相同。
	//tt = a;                       // 但不是更改指向
	pp = a;
	cout << pp[0] << " " << pp[1] << " " << pp[2] << endl;

(4)const int *const    既不能改变指向,又不能改变指向的内容。   第一个const为非顶层,第二为顶层

/*const int *const 既不能改变指向的内容,又不能改变指向。*/
	const char *const p = "I am Chenhui!";
	//p[0] = 'y';            // 既不能改变指向的内容。
	//p = "123";             // 又不能改变指向;
	cout << p << endl;

 总结:顶层const:不可以改变指向,但是可以改变指向的内容的值。 非顶层cosnt:可以改变指向,但是不可以改变指向的内容。

(5)const int &           

在引用前面加上const,代表该引用为常引用,即被引用的对象不可改变。若是在形参中使用,则不可达到在函数里面修改变量值的目的。

int add(const int &k1, int &k2)
{
	//k1 += 10;        // 定义为常引用不能改变。
	k2 += 10;
	return k1 + k2;
}

int main()
{
	int k1 = 4, k2 = 5;
	cout << add(k1, k2) << endl;
    return 0;
}

 

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