1.什么是面向对象
概念:(Object Oriented Programming,缩写OOP)是一种程序设计范型,同时也是一种程序开发的方法。
对象指的是类的实例,将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
类是创建对象的模板,一个类可以创建多个对象。对象是类的实例化。
C++不是纯面向对象语言,而是基于面向对象的语言。
面向对象的三大特性:
封装、继承、多态
封装体现在类的访问限定符(private、protected、public)。
类(class/struct):
1.数据(成员变量)
2.程序(成员函数)
Class类,如果没有访问限定符,默认是私有的;struct默认是公有的。
三种访问限定符:
1. public:public成员可从类外部直接访问,private/protected成员不能从类外部直接访问。
2. 每个限定符在类体中可以使用多次,它的作用域是从该限定符出现开始到下一个限定符之前或类体结束前。
3. class类,如果没有访问限定符,默认是私有的;struct默认是公有的。
4. 类的访问限定符体现了类的封装性。
类的作用域:
1. 每个类都定义了自己的作用域,类的成员(成员函数和成员变量)都在类的这个作用域内,成员函数内可任意访问成员变量和其他成员函数。
2. 对象可以通过 . 直接访问公有成员,指向对象的指针通过->也可以直接访问对象的公有成员。
3. 在类体外定义成员,需要使用::作用域解析符指明成员属于哪个类域。
成员函数的声明和定义:
1.类内定义成员函数
class Person
{
public:
void Display()
{
cout<<_name<<"-"<<_sex<<"-"<<_age<<end1;
}
public:
char* _name;
char* _sex;
int _age;
};
2.类外定义成员函数
class Person
{
public:
void Display();
public:
char* _name;
char* _sex;
int _age;
};
void Person::Display()
{
cout<<_name<<"-"<<_sex<<"-"<<_age<<end1;
}
类实例化出对象:
1.类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它。
2.一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间存储类成员变量。
2.类的大小
首先来看一张图:
由图可以看书,每个对象都自己独有一份数据(成员变量),而成员函数是共享的,存在于公共代码区;所以每个对象的大小为类中所有的成员变量(静态成员变量除外)的大小之和,这里需要注意的是,仍然遵循内存对齐原则。
3.为什么存在内存对齐
有两个原因:
1.平台原因
不是所有的硬件平台都能访问任意地址上的任意数据;有些硬件平台只能访问特定地址处的特定类型的数据,否则抛出硬件异常;
2.性能原因
为了访问未对齐的内存,处理器需要做两次的内存访问;而对齐的内存只需要访问一次,提高了效率;
内存对齐是一种以空间换时间的做法。
4.空类对象(无成员变量的类)的大小是多少?为什么?
首先,答案是1字节。
原因:
因为空类也进行了实例化,每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器一般会给一个空类隐含的加一个字节,这样就可以达到空类在实例化后得到了独一无二的地址的目的。