/*
达内学习 C++ day51 2013-11-13
*/
回忆:
一,一元运算符 - ++ -- ~ !(默认左边)
#R
R对象类型中着到一个成员函数 operator#()
找不到的化就去全局找 operator#(R对象类型)
L# ++ --
L对象类型中着到一个成员函数 operator#()
找不到的化就去全局找 operator#(R对象类型,int)
二,运算符重载的限制
1,不是所有的运算符都能重载
:: . .* ?: sizeof typeid
2,不能对基本类型运算符重载
至少有一个是类类型
3,不要改变运算级的特性(优先级等)
4,不能发明新的运算符,只能对已有的运算符重载
5,只能作为成员的运算符
= [] () -> *
三,只能作为成员运算符的举例
1,= []
=要和构造函数 析构函数 拷贝构造函数一起考虑
=实现重载时 类型& operator=()
防止自赋值 是否自己的内存 注意返回值
类型 operator[](int ind);
2,小括号运算符
1,函数对象 把一个对象像函数一样使用
返回值类型 operator()(参数列表);
2,小括号做类型转换
operator 类型();
3,-> * 智能指针
地址 operator->();
对象->函数(); 对象.operator->()->函数();
对象类型& operator*();
四,new delete
void* operator new(size_t size);
void operator delete(void* ptr);
五,类型转换
如果一个类型有一个单参的构造函数 则允许这个单参类型的变量转换成这个类类型的变量
class A
{
public:
explicit A(B b){}
};
把A 类型转换 B 类型
重载() 运算符
//===============
面向对象
1,面向对象编程的特征
抽象,封装,继承,多态
2,封装
该公开的公开,该私有的私有 public private
目的:隐藏细节
好处:便于分工协同开发,防止不必要的扩展
单例模式
3,继承
a,把一个类的数据 传承到下一个类
代码复用 可以得到父类的一切
b,扩展(字类具备父类的一切,但又扩展了父类)
任何一个子类都可以看成是父类
c,如何做到继承
一个类 继承 另一个类
class A{}; class B:public A{};
d,继承 和 组合
f,继承的方式
public 继承 公开继承
protected 继承 保护继承
private 继承 私有继承
公开继承:
如果父类中的数据权限是公开的则被继承到子类中也是公开的;如果父类中的数据权限是保护的,则被继承到子类中权限是保护的;如果父类中的数据是私有的,则被继承到子类中权限是隐藏的。
保护继承 :
公有变保护 保护继承不变 私有的隐藏
私有继承:共有变私有,保护变私有,私有变隐藏
总结:继承方式就是给子类的最大的权限
public 成员 在子类中变得和继承方式一致
protected 成员 除了私有继承为 private 其他还为 protected
private 成员 所有继承方式都为隐藏
g,如果是私有继承 如何访问父类数据
如果子类中父类的数据权限是私有的,则在子类中公开一个接口。
如果在子类中父类的数据权限是隐藏的,则在父类中开一个接口,再在子类中开一个访问接口。
h,父类中的 构造函数 拷贝构造函数 析构函数 赋值运算符 不能继承到子类中,但是子类中可以调用这些函数。
子类默认调用父类的无参构造函数 和 析构函数。
构建子类对象掉用父类构造函数再调用子类的析构顺序相反。
父类构造->子类构造->析构子类->析构父类
如果子类中 要指定调用父类的某个构造函数需要使用初始化列表 指定调用。
i,拷贝构造函数 和 赋值运算符的调用
子类默认调用父类的拷贝构造函数 和 赋值运算符函数。
一旦自定义之后就需要手动调用。
拷贝构造函数在初始化参数列表中调用
赋值运算符要防止递归,需要在函数名前加 父类名::operator=(子对象);
j,继承中的数据隐藏
当数据继承到子类之后 子类中如果定义了和父类数据同名的数据 则会把父类的数据隐藏掉
如果使用被隐藏的 父类名::数据名;
4,多重继承