C++ 引用和指针 const与#define #define与内联函数

面试的时候总会有这样的问题,让你比较一下引用和指针,const与#define ,#define与内联函数 new delete与malloc free(这个已经写过了),接下来就看看比较结果。
引用和指针
引用其实是变量的另一个别名而已,它用的时候完全与之前的变量一模一样。
引用使用的时候是有规则的:
(1)引用创建时候必须初始化(指针可以在任何时候初始化)
(2)引用一旦创建就不能更改引用关系(指针还可以指向其他的对象)
(3)引用不能为NULL
另外,指针是会单独分配空间的,而引用不会单独分配空间,如果sizeof指针和引用的话就会看到区别,sizeof(指针)是系统分配给指针的内存是4个字节,而sizeof(引用)的话 是它所引用对象的大小,如果是int p[10];那么它的大小就是40。
两者可以作为函数的参数 void func(int &a);void func(int *a);都可以对a所指向或者引用的对象进行更改,但是两者是有区别的,&a完全没有复制的过程直接操作在指向的对象上面,而*a是将对象的指针复制给它,


const和#define 
(1)const常量有数据类型,而宏定义没有数据类型。编译器可以对前者进行类型安全检查。而对于后者指进行字符的替换(文本上的替换),没有类型安全检查,并且字符替换可能会产生意想不到的错误。
(2)有一些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试


#define和内联函数
内联函数和普通函数相比可以加快程序运行的速度,因为它不需要中断,相当于直接把函数执行的代码直接复制到代码段,而宏只是一个简单的替换,而且宏还有有可能出错,一会儿为大家举个例子。与宏相比,内联函数更加安全可靠,但是这是以消耗空间为代价的。如果函数代码量小可以,如果代码量大的话,就会复制过多的代码到代码区,导致过多的空间消耗,得不偿失。因此,内联函数经常用于多次被调用的短小函数,不能有for while switch等语句。
接下来是一个#define函数产生错误,而内联函数没问题的例子。
#define MAX(a,b) (a) > (b)?(a):(b)
result = MAX(i,j)+2;
由于#define 只是简单的文本替换,所以被预处理器理解为result = (a) > (b)?(a):(b) + 2;
因为加号的优先级高于三目运算符,所以先算b+2会先执行。这样就是错误的。只有#define MAX(a,b) ((a) > (b)?(a):(b))才可以。
另外,内联函数做成员函数是,如果在类内直接实现的默认为内联函数。也可以在类外显示声明为inline。

你可能感兴趣的:(C++)