C++day09 学习笔记
1、类型封装
类 --> 对象
描述 : (1)属性
(2)行为 ---属性和行为是属于类的
创建对象。
2、构造函数 --- 初始化对象
(1)构造函数名字必须与类名一样
(2)构造函数不能写返回类型
构造函数在创建对象时,系统自动调用
构造函数允许重载,按用户要求,适应多种情况
当类中一个构造函数都没有的时候,系统提供默认无参的构造函数
但如果在类中定义了一个构造函数,系统就不提供默认的了,所以,建议,在写构造函数时,都要写一个无参的构造函数
3、对类的安全的定义
变量 -> 私有 -> private 保护变量,防止外界随意修改,只能在类的内部使用(只能被自己的成员函数使用)
函数 -> 公有 -> public
为保证私有变量也能为外界访问,在类内部提供set,get方法
set方法没有返回值,但要求有参数
get方法肯定有返回值,没有参数
4、定义类的步骤
(1)写属性的行为
成员变量 函数
(2)成员变量--> private
成员函数 --> public
(3)特殊函数
构造函数,建议写2个。一个有参数的,一个无参的
get,set函数,一个成员变量对应一对get,set函数,是外界访问此变量的唯一途径
对于setXXX函数,没有返回值,有参数,参数的类型与被赋值的属性类型一致。
对于getXXX函数,没有参数,有返回值,返回值的类型与输出的属性类型一致。
类的行为
5、封装
定义类的过程就是封装
练习:封装一个account类型
属性:id , password ,name ,balance
行为:save , withdraw , query
6、把account类拆成多文件结构
(1)方便快速浏览整个类定义
(2)使用方便,包含头文件即可
long Account::getId(){...........}
在函数实现时,函数前把类名加上,确定函数的所有权,避免2个类中有同名的函数,编译出错。
" :: "称为域访问控制符。
7、Person per ; 创建了一个对象,系统调用构造函数。
Person *p = NULL ; 声明一个类的指针,系统是不会调用构造函数的
Person * p = NULL;
p = new Person ; 在堆中申请一个类空间
delete p;
在堆中的数据没有名字,只能通过指针访问类对象,访问类的成员变量:
(*p).sayHello();
p->sayHello();
Person ps[5];声明一个Person类型的数组,会调用5次构造函数
数组在声明的时候,系统会为其分配空间
并且在声明数组的时候,没有机会指定构造函数,只会调用无参的构造函数
当一个类定义中没有无参的构造函数,但要声明一个类的数组时,可以声明一个指针数组
Person *ps[5]; ---声明指针的时候,类对象没有创建,数组中每个元素都是Person类型的指针,达到:
(1)不用构造函数
(2)实现使用对象
for(int i = 0 ; i <5 ; i++){ ps[i] = new Person(i , 20+i); //用循环初始化每个指针 } for(int i = 0 ; i < 5 ; i++){ delete ps[i]; //释放指针指向的空间 ps[i] = NULL ; }
8、课堂练习:
要求:main()函数中不能写代码,在运行程序时,打印“Hello World”
答案:全局变量的初始化操作在main函数执行之前就已经初始化了。因此,可以写一个全局变量的类,其无参构造函数写输出语句。
然后声明一个类的全局对象。
9、在构造函数中,当成员变量名称和形参名称相同,避免冲突的方法:
在每个对象内部都有一个名为this的指针,指向自己,使用自己的成员变量 this->name
10、析构函数
当对象的生命周期结束,系统要回收空间,会自动被调用
申请的所有资源(new char[20]),在析构函数中释放
若对象是在main函数中的变量,在main函数结束之后,才会调用析构函数
若对象是一个函数中的局部变量,在函数返回时,调用析构函数
析构函数调用 : 对象生命周期结束,系统自动调用析构函数
可以把释放资源的代码写在析构函数中
析构函数的写法:构造函数前加 “~”
不能重载,不能有参数
若不写析构函数,系统会提供默认的析构函数
当类中用到了系统空间:new内存,打开文件
就需要写析构函数,释放资源
11、作业:(1)利用面向对象的思想实现栈结构,并自己写main函数测试。
(2)把原来的银行系统改成面向对象的形式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?