大家好,我是网域小星球。
本篇聚焦 C++ 面试核心考点,全是面试官必问、笔试题常考内容,衔接上一篇基础,不冗余、不堆砌,只讲核心用法 + 面试踩分点,所有代码 VS2022 可直接运行,学完能应对 C++ 基础面试的核心提问。
目录
[1. 核心区别汇总(面试直接答)](#1. 核心区别汇总(面试直接答))
[2. 代码对比示例(直观理解)](#2. 代码对比示例(直观理解))
[3. 面试补充考点](#3. 面试补充考点)
[三、函数重载(C++ 核心特性,笔试必考)](#三、函数重载(C++ 核心特性,笔试必考))
[1. 函数重载概念](#1. 函数重载概念)
[2. 函数重载的 3 个条件(缺一不可)](#2. 函数重载的 3 个条件(缺一不可))
[3. 代码示例(笔试常考写法)](#3. 代码示例(笔试常考写法))
[4. 面试坑点(必避)](#4. 面试坑点(必避))
[1. 内联函数作用](#1. 内联函数作用)
[2. 语法与用法](#2. 语法与用法)
[3. 内联函数核心规则(面试必背)](#3. 内联函数核心规则(面试必背))
[4. 面试考点:内联函数与宏函数的区别](#4. 面试考点:内联函数与宏函数的区别)
一、核心学习目标(面试导向)
- 吃透 引用与指针的区别(面试必问,重中之重)
- 掌握 函数重载(C++ 核心特性,笔试常考)
- 理解 内联函数(替代宏函数,面试高频考点)
- 掌握三大知识点的笔试题写法,避免踩坑
二、引用与指针的区别(面试必背,满分答案)
这是 C++ 入门面试最常问的题,记住 5 个核心区别,直接应对面试官提问,结合代码理解更易记。
1. 核心区别汇总(面试直接答)
| 对比维度 | 引用(&) | 指针(*) |
|---|---|---|
| 本质 | 变量的别名,无独立内存 | 指向变量地址的变量,有独立内存 |
| 初始化 | 必须初始化,绑定一个变量 | 可初始化,也可先定义后赋值(可空) |
| 指向更改 | 一旦绑定,无法更改指向 | 可随时更改指向的变量 |
| 空值 | 无空引用,不存在野引用 | 有空指针(NULL/nullptr)、野指针 |
| 内存开销 | 无额外内存开销 | 占用 4/8 字节(取决于系统) |
2. 代码对比示例(直观理解)
cpp
#include <iostream>
using namespace std;
int main()
{
// 引用示例
int a = 10;
int &b = a; // 必须初始化,绑定a
b = 20; // 更改别名,a同步改变(不是更改指向)
// 指针示例
int *p = &a; // 可初始化,指向a
p = &b; // 可更改指向,指向b(原指向失效)
cout << "a = " << a << endl; // 输出20
cout << "*p = " << *p << endl; // 输出20
return 0;
}
3. 面试补充考点
- 引用常用于 函数传参、函数返回值(减少拷贝,提高效率);
- 指针常用于 动态内存管理、数组遍历、多态实现;
- C++ 中优先用引用(安全、简洁),需要更改指向时用指针。
三、函数重载(C++ 核心特性,笔试必考)
1. 函数重载概念
同一作用域内 ,函数名相同,参数列表不同(参数个数、类型、顺序不同),编译器自动匹配调用,解决函数命名冗余问题。
2. 函数重载的 3 个条件(缺一不可)
- 函数名 完全相同;
- 参数列表 不同(个数不同 / 类型不同 / 顺序不同);
- 作用域相同(比如都在全局作用域)。
3. 代码示例(笔试常考写法)
cpp
#include <iostream>
using namespace std;
// 1. 参数个数不同
void add(int a, int b)
{
cout << "两个int相加:" << a + b << endl;
}
void add(int a, int b, int c)
{
cout << "三个int相加:" << a + b + c << endl;
}
// 2. 参数类型不同
void add(double a, double b)
{
cout << "两个double相加:" << a + b << endl;
}
// 3. 参数顺序不同
void add(int a, double b)
{
cout << "int+double:" << a + b << endl;
}
int main()
{
add(10, 20); // 调用两个int的add
add(10, 20, 30); // 调用三个int的add
add(3.14, 5.20); // 调用两个double的add
add(10, 3.14); // 调用int+double的add
return 0;
}
4. 面试坑点(必避)
- 函数返回值不同,不能构成函数重载(编译器无法区分);
- 参数名不同,不能构成函数重载(参数列表本质无区别);
- 引用作为参数时,
const修饰会构成重载(比如void func(int&)和void func(const int&))。
四、内联函数(inline,替代宏函数,面试高频)
1. 内联函数作用
替代 C 语言的宏函数,解决宏函数无类型检查、优先级混乱的问题,同时保留宏函数 "无调用开销" 的优点。
2. 语法与用法
用 inline 关键字修饰函数,编译器会将函数代码直接嵌入到调用处,避免函数调用的栈帧开销。
cpp
#include <iostream>
using namespace std;
// 内联函数(替代宏函数 SQR(x) ((x)*(x)) )
inline int sqr(int x)
{
return x * x;
}
int main()
{
int res = sqr(5);
// 编译器会直接替换为 res = 5 * 5;
cout << res << endl; // 输出25
return 0;
}
3. 内联函数核心规则(面试必背)
inline是 编译器建议,不是强制要求(复杂函数,编译器会忽略内联);- 内联函数 不能有循环、switch、递归(复杂逻辑,编译器不会内联);
- 内联函数通常写在 头文件 中(方便编译器嵌入调用);
- 内联函数无函数调用开销,适合短小、频繁调用的函数(比如工具函数)。
4. 面试考点:内联函数与宏函数的区别
| 对比维度 | 内联函数(inline) | 宏函数(#define) |
|---|---|---|
| 类型检查 | 有严格的类型检查 | 无类型检查,纯文本替换 |
| 安全性 | 安全,避免优先级问题 | 不安全,易因优先级出错 |
| 调试 | 可调试(和普通函数一样) | 不可调试(预编译阶段替换) |
| 适用场景 | 短小、频繁调用的函数 | 简单常量替换、简单计算 |
五、本章核心总结(面试速记)
- 引用是别名(无内存、不可改指向),指针是地址变量(有内存、可改指向);
- 函数重载 3 条件:同名、同作用域、参数列表不同(返回值不算);
- 内联函数替代宏函数,有类型检查、可调试,适合短小频繁调用;
- 三大知识点是 C++ 基础面试的核心,必须熟练掌握代码写法和区别。
下期预告
C++ 从 0 入门(三)|类与对象基础(封装、构造函数、析构函数,面试必考)