目录
一、类的基本知识
- 是什么?
- 将现实生活中实实在在的一些实体的共性抽象出来,形成一个类型。
- 类和对象的区别?
- 类是将不同类型的数据,以及与这些数据相关的操作,构成一个新的数据类型,在现实生活中并不存在,而且不占用内存单元(就像int a,int是不占用内存,a占用内存)
1.什么是面向对象?什么是类?
对象是 面向对象 技术的核心所在,面向对象技术中的对象就是现实世界中,某个 物理实体在计算机世界(逻辑)中的映射和体现。也就是说计算机中的对象,是模拟现实世界的实体。
- 对象是现实世界的模拟实体
- 对象是类的实例化
- 类是对主观世界、抽象类别的设计
先有实体 再有概念实体 再是类型
银行的ATM机:
- 类是一组相关的属性(变量)和行为 (方法)的集合。
- 类是由一个抽象概念设计的产物对象,是由一个类型实例化后的具体表现形式。
- 成员变量是对象的属性 (可以是变量,指针,数组等),属性的值确定对象的状态成员函数是对象的方法,确定对象的行为。
2.private、protected、public
- 举例表clock说明:
//类:将不同类型的数据以及与这些类型相关的操作封装在一起,构成新的数据类型 //属性+函数 class Clock { public: void Set()//设置时间 { m_hour=20;//m_ :说明是成员 m_minute=10; m_second=10; } void Show()//显示时间 { cout<<m_hour<<":"<<m_minute<<":"<<m_second<<endl; } protected: int m_test; private: int m_hour;//m_ :成员 int m_minute; int m_second; }; void main() { Clock c;//定义一个实际对象c。Clock:类,c:对象 c.m_hour; //c.m_test=10; //c.m_hour=20; }
- 访问权限:public、protected、private。一般函数为共有,属性为私有。
- //c.m_test=10;
//c.m_hour=20;这两个是不允许在main内使用,因为在外界不能用protected和private
- private为私有,一般需要通过函数接口间接访问,不能直接访问
- 这样使用:
- 想要调试表,在public的set()内设置表的时间,show()内输出时间
3.结构体和类的区别
- struct 默认权限是Public ,class是private
struct AA { void printf(); }; struct BB { void printf(); }; void main() { AA a; BB b; a.printf();//可以访问 b.printf();//不能访问 }
- 但在c++中,一般还是用class去定义类
二、面向对象特点
封装、继承、多态、抽象
- 封装:
- 例如上述clock内,把属性、操作放在一起(包在一起)
- 继承:
- 父类派生子类(由上至下)
- 子类继承父类(右下至上)
- 面向对象的三大特质之继承 | 继承的规则和顺序是什么?什么是隐藏规则?
- 多态:
- 多种状态
- 重载多态——函数重载、运算符重载
- 强制多态——强制类型转换 static_cast,dynamic_cast,const_cast..
- 包含多态——virtual虚函数多态
- 参数多态——模板(模型)
- 面向对象的三大特质之多态 | 什么是多态?虚表的工作原理是什么?
三、类的大小
举例说明:
class AA { public: void test(); private: int m_i; char m_sex; int m_age; static int m_num; } void main() { count<<sizeof(AA)<<endl; }
- 根据内存对其原则,输出结果为12
- 操作函数test()函数不占大小,无论是普通的还是静态的 //存在代码区不在属性区
- 因此,类的大小是属性值和
- 而静态还是不占内存大小
class AA { public: void test(); virtual void fn(); private: int m_i; char m_sex; int m_age; static int m_num; } void main() { count<<sizeof(AA)<<endl; }
- 上述结果是16
- 虚函数占内存大小
class AA { public: void test(); virtual void fn(); virtual void fn1(); virtual void fn2(); private: int m_i; char m_sex; int m_age; static int m_num; } void main() { count<<sizeof(AA)<<endl; }
- 上述运行结果还是16
虚函数在类中分配一个指针的大小,无论是多少都是4字
- 问:下面代码中,一个是c1输出的结果,一个是c2输出的结果,他们都是调用同一个函数,而输出函数怎么得知是哪个输出的?
class Clock { public: void Set(int h) { m_hour=h;//m_ :成员 m_minute=20; m_second=30; } void Show() { //输出 cout<<m_hour<<":"<<m_minute<<":"<<m_second<<endl; } private: int m_hour;//m_ :成员 int m_minute; int m_second; }; void main() { Clock c1;//定义一个实际对象c。Clock:类,c:对象 Clock c2; c1.set(12); c1.show(); c2.set(9); c2.show(); }
- 对象输出结果在非静态函数成员里面,有个隐含指针this
- this指向当前类对象,接收当前类对象的地址,this=&当前对象
- this是指针,只能用于指向。
void Set(int h) { this->m_hour=h;//m_ :成员 this->m_minute=20; this->m_second=30; }