C++ 从 0 入门(二)|引用与指针区别、函数重载、内联函数(面试高频)

大家好,我是网域小星球。

本篇聚焦 C++ 面试核心考点,全是面试官必问、笔试题常考内容,衔接上一篇基础,不冗余、不堆砌,只讲核心用法 + 面试踩分点,所有代码 VS2022 可直接运行,学完能应对 C++ 基础面试的核心提问。

目录

一、核心学习目标(面试导向)

二、引用与指针的区别(面试必背,满分答案)

[1. 核心区别汇总(面试直接答)](#1. 核心区别汇总(面试直接答))

[2. 代码对比示例(直观理解)](#2. 代码对比示例(直观理解))

[3. 面试补充考点](#3. 面试补充考点)

[三、函数重载(C++ 核心特性,笔试必考)](#三、函数重载(C++ 核心特性,笔试必考))

[1. 函数重载概念](#1. 函数重载概念)

[2. 函数重载的 3 个条件(缺一不可)](#2. 函数重载的 3 个条件(缺一不可))

[3. 代码示例(笔试常考写法)](#3. 代码示例(笔试常考写法))

[4. 面试坑点(必避)](#4. 面试坑点(必避))

四、内联函数(inline,替代宏函数,面试高频)

[1. 内联函数作用](#1. 内联函数作用)

[2. 语法与用法](#2. 语法与用法)

[3. 内联函数核心规则(面试必背)](#3. 内联函数核心规则(面试必背))

[4. 面试考点:内联函数与宏函数的区别](#4. 面试考点:内联函数与宏函数的区别)

五、本章核心总结(面试速记)

下期预告


一、核心学习目标(面试导向)

  1. 吃透 引用与指针的区别(面试必问,重中之重)
  2. 掌握 函数重载(C++ 核心特性,笔试常考)
  3. 理解 内联函数(替代宏函数,面试高频考点)
  4. 掌握三大知识点的笔试题写法,避免踩坑

二、引用与指针的区别(面试必背,满分答案)

这是 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 个条件(缺一不可)

  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. 内联函数核心规则(面试必背)

  1. inline编译器建议,不是强制要求(复杂函数,编译器会忽略内联);
  2. 内联函数 不能有循环、switch、递归(复杂逻辑,编译器不会内联);
  3. 内联函数通常写在 头文件 中(方便编译器嵌入调用);
  4. 内联函数无函数调用开销,适合短小、频繁调用的函数(比如工具函数)。

4. 面试考点:内联函数与宏函数的区别

对比维度 内联函数(inline) 宏函数(#define)
类型检查 有严格的类型检查 无类型检查,纯文本替换
安全性 安全,避免优先级问题 不安全,易因优先级出错
调试 可调试(和普通函数一样) 不可调试(预编译阶段替换)
适用场景 短小、频繁调用的函数 简单常量替换、简单计算

五、本章核心总结(面试速记)

  1. 引用是别名(无内存、不可改指向),指针是地址变量(有内存、可改指向);
  2. 函数重载 3 条件:同名、同作用域、参数列表不同(返回值不算);
  3. 内联函数替代宏函数,有类型检查、可调试,适合短小频繁调用;
  4. 三大知识点是 C++ 基础面试的核心,必须熟练掌握代码写法和区别。

下期预告

C++ 从 0 入门(三)|类与对象基础(封装、构造函数、析构函数,面试必考)

相关推荐
代码中介商2 小时前
C++ 多态与虚函数入门:从概念到规则
开发语言·c++
kyle~2 小时前
工业以太网协议---EtherCAT
开发语言·c++·网络协议·机器人·ros2
say_fall2 小时前
深入理解AVL树:平衡调整机制与性能优化实战
开发语言·数据结构·c++·学习
Ruihong2 小时前
你的 Vue 3 defineAsyncComponent(),VuReact 会编译成什么样的 React?
vue.js·react.js·面试
Moe4882 小时前
Spring AI文档学习:多聊天模型配置
后端·面试·架构
赖在沙发上的熊2 小时前
Python数据序列
开发语言·python
Ruihong2 小时前
你的 Vue 路由,VuReact 会编译成什么样的 React 路由?
vue.js·react.js·面试
Hello--_--World2 小时前
Js面试题目录表
开发语言·javascript·ecmascript
tankeven2 小时前
HJ180 游游的最长稳定子数组
c++·算法