美文网首页
C++面向对象编程(下)第一周笔记 GeekBand

C++面向对象编程(下)第一周笔记 GeekBand

作者: CharlesW | 来源:发表于2016-06-06 09:01 被阅读0次

    转换函数

    转换函数是用户定义的强制类型转换,如果定义了从MyClass到int的转换函数,就可以使用下面的转换:

    MyClass a;

    int b = a;

    创建转换函数的形式:

    operator typeName();

    typeName指出了要转换成的类型,因此不需要返回值。转换函数是类方法意味着它需要通过类对象来调用,从而告知函数要转换的值。因此,函数不需要参数。

    注意三点:1 转换函数必须是类方法。2 转换函数不能返回指定类型。3 转换函数不能有参数。

    例子中,转换为int类型的类转换函数原型为:operator int();

    MyClass::operator int()

    {

    return ......;

    }

    explicit关键字

    class Fraction

    {

    public:

    explicit Fraction(int num, int den=1)

    : m_numerator(num), m_denominator(den)

    {  }

    operator double() const {

    return (double)m_numerator / m_denominator;

    }

    private:

    int m_numerator;    

    int m_denominator;  

    };

    例中构造函数声明中加入关键字explicit,如下

    explicit Fraction(int num, int den=1): m_numerator(num), m_denominator(den){  }

    那么

     Fraction f(3,5);

    Fraction d2 = f + 4;这条语句将不能通过编译。

    在大部分情况中,隐式转换却容易导致错误(不是语法错误,编译器不会报错)。隐式转换总是在我们没有察觉的情况下悄悄发生,除非有心所为,隐式转换常常是我们所不希望发生的。通过将构造函数声明为explicit(显式)的方式可以抑制隐式转换。也就是说,explicit构造函数必须显式调用。

    智能指针

    由于C++语言没有自动内存回收机制,每次new出来的内存都要手动delete。有时候忘记delete,或者流程太复杂,最终导致没有delete,或者由于异常导致程序过早退出而没有执行delete的情况并不罕见。用智能指针便可以有效缓解这类问题。

    STL中提供的auto_ptr、unique_ptr、shared_ptr,其中模板auto_ptr是C++98提供的解决方案,C+11已将将其摒弃,并提供了前面另外两种解决方案。然而,虽然auto_ptr被摒弃,但它已使用了好多年,同时,如果您的编译器不支持其他两种解决力案,auto_ptr将是唯一的选择。

    这三个智能指针模板都定义了类似指针的对象,可以将new获得的地址赋给这种对象。当智能指针过期时,其析构函数将使用delete来释放内存。因此,如果将new返回的地址赋给这些对象,将无需记住稍后释放这些内存:在智能指针过期时,这些内存将自动被释放。

    为什么摒弃auto_ptr而需要其他智能指针?

    先来看下面的赋值语句:

    auto_ptr<String>  ps  (new string("I reigned lonely as a cloud.”));

    auto_ptr<String> vocation;

    vocaticn = ps;

    上述赋值语句将完成什么工作呢?如果ps和vocation是常规指针,则两个指针将指向同一个string对象。这是不能接受的,因为程序将试图删除同一个对象两次——一次是ps过期时,另一次是vocation过期时。要避免这种问题,方法有多种:

    1.定义陚值运算符,使之执行深复制。这样两个指针将指向不同的对象,其中的一个对象是另一个对象的副本,缺点是浪费空间,所以智能指针都未采用此方案。

    2.建立所有权(ownership)概念。对于特定的对象,只能有一个智能指针可拥有,这样只有拥有对象的智能指针的构造函数会删除该对象。然后让赋值操作转让所有权。这就是用于auto_ptr和uniqiie_ptr 的策略,但unique_ptr的策略更严格。

    3.创建智能更高的指针,跟踪引用特定对象的智能指针数。这称为引用计数。例如,赋值时,计数将加1,而指针过期时,计数将减1。仅当最后一个指针过期时才调用delete。这是shared_ptr采用的策略。

    相关文章

      网友评论

          本文标题:C++面向对象编程(下)第一周笔记 GeekBand

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