C++primer第四版第十四章第十五章
来源:互联网 发布:微信域名检测 php源码 编辑:程序博客网 时间:2024/06/01 07:13
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时才真正删除该对象,避免出现垂悬指针的情形。
- C++primer第四版第十四章第十五章
- c++primer第五版第十四章练习
- C++Primer习题第十四章
- C++ Primer 【第四版】第十五章 面向对象编程
- c++primer第五版第十五章练习
- C++Primer习题第十五章
- C++Primer第四章
- C++primer 第四章
- C primer plus(第五版)编程练习第十四章
- C Primer Plus(第五版) 第十四章 课后习题 4
- C Primer Plus(第五版) 第十四章 课后习题 6
- C Primer Plus(第五版) 第十四章 第八题
- C++Primer Plus(第六版) 第十四章 第一题
- C++Primer Plus(第六版) 第十四章 第五题
- C++primer 第十四章笔记 初稿
- C++ Primer 【第四版】第十四章 重载操作符与转换
- C++ primer 第十四章
- C primer plus(第五版)编程练习第十五章
- CSS中定位详解
- Android的Monkey自动化测试
- 数据结构:实验一
- 关于eclipse里面入门servlet搭建经常发生的问题
- 2017GDKOI总结
- C++primer第四版第十四章第十五章
- 深入理解C#的装箱和拆箱
- Error LNK2001 无法解析的外部符号 的几种情况及解决办法
- python中使用MySQLdb模块进行操作
- vs2012编译libevent-2.1.8-stable源码 可调试
- Mobile Security Framework分析apk
- 1198
- 去重,重复的去掉
- SharedPreferences存储