const和#define之间的区别,typedef和#define之间的区别

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

类中的const成员函数                                    

任何不会修改数据成员的函数都应该声明为const类型。为了体现封装性,通常不允许直接修改类对象的数据成员。若要修改类对象,应调用公有成员函数来完成。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。以下程序中,类stack的成员函数GetCount 仅用于计数,从逻辑上讲GetCount 应当为const 函数。编译器将指出GetCount 函数中的错误。

class Stack
{

public:
void Push(int elem);
int Pop(void);
int GetCount(void) const;   // const 成员函数
private:
int m_num;
int m_data[100];

};

int Stack::GetCount(void) const
{
  ++ m_num; // 编译错误,企图修改数据成员m_num
  Pop(); // 编译错误,企图调用非const 函数
  return m_num;
}

要声明一个const类型的类成员函数,只需要在成员函数参数列表后加上关键字const,在类体之外定义const成员函数时,还必须加上const关键字。

但是,如果数据成员是指针,则const成员函数并不能保证不修改指针指向的对象,编译器不会把这种修改检测为错误。

1)const成员函数可以访问非const对象的非const数据成员、const数据成员,也可以访问const对象内的所有数据成员;

2)非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不可以访问const对象的任意数据成员;

3)作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应心可能将该成员函数声明为const 成员函数。

 

#define和typedefine之间的区别

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 安全。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值