const define typedef.txt

const和#define之间的区别
const推出的目的是为了取代预编译指令,消除它的缺点,同时继承它的优点。
(1)编译器处理的方式不同。
  define是在预处理阶段展开;
  const是在编译运行阶段展开,在编译的时候确定其值;
(2)类型和安全检查不同。
  define没有类型,不进行类型检查,也不进行安全检查,这样在进行替换的时候有可能发生意想不到的错误;
  const常量有具体的类型,在编译阶段会进行类型检查;
(3)存储方式不同。
  define只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存中有若干个备份;
  const定义的只读变量在程序运行过程中只有一份备份,所以const可以节省空间,避免不必要的内存分配,同时提高效率。例如:
#define M 3
const int N=5;   //此时并未将N放入内存中
int i=N;        //此时为N分配内存,以后不再分配
int I=M;       //预编译阶段进行替换,分配内存
int j=N;       //没有分配内存
int J=M;       //再进行宏替换,又一次分配内存
(4)效率不同。
编译器通常不为普通const变量分配内存空间,而是将它们保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作,因而效率更高。
另外需要说明的是在定义const变量的同时必须进行初始化,且值不可改变,但是可以通过指针改变内存中的值,但是在这之前定义的值的值没有被改变。因为经过编译器优化,i的值不是每次使用都在内存中读取,而是见到i编译器就自动赋值为最初的0。例如:
const int i=0;
i=1;     //报错
但是下面的程序可以正常运行:
const int i=0;
int *j=(int *)&I;
*j=1;
cout<<i<<j<<endl;    //输出结果为0  1
1)const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内的所有数据成员;
2)非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不可以访问const对象的任意数据成员;
3)作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应心可能将该成员函数声明为const 成员函数。
 
#define和typedef、之间的区别
typedef char *String_t 定义了一个新的类型别名,有类型检查。而#define String_dchar * 只是做了个简单的替换,无类型检查,前者在编译的时候处理,后者在预编译的时候处理。
同时定义多个变量的时候有区别,主要区别在于这种使用方式String_t a,b;String_d c,d; a,b ,c 都是char*类型,而d 为char 类型
由于typedef 还要做类型检查,#define 没有。所以typedef 比#define 安全。
#define Add(a,b) a+b;
M = i*Add(a,b)*B     本意是 (a+b)*i*b 但实际 i*a+b*B
#define pin (int*);
pin a,b;
本意是a和b都是int型指针,但是实际上变成int* a,b;
a是int型指针,而b是int型变量。
这时应该使用typedef来代替define,这样a和b就都是int型指针了。

猜你喜欢

转载自blog.csdn.net/weixin_40317531/article/details/80108382