当前位置: 首页 > news >正文

C++常见考点与易错点详细教程

C++常见考点与易错点详细教程

——类的相互包含、vector初始化、递归函数、内存分配、常量成员


一、类的相互包含与前向声明

1. 问题背景

题目要求定义两个类:

  • X 类中包含一个 Y 类型的对象。
  • Y 类中包含一个指向 X 的指针。

初学者编写时容易出现 编译错误

  • Y does not name a type —— 使用了未定义的类型。
  • incomplete type —— 使用了不完全类型。

2. 关键知识点

  • 前向声明:在使用某个类型之前,用 class 类名; 告诉编译器这个名字是一个类。

  • 不完全类型(incomplete type)

    • 可以定义指向不完全类型的指针。
    • 不能定义不完全类型的对象

3. 正确写法

class X; // 前向声明class Y {X* pX;  // 指向不完全类型的指针是允许的
};class X {Y objY; // 这里 Y 已经完整定义,可以作为对象
};

4. 总结

  • 可以定义指向不完全类型的指针
  • 不能创建不完全类型的对象

二、vector 的六种初始化方法

1. 直接列表初始化

vector<int> v1 = {1, 2, 3, 4, 5};
vector<int> v1_alt{1, 2, 3, 4, 5}; // 等价写法

2. 空容器

vector<int> v2; // 空容器,无元素

3. 用一个容器初始化另一个

vector<int> v3(v1); // v3 拷贝 v1 的内容

4. 使用迭代器范围初始化

vector<int> v4(v1.begin() + 2, v1.end() - 1); // {3,4,5}

5. 固定大小并初始化为默认值

vector<int> v5(10); // 10 个元素,默认值 0

6. 固定大小并初始化为指定值

vector<int> v6(10, 3); // 10 个元素,值都为 3

三、递归函数输出 vector 内容

1. 思路

  • 递归必须有 退出条件,否则会无限递归。
  • 每次打印当前下标元素,然后递归调用下一个下标。

2. 代码示例

#include <iostream>
#include <vector>
using namespace std;void show(const vector<int>& v, int index) {if (index >= v.size()) return;  // 退出条件cout << v[index] << " ";show(v, index + 1); // 递归调用
}int main() {vector<int> v = {1,2,3,4,5,6,7,8,9,10};show(v, 0);return 0;
}

四、内存分配与指针传递

1. 错误示例

void getMemory(char* p) {p = (char*)malloc(100); // 赋给了形参,函数结束后丢失
}
  • p 是临时变量,修改它并不会改变实参指针。
  • 导致内存泄漏或段错误。

2. 正确写法一:指向指针的指针

void getMemory(char** p) {*p = (char*)malloc(100);
}int main() {char* str = NULL;getMemory(&str);strcpy(str, "Hello World");printf("%s\n", str);free(str);
}

3. 正确写法二(C++):指针的引用

void getMemory(char*& p) { // 指针的引用p = new char[100];
}int main() {char* str = NULL;getMemory(str);strcpy(str, "Hello World");cout << str << endl;delete[] str;
}

五、类中常量成员的定义

1. 错误写法

class A {const int size = 10; // ❌ 错误,非静态成员常量不能这样定义
};

2. 正确写法

方法一:枚举
class A {enum { size = 10 };
};
方法二:静态常量成员
class A {static const int size = 10;
};
方法三:构造函数初始化列表
class A {const int size;
public:A() : size(10) {}
};

六、总结与学习建议

  1. 类相互包含:前向声明+指针即可解决。
  2. vector初始化:掌握 6 种写法,常考面试题。
  3. 递归函数:必须有退出条件,否则无限递归。
  4. 内存分配:理解按值传递、指针传递、引用传递的区别。
  5. 类中常量:推荐用 static constenum

📌 本文整理了多个 C++ 常见考点与易错点,配合示例代码与详细解释,适合初学者快速理解与实战演练。

http://www.dtcms.com/a/337475.html

相关文章:

  • SAP 数据脱敏工具:SNP TDO如何满足新颁敏感信息政策要求
  • 视觉语言导航(8)——任务驱动的架构增强 3.3
  • Redis——基础篇
  • 当使用STL容器去存放数据时,是存放对象合适,还是存放对象指针(对象地址)合适?
  • 将std容器的正向迭代器转换成反向迭代器
  • SCAU学习笔记 - 校科联自科二面通关指南
  • 淘宝扭蛋机小程序开发:引领电商娱乐化新潮流
  • Python循环语句 从入门到精通
  • Qt——对话框 QDialog
  • 51c大模型~合集170
  • Codeforces I Will Definitely Make It
  • 构建情感智能体:下一代AI心理助手的架构与实践
  • 折扣大牌点餐api接口对接适合本地生活吗?
  • QT中同时兼任VS2019和VS2022套件
  • 企业级大模型微调指南:数据准备、参数调优与部署优化全流程
  • 从0-1使用Fastmcp开发一个MCP服务,并部署到阿里云百炼 -持续更新中
  • 大数据服务完全分布式部署- 其他组件(阿里云版)
  • 数字隔离器,变频器安全运行的 “隐形引擎”
  • 深入对比:Chromium的base::RefCounted与std::shared_ptr——从线程安全到性能优化
  • 宏观认识 Unitree LiDAR L1 及其在自动驾驶中的应用
  • Avalonia实例实战七:动画
  • win环境断电强制拉库报ORA-600 kcbzib_kcrsds_1故障处理---惜分飞
  • 数据库:表和索引结构
  • 【datawhale组队学习】n8n TASK01
  • 知识蒸馏 Jensen-Shannon散度
  • 为什么品牌更愿意为新品打广告?
  • 机器学习——XGBoost算法
  • 力扣2道dp
  • easyexcel fastexcel 官方文档 easyexcel合并单元格
  • 项目会议怎么开才有效