深度探索C++ 对象模型【第一章2】

来源:互联网 发布:nginx lua 开发环境 编辑:程序博客网 时间:2024/05/21 11:35

1:为了维护与C之间的兼容性,C++保留了关键词struct。那么我们具体要在什么时候来去对class和struct作出用法区分呢?

  • class和struct 的“一致性”用法,只是风格上的问题而已,C中的struct更偏向于数据封装
  • 对于class,从C到C++,我们引入该关键词,目的就是为了得到其所支持的封装以及继承特性
  • struct的本身带有public接口,class本身带有private接口
  • 保留它们的共存只是为了C到C++的兼容~
2:C++中,凡处于同一个access section的数据,必定保证其声明顺序与其在内存中的顺序相一致。但不同的access section中,排列顺序就不一定了!~~。单一元素数组问题:因为不同访问权限的块中数据在内存中的位置不一定,单一元素数组之后未必有足够的内存,如果将private中单一元素数组放在protected前面,那么内存的链接分配可能就会出现问题(可能该数组内存的后面有数据存放)


3:C中的struct在C++中比较建议的用途:将数据封装起来(无继承的情况下),传递给C++所使用。

4:OO程序设计:object_oriented,只有通过指针或是引用的间接处理,才能实现其多态的性质。相反,在ADT程序设计中,程序员处理的是一个拥有固定而单一类型的实例,其在编译时已经完全确定好了。
个人理解:
  • 程序模型procedural:无类的概念
  • 抽象数据类型模型ADT:有类的出现,但是没有多态
  • 面向对象模型OO:有类以及其多态特性的出现
5:多态相关
  • 多态定义:把具有继承关系的多个类型称为多态,因而我们可以使用这些类型而无需在意他们的差异。
  • 指针和引用的动态类型和静态类型的不一致性是C++支持多态的根本所在
  • 动态类型:变量或表达式在内存表达中的对象的类型(运行时才可确定)
  • 静态类型:编译时已知变量声明的类型或表达式生成的类型
6:虚函数和非虚函数与多态的关系
  • 虚函数运行时才会决定执行的是哪个版本,判断的依据是引用或指针所绑定的真实类型
  • 非虚函数的调用在编译时期已经确定
7:public继承中,可以直接的进行多态的转换。而Nonpublic继承(包括void*指针),必须由程序员通过显式的转换操作来访问。

8:C++支持的多态
  • 指针或引用的静态动态类型不一致
  • 虚函数机制
  • dynamic_cast和typeid运算符
9:多态的用途是经由一个共同的接口来影响类型的封装,这个接口通常会被定义在一个抽象的base class中

10:class 对象的内存大小
  • nonstatic data members的大小总和
  • 虚函数所带来的虚函数指针负担
  • alignment(将数值调整到某数的倍数)带来的补齐,32位机器上为4字节的倍数
11:指针本身所需的内存大小是固定的,无论其指向哪一种数据类型,同样的,引用在本质上也是以一个指针来实现的,所以其本身所需的内存也是固定的。!@但是!@,对于sizeof运算符来说,sizeof一个引用,返回的是其引用对象的大小,sizeof一个指针,返回的是其本身大小。

12:指针之间的不同之处在于:其寻址出来的object(对象)类型的不同,指针之间的内存、内容(一个机器地址)都是一样的

13:类型”,这个词就是为了解释指针所跨越的地址长度的。所以对于void*类型的指针,我们无法知道其涵盖的地址空间,它只能持有一个地址,我们无法利用它操作其指向的object。

14“cast”,转换这个词,其实是一种编译指令,大部分情况下它并不改变一个指针所含的真正地址,它只影响“被指出内存的大小及其内容”的解释方式

15:当给一个基类的构造函数传递一个派生类对象时,基类的构造函数只能够初始化基类部分的成员,所以派生类的部分会被切掉~
bear b;ZooAnimal *p = &b;


原创粉丝点击