53,C++(07)

来源:互联网 发布:知乎 短句 编辑:程序博客网 时间:2024/05/17 02:24

/*
达内学习 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,多重继承