define 和const的联系与区别
(编译阶段、安全性、内存占用等)
联系:它们都是定义常量的一种方法。
区别:
• define定义的常量没有类型,只是进行了简单的替换,可能会有多个拷贝,占用的内存空间大;const定义的常量是有类型的,存放在静态存储区,只有一个拷贝,占用的内存空间小。
• define定义的常量是在预编译阶段进行替换,而const在编译阶段确定它的值。
• define不会进行类型安全检查,而const会进行类型安全检查,安全性更高。
• const可以定义函数而define不可以。
typedef 和 define 有什么区别
- 用法不同:typedef 用来定义一种数据类型的别名,增强程序的可读性。define 主要用来定义常量,以及书写复杂使用频繁的宏;
- 执行时间不同:define 是宏定义,是预编译的部分,其发生在编译之前,只是简单的进行字符串的替换,不进行类型的检查。typedef 是编译阶段的一部分,有类型检查的功能。( const 也是在编译阶段 )
- 作用域不同:typedef 有作用域限定。define 不受作用域约束(因为在预编译阶段已经进行),只要是在 define 声明后的引用都是正确的。
- 对指针的操作不同:typedef 和 define 定义的指针时有很大的区别。
注意:typedef 定义是语句,因为句尾要加上分号。而 define 不是语句,千万不能在句尾加分号。
#define INTPTR1 int*
typedef int* INTPTR2;
在C++中const的用法(定义,用途)
const 用来定义一个只读的变量或对象。
主要优点:
便于类型检查、同宏定义一样可以方便地进行参数的修改和调整、节省空间,避免不必要的内存分配、可为函数重载提供参考。
说明:
const 修饰函数形参,是一种编程规范的要求,便于阅读,一看即知这个参数不能被改变,实现时不易出错。 const修饰成员函数不可修改成员变量。
• const修饰类的成员变量时,表示常量不能被修改,只读。
• const修饰类的成员函数,表示该函数不会修改类中的数据成员,不会调用其他非const的成员函数。
【注】const_cast: 用于去除const常量属性,使其可以修改 ,也就是说,原本定义为const的变量在定义后就不能进行修改的,但是使用const_cast操作之后,可以通过这个指针或变量进行修改; 另外还有volatile属性的转换。