C++:初识类和对象

类和对象

面向对象

面向对象程序设计:面向对象程序设计是一种程序设计范性,同时也是一种程序开发的方法。

对象:指的是类的实例,将对象作为程序的基本单元,将程序和数据封装在其中,以提高软件的重要性,灵活性和扩展性。

c++不是纯面向对象语言,而是基于面向对象的语言,因为包含c的部分,c是面向过程。

面向对象的三大特性:

  • 继承
  • 多态
  • 封装

定义一个类:

class Person
{
public//数据--成员函数
    void show()
    {
        cout<<name<<endl;
        cout<<age<<endl;
    }
public//数据--成员变量
    char* name;
    int age;
};

int main()
{
    Person p;//类的实例化
    p.name = "Tom";
    p.age = 6;
    p.show();

    Person* Ptr=&p;
    Ptr->name="mary";
    Ptr->age=12;
    Ptr->show();

}

三种访问限定符

  • public 公有
  • protected 保护
  • private 私有

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

作用域:

类的作用域:

  1. 每个类都定义了自己的作用域,类的成员都在这个类的作用域中,成员函数内可任意访问成员函数和成员变量
  2. 对象可以直接访问公有成员,也可以通过指向对象的指针通过->访问对象的公有成员。
  3. 在类体外定义成员,需要使用 ::作用域解析符指明成员属于哪个类域。

成员函数的声明和定义

类内定义成员函数

class Person
{
public:
    void Show()
    {
        cout<<_name<<_sex<<_age<<endl;
    }

public:
    char* _name;
    char* _sex;
    int _age;
};

类外定义成员函数

class Person
{
public:
    void Show();
public:
    char* _name;
    char* _sex;
    int _age;
};
void Person::Show()
{
    cout<<_name<<_sex<<_age<<endl;
}

类对象模型大小

每个对象的大小为类中所有成员变量的大小之和,但是也要遵循内存对齐原则

成员函数不占大小。

内存对齐问题:

复习知识点-内存对齐规则:

第一个成员在结构体变量偏移量为0的地址处对齐

其他成员都要对齐到某个对齐数的整数倍的地址处

对齐数=min(编译器默认对齐数,该成员大小)

结构体大小为最大对齐数的整数倍

嵌套结构体的情况:嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数的整数倍

为什么内存对齐:

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

总体来说:
结构体的内存对齐是拿空间来换取时间的做法。
那在设计结构体的时候,我们既要满⾜对齐,⼜要节省空间,如何做到:
让占用空间⼩的成员尽量量集中在一起。

空类的大小?

一个字节,为了占位,表示它存在过。

猜你喜欢

转载自blog.csdn.net/mxrrr_sunshine/article/details/80853944