欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++:类和对象基础知识(类的实例化对象和大小计算以及内存对齐,空类大小问题)

程序员文章站 2024-03-18 09:07:34
...

什么是面向对象?
在我们最初接触编程语言的时候,我们总是会先听到什么面向对象,面向过程。后来我们也都知道C++这门编程语言就是面向对象的。那么什么是面向对象呢??

面向对象的程序设计:是一种程序设计泛型,同时也是一种程序开发的方法,对象指的是类的实例,将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性、和扩展性。

在概念中提到了 “对象就是类的实例”,下面我们就来学习一下这所谓的类。

今天我们先来了解一下关于类的基本知识,以便后续的学习。
C++:类和对象基础知识(类的实例化对象和大小计算以及内存对齐,空类大小问题)
首先我们需要知道的是:类是c++一种非基本数据类型,类中所包含的两类成员,一个是成员函数,一个是成员变量。

非基本数据类型还包括数组(type[ ]),指针(type*),结构体(struct),联合体(union),枚举(enum)。

我们先来定义一个简单的类:

class Person
{
public:
    void Display()
    {}
public:
    char *_name;
    char *_age;
private:
    char *_sex;
}

访问限定符:

1:public(公有的)
2:protected(保护的)
3:private(私有的)
public成员可从类外部直接访问,private/protected/成员不能从类外部直接访问。
每个限定符在类中可多次使用,他的作用域是从该限定符出现开始到下一个限定符之前或类体结束前。
类体中如果没有定义限定符,则默认为私有的。
类的访问限制体现了面向对象的封装性。

作用域:

局部域
全局域
类域
名字空间域
在学习c语言的时候我们就已经知道作用域这个概念。而在之前的介绍中也学习过了名字空间域,今天我们学习类,也有一个类域。
1:每个类定义了自己的作用域,类的成员(成员函数、成员变量)都在这个类的作用域中,成员函数内可任意访问其他的成员变量和成员函数。
2:对象可以通过.(点操作符)直接访问公有成员,指向对象的指针通过->也可以直接访问对象的公有成员。
3:在类体外定义成员,需要使用::作用域解析符指明成员属于哪个类域。

C++:类和对象基础知识(类的实例化对象和大小计算以及内存对齐,空类大小问题)
类实例化对象:

1:类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储他
2:一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间存储类成员变量

class Person
{
public:
    void Display()
    {}
public:
    char *_name;
}
void Test()
{
    Person p;//person类实例化出对象p
    p._name = "tom";
    p.Display();
}

类对象存储模型:

每一个对象的大小为类中的所有成员变量的大小之和,不过这里也是需要内存对齐的。

为什么要内存对齐?

内存的访问不是一个字节一个字节的访问,总是以整数倍的位置连续读多个位置。
因此采用内存对齐的方式可以完美解决这种问题,从而提高效率。

内存对齐的计算?

这里的内存对齐的规则与我们之前学习C语言时的结构体内存对齐规则一致。
1:第一个成员在与结构体变量便宜量为0的地址处。
2:其他成员变量要对齐到对齐数的整数倍地址处
对齐数=min(该成员的类型大小,编译器默认的对齐数)
vs下编译器默认对齐数是8,gcc下默认对齐数是4

空类的计算

所谓空类,就是不包含成员变量的类。
我们说一个类的大小是该类中所有成员变量的大小之和,那么这里空类中不包含任何一个成员变量,是不是就说这个空类的大小为0呢???
注意! 并不是!! 空类的大小为1 !!!
这是因为,它占一个字节的空间就是为了占位而已,一次表示他自己存在,表示这个类的对象存在过。