目录
- 是什么?
- 将现实生活中实实在在的一些实体的共性抽象出来,形成一个类型。
- 类和对象的区别?
- 类是将不同类型的数据,以及与这些数据相关的操作,构成一个新的数据类型,在现实生活中并不存在,而且不占用内存单元(就像int a,int是不占用内存,a占用内存)
对象是 面向对象 技术的核心所在,面向对象技术中的对象就是现实世界中,某个 物理实体在计算机世界(逻辑)中的映射和体现。也就是说计算机中的对象,是模拟现实世界的实体。
先有实体 再有概念实体 再是类型
银行的ATM机:
- 举例表clock说明:
//类:将不同类型的数据以及与这些类型相关的操作封装在一起,构成新的数据类型 //属性+函数 class Clock { public: void Set()//设置时间 { m_hour=20;//m_ :说明是成员 m_minute=10; m_second=10; } void Show()//显示时间 { cout<":"< ":"< } 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)< }- 根据内存对其原则,输出结果为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)< }- 上述结果是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)< }- 上述运行结果还是16
虚函数在类中分配一个指针的大小,无论是多少都是4字
- 问:下面代码中,一个是c1输出的结果,一个是c2输出的结果,他们都是调用同一个函数,而输出函数怎么得知是哪个输出的?
class Clock { public: void Set(int h) { m_hour=h;//m_ :成员 m_minute=20; m_second=30; } void Show() { //输出 cout<":"< ":"< } 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; }- 相关阅读:
webstorm 使用 live edit 调试时 加载外部资源出现CORS跨域的解决办法
cwebscaner不显示网站
基于时空注意力的图卷积网络在路段级交通预测中的应用
2025~《数据结构》试题~考研
名牌大学毕业,在名企担任程序员月薪5万,却为何选择离职当司机
基于Material Design风格开源、易用、强大的WPF UI控件库
【MySQL & JDBC】使用Java连接MySQL数据库
浏览器简介
C语言函数递归调用
如何部署和配置IPv6
- 原文地址:https://blog.csdn.net/qq_53830608/article/details/127034391