一、面向对象的程序设计
1、概念:是一种程序设计范型,同时也是一种程序开发的开发方法。
对象指的是类的实例,将对象作为程序的基本单元,将程序和数据封装在其中,以提高软件的重用性、灵活性和扩展性。
C++不是纯面型对象语言,而是基于面向对象的语言
面向对象的特性:封装、继承、多态
2、封装:隐藏对象的属性和实现细节,仅对外公开接口和对象进行交互,将数据和操作数据的方法进行有机结合。
二、类(class、struct)
1、访问限定符
(1)public成员在类外可以直接访问,protected/private成员在类外不可以访问
(2)每个限定符在类体中可以使用多次,它的作用是:从该限定符出现开始到下一个限定符之前或类体结束前
(3)class默认访问权限是private,而struct为public
(4)类的访问限定符体现了面对对象的封装性
2、作用域
(1)每个类都定义了自己的作用域,类的成员(成员变量/成员函数)都在类的这个作用域中,成员函数内可以任意访问成员变量和其他成员函数
(2)对象可以通过直接访问公有成员,指向对象的指针通过->也可以直接访问对象的公有成员
(3)在类外定义成员变量,需要使用::作用域解析符指名成员属于哪个类域
3、成员函数的声明和定义
(1)类内定义成员函数
(2)类外定义成员函数
#include<iostream>
using namespace std;
class Student
{
public://访问限定符
void Show()//类内定义的成员函数
{
cout << _name << endl;
cout << _sex << endl;
cout << _age << endl;
}
Student(char* name, char* sex, int age);//类外定义的成员函数的声明
private://访问限定符
char* _name;//成员变量
char* _sex;
int _age;
};
Student::Student(char* name,char* sex,int age)//类外定义的成员函数
{
_name = name;
_sex = sex;
_age = age;
}
int main()
{
Student stu("直接","男",12);
stu.Show();
system("pause");
return 0;
}
4、类实例化对象
(1)类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
(2)一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间存储类成员变量
(3)类只是一个设计,实例化出的对象才能实际存储数据,占用物理空间
5、类对象存储模型
每个对象的大小为类中所有成员变量的大小之和,并且遵循内存对齐原则
三、相关面试题
1、为什么内存要对齐?
为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。
2、空类对象(无成员变量的类)的大小是多少?为什么?
空类对象(无成员变量的类)的大小是1
为了标识实例化出来的对象
3、A和B类型的大小分别是多少?
class A
{
char ch;
double d;
};
class B
{
char ch1;
A a;
char ch2;
};
在VS下,A是16,B是32
总结:
结构体对齐原则:
(1)第一个成员变量在与结构体变量偏移量为0的地址处
(2)其它成员变量要对齐到某个数字(对齐数)的整数倍的地址处
对齐数=编译器默认的一个对齐数与该成员大小的较小值
VS中默认的值为8
gcc中默认的值为4
(3)结构体总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐数)的整数倍
(4)如果嵌套了结构体的情况,嵌套结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍