C++primer第四版第十四章第十五章

来源:互联网 发布:微信域名检测 php源码 编辑:程序博客网 时间:2024/06/01 07:13

Talk is cheap, show me the code.

  1. 重载操作符时需要区分有些重载函数适合放在类内部,有些重载函数不适合放在类内部。自增自减操作符,解引用操作符重载函数适合放在类内部,但是四则算数运算操作符,相等不等操作符,关系操作符和位操作符一般定义为普通非成员函数(需要用到类成员变量时,可以将重载函数设为类的友元函数)。

  2. 流重载操作符只能作为普通非成员函数,然后将重载函数置为类的友元函数。

  3. 如果重载自增自减操作符,要注意区分前缀自增自减和后缀自增自减的区别。

    前缀自增自减操作符重载:

    Object& operator++(){this->val++; return *this};

    后缀自增自减操作符重载,需要额外添加一个形参以区分前缀自增自减操作符,而且这里不能直接返回*this,这是后缀操作符的特点:

    Object operator++(int){Object obj(*this); obj.val++; return obj;};

  4. 保留字virtual的目的是启动动态绑定。virtual只能用在类内部声明方法时添加,不能在类外部定义方法时添加。C++的函数默认不使用动态绑定,要触发动态绑定,必须满足两个条件:第一,只有指定为虚函数的成员函数才能进行动态绑定,成员函数默认为非虚函数,非虚函数不适用动态绑定;第二,必须通过基类类型的引用或指针进行函数调用。当基类类型的引用或指针已经指向继承类时,如果要调用基类的方法,则必须使用域作用符。下面的例子中可以看到, 指向继承类的ptr调用没有加virtual 的show函数结果还是调用的基类的show方法,加了virtual之后才会动态绑定到继承类的方法,这点要尤其注意。另外带有默认实参的动态绑定需要注意,虽然调用的是继承类的方法,但是默认实参使用的还是基类的默认实参,这是因为基类的默认实参传递给了继承类的方法。

    class Base
    {
    public:
    void show(){cout << "this is base" << endl;};
    void show(string b){cout << "derive show: " << b << endl;};
    void output(){cout << "output function" << endl;};
    virtual void display(string b = "he"){cout << "base: " << b << endl;};
    };
    class Derive
    {
    public:
    void show(){cout << "this is derive" << endl;};
    void display(string b = "hello"){cout << "derive: " << b << endl;};
    };
    int mian()
    {
    Derive d;
    Base *ptr = &d;
    ptr->show(); //输出为 this is base
    ptr->display(); //输出为 derive: he
    ptr->display("lee"); //输出为 derive: lee
    d.show(); //输出为 this is derive
    d.show("h23"); //编译错误,C++中继承类和基类不构成重载关系
    d.output(); //输出为 output function
    }

  5. class与struct的区别有两个:第一,class的成员默认权限是private,struct的成员默认权限是public;第二,继承时class的继承权限默认是private,struct继承的默认权限是public。

  6. 类如果存在继承关系,基类的析构函数必须设置为虚函数。

  7. 继承类中重载了基类函数,继承类的对象或指针只能调用继承类中重载了的函数,不能调用到基类的函数。但如果不是同名重载的函数,继承类的对象或指针还是能调用到基类中的函数。详见第4条中的例子

  8. C++中继承类和基类之间不构成重载关系,也就是说基类的同名函数没有在继承类中覆盖,那么继承类对象或指针不能调用到基类的该函数。C++中的动态绑定,或者成为多态性必须由virtual关键字来实现,否则基类指针或引用指向继承类,调用的同名函数也还是基类的函数。Java中继承规则简单一些,基类和继承类也构成重载关系,继承类对象或指针、引用也可以使用基类的函数,比如第4条中d.show(“h23”)也是可以执行的。

  9. 模板template中class和typename没有区别。句柄(handle)其实是智能指针,两个指针指向同一个对象,当某一个指针删除了该对象时,另一个指针就变成了垂悬指针,而两个句柄指向同一个对象,当某一个句柄删除了该对象时,删除操作只是将指向该对象的指针计数减一,当计数为0时才真正删除该对象,避免出现垂悬指针的情形。

1 0