美文网首页
GeekBand Week3 笔记

GeekBand Week3 笔记

作者: kaka2013 | 来源:发表于2016-08-07 23:00 被阅读0次

    一、转换函数

    用转换构造函数可以将一个指定类型的数据转换为类的对象。但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成double类型数据)。

    C++提供类型转换函数(type conversion function)来解决这个问题。类型转换函数的作用是将一个类的对象转换成另一类型的数据。

    函数返回double型变量real的值。它的作用是将一个Complex类对象转换为一个double型数据,其值是Complex类中的数据成员real的值。请注意,函数名是operator double,这点是和运算符重载时的规律一致的(在定义运算符“+”的重载函数时,函数名是operator +)。

    类型转换函数的一般形式为:

    operator 类型名( )

    {

    实现转换的语句

    }

    在函数名前面不能指定函数类型,函数没有参数。其返回值的类型是由函数名中指定的类型名来确定的。类型转换函数只能作为成员函数,因为转换的主体是本类的对象。不能作为友元函数或普通函数。

    从函数形式可以看到,它与运算符重载函数相似,都是用关键字operator开头,只是被重载的是类型名。double类型经过重载后,除了原有的含义外,还获得新的含义(将一个Complex类对象转换为double类型数据,并指定了转换方法)。这样,编译系统不仅能识别原有的double型数据,而且还会把Complex类对象作为double型数据处理。

    那么程序中的Complex类对具有双重身份,既是Complex类对象,又可作为double类型数据。Complex类对象只有在需要时才进行转换,要根据表达式的上下文来决定。转换构造函数和类型转换运算符有一个共同的功能:当需要的时候,编译系统会自动调用这些函数,建立一个无名的临时对象(或临时变量)。

    二、智能指针

    智能指针最基本的概念是引用计数,也就是智能指针内部有一个计数器,记录了当前内存资源到底有多少指针在引用(可以访问这个资源),当新增加一个可以访问这个资源的引用时,计数器会加1,反之会减去1,当计数器为0时,智能指针会自动释放他所管理的资源。手动申请,自动释放,就是其智能的体现。

    例如:

    int main()

    {

    { // 局部作用域

    // 引用计数:1,也就是只有一个指针p引用(访问)这块int内存

    shared_ptr p(new int);

    {

    // 引用计数:2,指针p和copy两个指针可以访问这块内存

    shared_ptr copy = p;

    }

    // 引用计数:1,超出copy的作用域,只有p可以访问这块内存

    } // 引用计数:0,超出p的作用域,没有指针可以访问这块内存, 资源被自动释放

    return 0;

    }

    三、模板

    模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。

    模板是一种对类型进行参数化的工具;

    通常有两种形式:函数模板类模板

    函数模板针对仅参数类型不同的函数

    类模板针对仅数据成员成员函数类型不同的类。

    使用模板的目的就是能够让程序员编写与类型无关的代码。比如编写了一个交换两个整型int 类型的swap函数,这个函数就只能实现int型,对double,字符这些类型无法实现,要实现这些类型的交换就要重新编写另一个swap函数。使用模板的目的就是要让这程序的实现与类型无关,比如一个swap模板函数,即可以实现int型,又可以实现double型的交换。模板可以应用于函数和类。下面分别介绍。

    注意:模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。

    四. 函数模板

    就像一般的重载函数一样,重新定义一个完整的非模板函数,它所带的参数可以随意。C++中,函数模板与同名的非模板函数重载时,应遵循下列调用原则:

    • 寻找一个参数完全匹配的函数,若找到就调用它。若参数完全匹配的函数多于一个,则这个调用是一个错误的调用。

    • 寻找一个函数模板,若找到就将其实例化生成一个匹配的模板函数并调用它。

    • 若上面两条都失败,则使用函数重载的方法,通过类型转换产生参数匹配,若找到就调用它。

    •上面三条都失败,还没有找都匹配的函数,则这个调用是一个错误的调用。

    相关文章

      网友评论

          本文标题:GeekBand Week3 笔记

          本文链接:https://www.haomeiwen.com/subject/shglsttx.html