关闭

C++学习日记day05

标签: c++classdelete语言工具
218人阅读 评论(0) 收藏 举报
分类:
第五课
1.不允许被用户重载的运算符
::作用域解析操作符
.成员访问操作符
.*成员指针解引用操作符
?:三目运算符
sizeof字节长度操作符
typeid类型信息操作符
操作符没有类类型的操作数,不能重载。
不能通过操作符重载发明新的操作符。
**
2.只能定义为成员函数的运算符
1) 下标操作符:[]
2) 函数操作符:()
3) 间接操作符:*/->
3.new/delete操作符的重载
4.封装、继承和多态
1)封装:通过访问控制对类型的属性和行为进行访问限制。
2)继承:通过语言机制表达类型之间共性与特性的依存关系。
A.继承的基本概念和语法
人类
  姓名、年龄
  吃饭
学生
  学号
  学习
教师
  职称
  授课
               人类    - 姓名、年龄、吃饭
               /  \
学号、学习 - 学生 教师 - 职称、授课
class 子类名 : 继承方式1 基类1, 继承方式2 基类2, ... {...};
继承方式:
public:   公有继承
protected: 保护继承
private:  私有继承
B.继承的特性
a.一个子类类型的对象在任何时候都可以被看作它的基类类型的对象。一个基类类型的对象如果作为子类类型对象被访问,有可能引发非法内存访问错误。
b.在子类中可以访问基类的公有和保护成员,不能访问基类的私有部分。
c.名字隐藏,在子类中可以定义与基类同名的标识符,子类隐藏基类。任何时候都可以通过“基类::”显式地表明访问基类中的版本。
C.继承方式与访问控制
访控限定符 访控属性 基类 子类 外部 友元
---------------------------------------
public     公有成员  Ok   Ok   Ok   Ok
protected  保护成员  Ok   Ok   No   Ok
private    私有成员  Ok   No   No   Ok
通过子类访问其基类中定义的成员时需要考虑继承方式对访问控制的影响。
基类中的 在公有子类中 在保护子类中 在私有子类中
-----------------------------------------------
公有成员   公有成员     保护成员     私有成员
保护成员   保护成员     保护成员     私有成员
私有成员   私有成员     私有成员     私有成员
class Jpeg {
public:
    void DCT (...) {...}
};
class Pdf : protected Jpeg {
public:
    void Show (...) {
        DCT (...);
    }
};
class Xpdf : public Pdf {
public:
    void Show (...) {
        DCT (...);
    } 
};
Pdf pdf (...);
pdf.Show (...);
pdf.DCT (...); // error !
私有继承和保护继承也被称为实现继承。仅仅将基类作为一个实现工具。
D.子类的构造和析构函数
a.在子类的构造函数中可以显式地指定其基类子对象的构造方式(通过在初始化表中使用“基类(构造参数)”),否则系统就会试图以无参的方式构造其基类子对象。
b.子类的析构函数会自动地调用基类的析构函数,析构其基类子对象。但是基类的析构函数不会自动地调用子类的析构函数。
c.delete一个指向子类对象的基类指针,被调用的仅仅是基类的析构函数,而该析构函数不会自动调用子类的析构函数,进而导致内存泄露。通过使用虚析构函数可以解决此问题。
E.子类拷贝构造和拷贝赋值可能需要显式地调用基类的拷贝构造和拷贝赋值。
F.多重继承与虚继承
虚继承要点:
a.在对公共基类的继承方式前面加virtual关键字;
b.可能需要在最终子类中显式指明公共基类的构造方式。
c.目标:公共基类子对象在最终子类中只有一份,以避免经由不同继承路径访问公共基类子对象时发生数据不一致。
3)多态
A.通过指向子类对象的基类指针/引用只能调用基类的成员函数;
B.通过指向子类对象的基类指针/引用调用虚函数,实际被调用的是子类的版本。
C.虚函数和虚函数覆盖
被声明为virtual的成员函数是虚函数。
在子类中定义一个与基类中具有相同函数原型的成员函数,即构成虚函数覆盖,该虚函数的覆盖版本也是虚函数。
说明:如果虚函数返回类型为类类型的指针或者引用,子类中的覆盖版本可以该类型的子类。
class B : public A {};
基类中:vitual A* foo (void) {...}
子类中:       B* foo (void) {...}
D.纯虚函数、抽象类和纯抽象类
纯虚函数:vitrual 返回类型 成员函数名 (形参表) = 0;
至少包含一个纯虚函数的类叫抽象类。抽象类不能实例化为对象。完全有纯虚函数组成的抽象类叫纯抽象类。
E.虚析构函数
a.虚析构函数实际上就是为了保证delete一个指向子类对象的基类指针时实际被调用的是子类里的析构函数,而该析构函数会自动调用基类的析构函数。
b.一般而言,如果一个类中有虚函数,那么该类就应该提供一个虚析构函数。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:18120次
    • 积分:378
    • 等级:
    • 排名:千里之外
    • 原创:18篇
    • 转载:5篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论