C++回顾之内联函数及新类型转换运算符

来源:互联网 发布:linux dhcp服务器设置 编辑:程序博客网 时间:2024/05/21 19:24

        内联函数的定义及作用

        内联函数的定义方式有两种,一是在类中直接定义,不需要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后面再说明。

0 0
原创粉丝点击