7.总结
7.1 知识点
主要学习内容
总结目的
完成需求有千百种方式
练习
7.2 核心要点速览
构造函数知识补充
核心要点 | 说明 | 示例/注意事项 |
---|---|---|
默认构造函数 | 自定义类作为成员变量时,需保证其存在默认构造函数(除非在初始化列表显式初始化) | class A { B b; }; // B 需有无参构造,否则报错 A a; // 自动调用 B::B() |
初始化列表 | 自定义类成员变量应在构造函数初始化列表中初始化,而非构造函数体内 | class A { B b; }; A::A() : b(100) {} // 正确,调用 B::B(int) A::A() { b = B(100); } // 错误,先调用 B::B() 再赋值,产生临时对象 |
指针成员 | 自定义类的指针成员无需默认构造(指针仅存储地址,不自动创建对象) | class A { B* b; }; // 合法,b 为随机地址(需手动初始化) |
数组初始化 | 自定义类数组默认调用无参构造,若无则报错;指针数组无此限制 | C arr[5]; // 调用 C::C() 5次 C* parr[5]; // 合法,parr 元素为随机地址 |
不卡死控制台的输入检测
核心要点 | 函数 | 作用 | 使用示例 |
---|---|---|---|
非阻塞输入 | _kbhit() |
检测是否有键盘输入,有输入返回1,否则返回0 | if (_kbhit()) { … } |
获取输入 | _getch() |
获取键盘输入字符,不显示在控制台,无需按回车 | int key = _getch(); |
配合使用 | —— | 避免_getch() 阻塞程序,实现非阻塞输入检测 |
while (true) { if (_kbhit()) { int key = _getch(); // 处理按键逻辑 } // 其他逻辑执行 } |
关于delete的使用
核心要点 | 场景 | 释放方式 | 示例/注意事项 |
---|---|---|---|
单个对象 | new 分配的单个对象 |
delete 指针; |
MyClass* obj = new MyClass(); delete obj; obj = nullptr; |
连续数组 | new[] 分配的连续对象数组 |
delete[] 数组指针; |
MyClass* arr = new MyClass[5]; delete[] arr; arr = nullptr; |
栈上指针数组 | 栈上存储的指针(指向堆上对象) | 遍历释放每个指针指向的对象,数组本身自动释放 | MyClass* arr2[5]; for (int i=0; i<5; i++) { delete arr2[i]; arr2[i]=nullptr; } // 栈数组 arr2 自动释放 |
堆上指针数组 | new[] 分配的指针数组(指向堆上对象) |
先释放每个指针指向的对象,再释放指针数组本身 | MyClass** arr3 = new MyClass*[5]; for (int i=0; i<5; i++) { delete arr3[i]; arr3[i]=nullptr; } delete[] arr3; arr3=nullptr; |
核心原则 | —— | 1. delete 与new 配对,delete[] 与new[] 配对2. 先释放对象,再释放指针数组 |
避免内存泄漏和野指针,释放后将指针置为nullptr |
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com