C++学习日记day05

原创 2012年03月22日 21:06:37
第五课
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.一般而言,如果一个类中有虚函数,那么该类就应该提供一个虚析构函数。

C++学习日记day06

第六课 1.动态绑定的底层实现——虚函数表 class A {...}; class B : public A {}; A* pa = new B; 当编译器编译如下语句时 pa -> f...

C++学习日记day03

第三课 1. 初始化表的必要性 1) 类中包含常量和引用型的成员变量。必须通过构造函数和初始化表显式地对其进行初始化。 2) 在子类中显式地构造其基类部分。 class A { public...

C++学习日记 3

  • 2014年01月11日 22:09
  • 2KB
  • 下载

C++学习日记 1

  • 2014年01月09日 22:52
  • 2KB
  • 下载

c++学习日记之复数的运算

复数有两个部分:实数部分和虚数部分。假设 a=(A,Bi),c=(C,Di);则 加法:a+c = (A+C,(B+D)i) 减法:a-c = (A-C,(B-D)i) 乘法:a*c = (A*...

C++学习日记--分支结构(if语句)

  • 2014年02月18日 22:37
  • 103KB
  • 下载

C++学习日记

  • 2012年09月10日 11:01
  • 260KB
  • 下载

C++学习日记1

《C++标准程序库》 解析: (1)第1章至第4章总体介绍了本书及C++标准程序库; (2)第5章至第9章分别从各个方面描述STL; (3)第10章至第12章描述了一些“简单的”标准类别; (4)第1...

C++学习日记 2

  • 2014年01月10日 23:55
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++学习日记day05
举报原因:
原因补充:

(最多只允许输入30个字)