类和对象
面向对象
面向对象程序设计:面向对象程序设计是一种程序设计范性,同时也是一种程序开发的方法。
对象:指的是类的实例,将对象作为程序的基本单元,将程序和数据封装在其中,以提高软件的重要性,灵活性和扩展性。
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 私有
- public成员可从类外部直接访问,private/protected成员不能从类外部直接访问。
- 每个限定符在类体中可使用多次,它的作用域是从该限定符出现到下一个限定符之前或类体结束前。
- 类体中如果没有定义限定符,则默认为私有的。
- 类的访问限定符体现了面向对象的封装性。
作用域:
类的作用域:
- 每个类都定义了自己的作用域,类的成员都在这个类的作用域中,成员函数内可任意访问成员函数和成员变量
- 对象可以直接访问公有成员,也可以通过指向对象的指针通过->访问对象的公有成员。
- 在类体外定义成员,需要使用 ::作用域解析符指明成员属于哪个类域。
成员函数的声明和定义
类内定义成员函数
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(编译器默认对齐数,该成员大小)
结构体大小为最大对齐数的整数倍
嵌套结构体的情况:嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数的整数倍
为什么内存对齐:
- 平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
- 性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在于,为了访问未对⻬的内存,处理器需要作两次内存访问;⽽对齐的内存访问仅需要 一次访问。
总体来说:
结构体的内存对齐是拿空间来换取时间的做法。
那在设计结构体的时候,我们既要满⾜对齐,⼜要节省空间,如何做到:
让占用空间⼩的成员尽量量集中在一起。
空类的大小?
一个字节,为了占位,表示它存在过。