内联函数的定义及作用
内联函数的定义方式有两种,一是在类中直接定义,不需要inline关键字;二是在类体外定义,但需要在函数前面增加inline关键字。内联函数的作用是什么?为什么要使用内联函数呢?原因其实很简单。大家都知道,函数在调用的时候,需要建立堆栈空间,保护现场,传递参数,控制程序转移等过程,这些工作都需要时间与空间的开销,如果一个函数,它的函数体的代码非常简短,只有少数几行,但是又需要被频繁的调用,这就意味着执行代码的时间远远小于调用函数时所消耗时间与空间,换句话来说,就是效率低。
它的解决办法其实很简单,就是不再使用函数,而是直接将代码嵌入到程序中,这样就不再有建立堆栈,保护现场之类的时空消耗了。虽然效率问题解决了,却是有副作用的,一是相同的代码需要重复的书写,浪费精力,如果需要调用的地方达数百个,则需要重复书写数百次。二是程序可读性没有使用函数好。
总而言之,使用函数,则效率低,不使用函数,则可读性差,这了协调好这两者的关系,inline内联函数在C++中就出现了,它的目的也是为了协调这二者之间的关系。
内联函数与带参数宏之间的区别?
(1)内联函数调用时,要求实参与形参进行类型的检查,类型必须一致,另外,内联函数会对实参表达式进行求值,然后传递给形参,而宏调用时只用实参简单的替换形参。
(2)内联函数是在编译的时候,在调用的地方将代码展开的,而宏则是在预处理时进行替换的。
C++中新的类型转换运算符有以下四种,主要说明前两种:
(1)const_cast<T>(expr)
(2)static_cast<T>(expr)
(3)reinterpret_cast<T>(expr)
(4)dynamic_cast<T>(expr)
const_cast类型转换的要点:
(1)这个类型转换运算符主要用来移除对象的常量属性
(2)const_cast一般用于指针或引用
(3)使用const_cast去除const限定的目的不是为了修改它的内容
(4) 使用const_cast去除const限定主要是为了函数能接受这个参数。
以下是const_cast的使用示例:
const int a = 100;
int n = const_cast<int>(a); //Error,const_cast一般用于引用或指针
int *p = &a; //Error, &a是const int *类型,无法将const int * --> int *,此时应该去掉常量属性。
int *p = const_cast<int *>(&a);
*p = 200; //但是a的值依旧是100,*p是在const_cast转换过程中产生的临时变量,改变的是临时变量的内容。
const int b = 200;
//int &ref = b; //Error,非const引用不能引用const对象
int &ref = const_cast<int &>(b); //去除const属性。
ref = 300;//操作的是临时变量的空间,并非真正b的值。因为b是常变量,其实是不能被改变的,所以才需要临时变量
void fun(int &val)
{
cout << val << endl;
}
int main()
{
const int val = 200;
//fun(val); //Error, 不能将const int 转为int &
fun(const_cast<int &>(val); //val产生一个临时对象,传递的是临时对象的引用。
}
static_cast转换要点:
(1)编译器隐式执行的任何类型都可以由static_cast转换完成。
(2)当较大的算术类型赋值给较小的类型时,可以用static_cast完成,如double->int, int-->char等。
(3) 可以将void *指针转换为某一类型的指针。
(4) 可以将基类指针转换为派生类指针。
int n = static_cast<int>(3.14);
cout << "n="<<n<<endl;
void *p = &n;
int *p2 = static_cast<int *>(p);//将void*指针转为某一类型的指针
reinterpret_cast与dynamic_cast后面再说明。