声明变量不分配空间,定义变量要分配空间。
声明主要是告诉编译器,后面的引用都按声明的格式.
定义其实包含了声明的意思,同时要分配内存空间.
定义是从无到有,声明是从有到使用。对于一个简单的单文件的 C 语言程序来说,定义和声明都是一回事。但是你可以参考“函数”的定义与声明,它们就往往是分开的。
#define定义的是符号常量,也可以叫做宏,而Const定义的可以说是冻结的变量。
它们主要的区别是:符号常量并不是变量,它只不过是在编译期间通过预编译命令进行一种“替换”,而Const常量是占有内存的被“冻结”了的变量,C++中使用const常量而不提倡用符号常量。
简单的说const用编译器,#define用预处理
用#define存在很多问题(类型检查,宏扩展错,维护性。。。),所以c++建议使用const代替#define
const是类型安全的,#define不是。
至少分不分内存,是不一定的,#define不分内存,因为它是预编译指令,编译前进行了宏替换。const常量一般不分空间,但如果取它的地址或引用,就会分配空间。
常见的const用法
const int i = 3; //定义常量
const char * a; //指向常量的指针
const char const * a; //指向常量的常量指针
char const * a; //常量指针
int f(const int & f); //const引用是最常见的传大对象的方法
int C::test(int a) const; //const表示test成员函数不改变C的成员变量的值
const int f(); //返回常量值
在C中,定义常量的方法是用编译预定义指令(#define).列如:
# define PI 3.1425926
这条指令的格式是#define 后面跟一个常量名再跟一串字符,中间用空格隔开。由于不是C++语句,所以行末不用分号。
尽管它具有常量的所有属性,但是,在编译预处理完成后,PI不属于C++程序中的名字了,所以它不是一个具有一定类型的常量名。随后的编译无法发现由它引起的数据类型误用的错误。
C++容许#define 定义常量是为了兼容C。在C++编程中,常量定义都用const,不用#define.