1、面向过程和面向对象初步认识
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数逐步调用解决问题
C++是基于面向对象的,关注的是对象,将一件事拆分成不同的对象,靠对象之间的交互完成(基于面向对象:既有面向对象,也有面向过程,因为C++要兼容C语言)
面向对象和面向过程不是一门编程语言,而是一种解决问题的思路,C++中实现面向对象的编程思想,class定义的类是很关键的一步。
2、类的引入
在C语言中,结构体只能定义变量,不能定义函数
在C++中,结构体内不仅可以定义变量,也可以定义函数
在C++中,struct定义出来的类型可以看成是一个类,C语言的结构体在C++中变成了一个类,在C++中,定义类使用class关键字
举例:在C语言中定义结构体
在C++中定义结构体:
3、类的定义
类就是对对象(实体)进行描述的,但类不是对象(实体),类也可以看成是新定义了一种数据类型
实体有哪些属性:类的成员变量
实体有哪些功能:类的成员函数
类的两种定义方式:
(1)声明和定义全部放在类体中(注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理)
class Person
{
public:
void showInfo()
{
cout << _name << " " << _gender << " " << _age << endl;
}
public:
char* _name;
char* _gender;
int _age;
};
(2)声明放在.h文件中,类的定义放在.cpp文件中(成员函数如果放在类外来进行定义,成员函数名之前必须要加类名::,表明该函数是哪个类的成员函数)
在头文件中:
在源文件中:
一般情况下,采用方式(2)
类的作用域: 类定义了一个新的作用域,类的所有成员都在类的作用域中,在类外定义成员,需要使用::作用域解析符指明成员属于哪个类域
4、类的访问限定符及封装
(1)访问限定符(限定类中哪些成员可以在类外来进行使用)
【访问限定符说明】
- public修饰的成员在类外可以直接被访问
- protected和private修饰的成员在类外不能直接被访问
- 访问权限的作用域:从该访问限定符出现的位置开始到下一个访问限定符出现的位置结束
- class的默认访问权限是private,struct的默认访问权限是public
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别
问:C++中struct和class的区别是什么?
答:C++需要兼容C语言,所以C++中struct可以当成结构体去使用,C++中的struct也可以用来定义类,和class是一样的。区别是:struct的成员默认访问权限是public,class的成员默认访问权限是private
(2)封装(将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互)
问:面向对象的三大特性?
答:封装、继承、多态
在类和对象阶段,只研究类的封装特性,封装本质上是一种管理
5、类的实例化
用类类型创建对象的过程称为类的实例化
类:主要是对实体(对象)来进行描述的,描述实体都有哪些属性(成员变量),实体中都有哪些方法(成员函数),类也是新定义的一种类型,类是比较抽象的一个概念,是从许多对象中提取出来的一些公共的信息,将数据和方法包装起来,更好地描述实体。
对象:实实在在存在的,是用类产生的一个实体,对象中是可以放数据的
举例:类相当于一张图纸,对象相当于一座房子
6、类对象模型
对象模型:对象在内存中的布局方式
(1)类对象的存储方式猜测
- 对象中包含类的每个成员
- 只保存成员变量,成员函数放在公共的代码段
所以,计算机的存储方式到底是哪种?
实际的存储情况:对象中只存储了成员变量,成员函数单独进行存放,当程序运行起来后,成员函数存储在代码段,但是也要注意内存对齐
结论:一个类的大小,实际就是该类中“成员变量”之和
问:空类的大小是多少?为什么?
答:在主流编译器中,空类大小占1字节,将空类大小设置成1的目的就是为了区分空类定义出来的不同对象
举例:
class A1{
public:
void f1(){}
private:
int a;
};
class A2{
public:
void f2(){}
};
class A3{};
int main()
{
printf("%d %d %d\n", sizeof(A1), sizeof(A2), sizeof(A3));
system("pause");
return 0;
}
代码运行结果为: