const、#define、typedef和inline的区别

时间:2021-09-09 15:02:37
      一些小知识,怕忘记所以就记下来!方便以后复习之用,也希望可以帮到同行!
      首先来说一下 const的作用吧!
      在c中:
      主要作用:用来修饰变量,表示该变量是只读变量,不是常量。
     如const int  pi=3.14;
     表示pi是一个只读变量,表面是不能改变!!
     为什么是表面上呢,,因为C语言中有指针:
     可以通过指针来改变:
      int *p= π
     *p=123; //这是可以的;
     还可以通过scanf("%d",&pi)
;//这也可以改变他的值!
     所以说是表面上的不变!!!!不可被const迷惑了!
      在C++ 中:
     类中用const修饰的函数为常函数,常量函数只能输出,不能修改类中成员变量的值;
     对象前有const为常量对象,常量对象只能调用常量函数,否则就可以修改成员变量的值;
     非常量对象可以调用常量函数;
     一、const与#define的区别:
     1.const修饰的是变量,不能直接引用内存空间,不能通过名字对空间进行写操作,但是可以读和取操作;而宏定义就是单纯的替换,没有内存空间;
     2,宏的数据没有任何数据类型只是单纯的替换;但是const修饰的变量有数据类型;
     注意:
     二、const和别名typedef的区别;
     替换就是:钱替换面包,不是原来的东西了,但是别名指的都是同一样东西,只是叫法不一样,指向的空间一样,就像一个人的名字可以有中文名和外国名!
     有#开头的都不用;结尾
     1、typedef:定义别名,是彻底的封装,不容改变;
          #define 宏文本替换;
    2、#define可以用其他类型的说明符对宏类型名进行扩展;
         #define能这么做:#define INT int
         unsigned INT A; //这是可以的;
         BUT:
                  typedef int INT
                  unsigned INT A; //这是不可以的;
     3、typedef能保证类型说明符同一类型,但是#define不能保证;
     #define int* zhizheng;
     zhizheng a,b; =====int *a,int b;
     but:
     typedef  int* zhizheng;
     zhizheng a,b; =====int *a,int* b; //这是可以的;
      三、define与inline的区别
     1、为什么要使用宏呢?
          因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。
但是宏的缺点也十分明显?
举个例子:
<pre name="code" class="cpp">#define MAX(a) ((a)>(5)?(a):(5))
inline int MAX1(int a)
{
	return (a>5?a:5);
}
调用结果:
int num1=7;
int num2=7;
cout<<MAX(++num1)<<endl;  //9
cout<<MAX1(++num2)<<endl; //8

 因为宏是单纯的替换文本: 

((++num1)>(5)?(++num1):(5));//这里它违反了三目操作符的原意,改变了(++num1)>(5)成立时++num1的值;
但是在inline时就不存在这个问题,他可以进行参数检查,求出参数的值后再将此值带入函数中。
此式((a)>(5)?(a):(5))中的a都是一致的!

内联函数和宏很类似, 而本质区别在于: 宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。
     inline函数的好处:
    >获得宏带来的效率(宏没有函数调用带来的额外开销);

    >一般函数的所有可预料行为和类型安全性(type safety);

参考资料:http://blog.csdn.net/luoweifu/article/details/41630195