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) {}
};
六、总结与学习建议
- 类相互包含:前向声明+指针即可解决。
- vector初始化:掌握 6 种写法,常考面试题。
- 递归函数:必须有退出条件,否则无限递归。
- 内存分配:理解按值传递、指针传递、引用传递的区别。
- 类中常量:推荐用
static const
或enum
。
📌 本文整理了多个 C++ 常见考点与易错点,配合示例代码与详细解释,适合初学者快速理解与实战演练。