C++之类和对象(一)

  • 面向对象

面向对象(Object Oriented Analysis Design,OOAD)的思想把整个世界看成是由具有某种特征行为功能的基本单元——对象构成的。OOAD把一个对象的特征称为属性,把其行为称为一种方法。一个对象,可以接受外部信息,也可以向外部提供某种服务,我们可以将参数传递给对象,请求对象处理之后返回给我们,即提供了服务。

面向对象的三大特征:封装、继承、多态。

(1)public成员可以从类外部直接访问,protected/private成员不能从类外部直接访问;

(2)每个限定符在类体中可使用多次,它的作用域是从该限定符出现开始到下一个限定符之前或类体结束前;

(3)类体中若没有定义限定符,则默认为私有;

(4)类的访问限定符体现了面向对象的封装性。

在C++中,struct既可以认为是结构体,又可以认为是类。

class中若没有定义限定符,则默认为私有;struct若没有定义限定符,则默认为公有。

类的作用域:

(1)每个类都定义了自己的作用域,类的成员都在类的作用域中,成员函数可任意访问成员变量和其他成员函数;

(2)对象可以通过 . 直接访问公有成员,指向对象的指针通过 -> 也可直接访问对象的共有成员;

(3)在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。

  • 类对象存储模型

每个对象的大小为类中所有成员变量的大小之和,同时遵循内存对齐原则。

class Person{
public:
    void display(){}
public:
    char* _name;
    char* _sex;
    int _age;
};

在上面这段代码中,sizeof(Person) = 12。

这里我们来讨论几个问题:

(1)为什么要内存对齐?

答:1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常;     2.性能原因:数据结构,尤其是栈,应尽可能在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要做两次内存访问,而对齐的内存访问仅需要一次访问。

(2)空类对象(无成员变量的类)的大小是多少?为什么?

答:空类对象的大小是1。因为空类同样可以被实例化,每个实例在内存中都有一个独一无二的地址。为了达到这个目的,编译器往往会给一个空类隐含的加上一个字节,这样空类在实例化后在内存得到了独一无二的地址,所以大小为1。

  • 结构体内存对齐规则

(1)第一个成员在与结构体变量偏移量为0的地址处;

(2)其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处;对齐数=编译器默认的对齐数与该成员大小的较小值。vs下默认为8,gcc下默认为4。

(3)结构体总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐数)的整数倍;

(4)若是嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

猜你喜欢

转载自blog.csdn.net/cecilia3333/article/details/81171491