首页 > 编程 > C++ > 正文

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

2019-11-08 01:44:44
字体:
来源:转载
供稿:网友

Talk is cheap, show me the code.

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

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

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

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

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

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

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

保留字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 }

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

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

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

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

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选