C++ STL 之智能指针详解:用法 × 原理 × 面试

C++高频面试问题总结 技术交流可以加: 本人微信:xcg852390212 本人qq:852390212 学习交流qq群1(已满): 962535112 学习交流qq群2: 780902027 C++常见面试问题汇总 指针和引用的区别 堆和栈的区别 new和delete是如何实现的,new 与 malloc的异同处 C和C++的区别 C++、Java的联系与区别,包括语言特性、垃圾回收、应用场景等(java的垃圾... 阅读详情

C++ STL 之智能指针详解:用法 × 原理 × 面试

三段式:先讲怎么用,再讲底层为什么这样设计,最后给口语化面试答案。


一、用法速查

1.1 unique_ptr —— 独占所有权

同一时刻只有一个 unique_ptr 指向某块资源。禁止拷贝,只支持移动。

#include <memory>
#include <iostream>
#include <vector>
using namespace std;

struct Widget {
    int id;
    Widget(int i) : id(i) { cout << "Widget(" << id << ")\n"; }
    ~Widget() { cout << "~Widget(" << id << ")\n"; }
};

int main() {
    auto u1 = make_unique<Widget>(1);

    u1.reset(new Widget(2));

    Widget *raw = u1.get();
    cout << raw->id << "\n";

    Widget *leaked = u1.release();
    delete leaked;

    auto deleter = [](Widget *p) {
        cout << "自定义删除器\n";
        delete p;
    };
    unique_ptr<Widget, decltype(deleter)> u2(new Widget(3), deleter);

    auto u3 = make_unique<Widget>(4);
    auto u4 = move(u3);

    vector<unique_ptr<Widget>> vec;
    vec.push_back(make_unique<Widget>(5));
}

1.2 shared_ptr —— 共享所有权

引用计数共享所有权,最后一个 shared_ptr 销毁时释放资源。

#include <memory>
#include <iostream>
using namespace std;

struct Resource {
    int val;
    Resource(int v) : val(v) { cout << "Resource(" << v << ") created\n"; }
    ~Resource() { cout << "Resource(" << val << ") destroyed\n"; }
};

int main() {
    auto sp1 = make_shared<Resource>(100);

    auto sp2 = sp1;
    cout << "use_count: " << sp1.use_count() << "\n";

    cout << sp1->val << "\n";
    cout << (*sp1).val << "\n";

    sp2.reset();
    sp1.reset(new Resource(200));

    auto file_deleter = [](FILE *fp) {
        cout << "关闭文件\n";
        fclose(fp);
    };
    shared_ptr<FILE> sp_fp(fopen("test.txt", "w"), file_deleter);

    shared_ptr<int> sp_arr(new int[10]{}, [](int *p) { delete[] p; });
}

shared_ptr 拷贝是 O(1),只有原子自增。

1.3 weak_ptr —— 弱引用 / 打破循环

不控制生命周期,通过 lock() 原子升级到 shared_ptr。

#include <memory>
#include <iostream>
using namespace std;

int main() {
    auto sp = make_shared<int>(42);
    weak_ptr<int> wp = sp;

    cout << "use_count: " << sp.use_count() << "\n";

    if (auto locked = wp.lock()) {
        cout << "值: " << *locked << "\n";
    } else {
        cout << "对象已释放\n";
    }

    sp.reset();

    auto locked2 = wp.lock();
    if (!locked2) {
        cout << "lock 返回空\n";
    }
}

循环引用示例:

struct Child;

struct Parent {
    vector<shared_ptr<Child>> children;
    ~Parent() { cout << "~Parent\n"; }
};

struct Child {
    weak_ptr<Parent> parent;
    ~Child() { cout << "~Child\n"; }
};

int main() {
    auto p = make_shared<Parent>();
    auto c = make_shared<Child>();
    p->children.push_back(c);
    c->parent = p;
}

1.4 enable_shared_from_this —— 安全返回 this

继承 enable_shared_from_this<T>,调用 shared_from_this() 返回同一控制块的 shared_ptr,避免 double-free。

#include <memory>
#include <iostream>
#include <vector>
using namespace std;

struct Node : enable_shared_from_this<Node> {
    int val;
    vector<shared_ptr<Node>> neighbors;

    Node(int v) : val(v) {}

    void add_neighbor(shared_ptr<Node> n) {
        neighbors.push_back(n);
    }

    shared_ptr<Node> shared_self() {
        return shared_from_this();
    }
};

int main() {
    auto n1 = make_shared<Node>(1);
    auto n2 = make_shared<Node>(2);

    n2->add_neighbor(n1->shared_self());
    cout << "Node1 use_count: " << n1.use_count() << "\n";
}

只有已被 shared_ptr 管理的对象才能调用 shared_from_this(),栈对象调用会抛出 bad_weak_ptr。

1.5 快速查表

操作unique_ptrshared_ptrweak_ptr
创建make_unique<T>(args)make_shared<T>(args)wp = sp
获取指针.get().get().lock() 升级
释放所有权.release()——
重置.reset().reset().reset()
判空if (!up)if (!sp).expired()
引用计数—.use_count().use_count()
自定义删除器支持(影响 sizeof)支持(不影响 sizeof)—
拷贝禁止引用计数 +1引用计数不变

二、底层原理

2.1 unique_ptr 的结构——EBO 与零开销

unique_ptr 内部存储一个 T* 和一个删除器。当删除器是空类时,通过 EBO(空基类优化)让它不占空间。

template<typename T, typename Deleter = default_delete<T>>
class unique_ptr {
    // tuple<T*, Deleter>
    // Deleter 为空类 → EBO → 0 字节
};

unique_ptr<T>

指针 ptr
8 字节

删除器
空类 EBO → 0 字节

总大小 = 8 字节
等于裸指针

  • sizeof(unique_ptr<T>) == sizeof(T*)(x64 下 8 字节)
  • 有状态删除器(函数指针、有捕获 lambda)会让 sizeof 增大
  • unique_ptr<T[]> 偏特化:析构调用 delete[],支持 operator[]

没有引用计数,没有控制块——零成本抽象。

2.2 shared_ptr 的控制块——双计数模型

shared_ptr 内部有两个指针:裸指针(指向对象)和控制块指针(指向堆上的 control block)。

控制块结构:

control_block(堆上分配)
┌──────────────────────────────────────────┐
│  strong ref count(强引用计数)            │
│  weak ref count(弱引用计数)              │
│  deleter(删除器,类型擦除后的函数对象)     │
│  allocator(分配器)                      │
└──────────────────────────────────────────┘

shared_ptr A

T 对象

shared_ptr B

控制块

强引用计数
对象生命周期

弱引用计数
控制块生命周期

  • strong ref:指向对象的 shared_ptr 数量,归零时销毁对象
  • weak ref:指向控制块的 weak_ptr 数量,strong + weak 都归零时释放控制块

2.3 make_shared 为什么更好

// 两次分配
shared_ptr<Widget> sp(new Widget(42));
// 分配1: new Widget(42)
// 分配2: new control_block

// 一次分配
auto sp2 = make_shared<Widget>(42);
// 一次 malloc: control_block + Widget 连续内存

优势:

  1. 减少一次堆分配
  2. 缓存友好——控制块和对象在同一 cache line
  3. 异常安全——无裸 new 中间状态

陷阱:生命周期延长。只要还有 weak_ptr 指向控制块,即使 strong ref 已归零、对象已析构,控制块所在的那一整块内存一直不得释放。大对象 + 长生命周期 weak_ptr 可能造成内存滞留。

2.4 weak_ptr 的工作原理

weak_ptr 和对应的 shared_ptr 共享同一控制块,但只增加 weak ref,不增加 strong ref。

// lock() 简化语义
shared_ptr<T> lock() noexcept {
    if (控制块.strong_ref > 0) {
        原子操作 ++strong_ref;
        return shared_ptr<T>(裸指针, 控制块);
    }
    return nullptr;
}

lock() 是原子操作:读取 strong ref 和自增之间没有竞态。不需要先 expired() 再 lock()——不存在 TOCTOU 问题。

2.5 enable_shared_from_this 的原理

内部藏了一个 weak_ptr<T>。类第一次被 shared_ptr 管理时(如 make_shared),shared_ptr 构造函数检测到 T 继承自 enable_shared_from_this<T>,把内部的 weak_ptr 指向自己的控制块。

shared_from_this() 等价于 weak_ptr::lock()——从同一控制块安全返回 shared_ptr。

栈对象不曾被 shared_ptr 管理过,内部 weak_ptr 为空,lock() 返回空或抛出 bad_weak_ptr。

2.6 循环引用

struct A { shared_ptr<B> b; };
struct B { shared_ptr<A> a; };

auto a = make_shared<A>();
auto b = make_shared<B>();
a->b = b;
b->a = a;
// 双方引用计数都是 2 → 谁也释放不了谁

解法:把其中一方的 shared_ptr 改为 weak_ptr。对谁的生命周期不负责任,谁就持有 weak_ptr:

struct A { shared_ptr<B> b; };
struct B { weak_ptr<A> a; };

2.7 性能开销速查

操作开销说明
unique_ptr 构造/析构0等同于裸指针 new/delete
shared_ptr 拷贝(原子自增)~25-40nsCAS 原子操作
shared_ptr 析构(原子自减)~25-40ns归零时走虚函数删除器
weak_ptr::lock()~25-40ns + 分支原子读 + 条件自增
make_shared vs 分开 new减少 ~50ns + 1 次 malloc控制块 + 对象合一块

shared_ptr 每次拷贝和销毁都涉及原子操作。高并发下大量拷贝 shared_ptr,CAS 缓存行 bouncing 的开销可能远超 40ns。


三、面试题 + 口语化答案

Q1:sizeof(unique_ptr<T>) 是多少?

“默认 8 字节(x64),和裸指针一样大。因为 default_delete 是空类,EBO 不占额外空间。有状态的删除器(存了函数指针或上下文)会让 sizeof 变大。”

Q2:make_shared 为什么比直接 new 好?有什么缺点?

“一次分配代替两次,控制块和对象合一块内存——减少 malloc、缓存友好、异常安全。缺点是控制块和对象绑在一起,只要 weak_ptr 活着,即使对象已析构,那块内存也不释放。大对象 + 长生命周期 weak_ptr 可能内存滞留。”

Q3:循环引用怎么解决?

“把其中一方的 shared_ptr 改成 weak_ptr。子持有父的 weak_ptr——子不控制父生命周期,需要时通过 lock() 临时升级成 shared_ptr。判断标准:一方对另一方的生命周期不负责任。”

Q4:weak_ptr::lock() 是原子的吗?

“是。内部原子读 strong ref,非零则原子自增并返回 shared_ptr;为零返回 nullptr。不需要先 expired() 再 lock(),不存在 TOCTOU 问题。”

Q5:自定义删除器影响 sizeof 吗?

“unique_ptr 会——默认删除器是空类(0 字节),有状态的删除器让 sizeof 变大。shared_ptr 不会——删除器存在控制块里,类型擦除后用虚函数调用,sizeof 始终两个指针(16 字节,x64)。”

Q6:enable_shared_from_this 为什么不能用在栈对象?

“因为 shared_from_this() 内部是 weak_ptr::lock()——需要从已有控制块返回 shared_ptr。栈对象没被 shared_ptr 管理过,控制块不存在,内部 weak_ptr 是空的,lock() 返回空或抛出 bad_weak_ptr。”

Q7:shared_ptr 的性能开销多大?

“每次拷贝构造/赋值内部是 CAS 原子操作,x86 下约 25-40ns。热路径上频繁拷贝 shared_ptr(如每秒百万次异步回调捕获)这个开销显著。推荐用移动构造(不涉及原子操作)或 unique_ptr + 借用。”

Q8:控制块在哪分配?weak_ptr 参与生命周期吗?

“控制块在堆上。strong ref 控制对象生命周期——归零时销毁对象。weak ref 控制控制块生命周期——strong + weak 都归零时控制块才释放。这就是为什么 weak_ptr 可以安全地用 lock() 去试:控制块始终有效。”

Q9:unique_ptr 可以用于数组吗?

“可以。unique_ptr<T[]> 是偏特化,析构调用 delete[],支持 operator[]。shared_ptr 默认是 delete,不支持数组——需手动传 default_delete<T[]> 或 lambda。C++17 后 shared_ptr<T[]> 也有了偏特化。”

Q10:make_unique 有异常安全优势吗?

“相比裸 new 确实不会因构造函数抛异常而泄漏,但现代代码很少裸 new 了。make_unique 的真正价值是语义清晰:一眼看出是独占指针。”


一句话总结:unique_ptr 零成本独占(sizeof = 裸指针),shared_ptr 双计数控制块共享(拷贝约 25-40ns 原子 CAS),weak_ptr 通过 weak ref 安全观测不延长生命周期;理解控制块结构、make_shared 一次分配的优势与生命周期延长副作用、enable_shared_from_this 的 weak_ptr 底层原理,是用好和面好智能指针的关键。

如何回答C++面试中关于智能指针的问题? 如何回答C++面试中关于智能指针的问题? 1、  什么是智能指针? 2、  分析下常见的智能指针有哪些? 3、实现一个智能指针呗?(没具体说写哪个,建议默认写:unique_ptr) 1、答:智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露(利用自动调用类的析构函数来释放内存)。它的一种通用实现技 阅读详情

相关推荐

C++ STL(面试复习整理)

文章目录1、六大组件介绍2、容器vectorlistdequestackqueue & priority_queue红黑树为底层的容器及红黑树hash表为底层的容器及hash表3、迭代器4、空间管理智能指针 1、六大组件介绍 2、容器 vector list deque stack queue & priority_queue 红黑树为底层的容器及红黑树 hash表为底层的容器及h...

Chuwei_xu的博客 4293

c++ 常用面试题整理(不定时更新)

面试中常见的C++面试题总结,快来看看,是否对你有帮助!

qq_28928005的博客 1万+

C++面试八股文记录

C++面试题 个人学习记录

ccd9287的博客 1070

C++智能指针总结(面试常问)

C++智能指针总结(面试常问)1.智能指针的实现原理2. C++11四种智能指针总结2.1 auto_ptr:2.2 unique_ptr:2.3 share_ptr:2.4 weak_ptr: 1.智能指针的实现原理 智能指针的实现原理就是在一个类的内部封装了类对象的指针,然后在析构函数里对我们的类对象指针进行释放,因为类的析构是在类对象生命期结束时自动调用的,这样我们就省去了手动释放内存的操作,避免忘记手动释放导致的内存泄漏。 2. C++11四种智能指针总结 2.1 auto_ptr: auto_

Sunrise的博客 5147

C和C++面试--看的不多只看一篇

可以通过面试题的形式检验和巩固自己对于语言的掌握情况

yaoming168的专栏 1822

二维otsu算法python_OpenCV-Python系列之OTSU算法

上一个教程中,我们谈到了关于图像二值化的两种方法,一种是固定阈值法,另一种是自适应阈值法,总的来说,自适应阈值法在某些方面要由于固定阈值法,但还没完,这次我们将隆重介绍我们的重量级选手,也就是OTSU算法(又称为大津算法和最大类间方差法)。最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU,是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像...

weixin_28834169的博客 1426

【C++面试系列】基础c++/STL题单

本文总结了C++岗位面试常见问题,主要涵盖以下核心内容: C++基础:C与C++区别、const与#define对比、static关键字用法、sizeof与strlen差异; 面向对象:三大特性(封装/继承/多态)、构造/析构函数规则、虚函数实现原理(虚函数表)、重载/覆盖/隐藏区别; 内存管理:new/delete与malloc/free对比、内存泄漏防范(推荐智能指针)、unique_ptr与shared_ptr特性; STL容器:vector/链表/hash表等底层实现及时间复杂度,map与unord

分享unity,c#,c++相关内容 767

火星遥感数据的获取与处理工具安装详解

有关火星遥感影像数据的那些事...

FengYingLuo的博客 5573

深入浅出C++ STL:统领STL全局

全面解析STL的核心概念、应用场景及学习路径。

有梦想的电信狗 1795

利用 HTML5 与 SICF 打造 CRM WebClient UI 多附件上传 —— 从原型到生产的全流程揭秘

通过HTML5 标准 + SICF 服务 + BOL/GOS API的三位一体方案,我们无需修改 SAP 标准代码,就能让 CRM WebClient UI 获得现代化的多附件上传体验。浏览器负责多选与进度提示,SICF 负责安全中转,ABAP 负责权限校验与落库。你可以先在质量系统快速原型,再逐步完善权限、异常处理与 UI 细节。按照本文的方法落地,哪怕一次上传几百份文件,也能轻松搞定,真正把时间还给业务。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 335

MicroPython学习:在STM32上进行移植

本文将介绍如何在STM32上移植MicroPython,并提供相应的源代码。通过以上步骤,你已经成功地将MicroPython移植到STM32上,并可以使用MicroPython语言编写和运行代码。你可以进一步探索MicroPython的功能和API,以利用STM32的各种外设和功能。使用STM32CubeProgrammer或其他适当的烧录工具,将编译生成的MicroPython固件烧录到STM32微控制器中。打开该文件,并根据你的STM32微控制器类型进行必要的配置更改。模块来控制STM32的LED。

JeeVue的博客 1237

C++ 面试总结

/ 资源获取即初始化private:FILE* file;// 禁止拷贝// 使用:// 使用文件} // 自动关闭文件,即使发生异常。

dingyahui的博客 1104

AUTOSAR从入门到精通-诊断事件管理模块(DEM)(四)

在 Autosar 中,诊断事件是指在车辆电子系统中发生的特定事件,可以用于诊断和故障排除。DEM模块通过EventId和相关的EventName来表示每个诊断事件。诊断事件的状态代表了监控器的结果,DEM模块通过RTE或其他BSW模块从SW-C接收监控器的结果。DEM模块使用EventId来管理系统中每个诊断事件的状态,并对各个测试结果执行所需的操作,例如存储冻结帧/拓展帧。所有监控器和BSW模块使用EventId作为符号化的EventName来管理诊断事件。

getusushu的博客 1509

【c++面试之智能指针】【万字长文】【超级详细】最详细解析四种智能指针,面试题汇总及解答,妈妈再也不担心面试官考我智能指针了。

【c++面试之智能指针】【万字长文】【超级详细】最详细解析四种智能指针,面试题汇总即解答,妈妈再也不担心面试官考我智能指针了。

weixin_41937380的博客 1550

Pointnet++改进91:2025最新改进模块-RepMBConv模块

本文提出了一种改进PointNet++网络的方法,通过在特征提取模块中引入RepMBConv结构来提升模型性能。主要内容包括:1)理论部分介绍了RepMBConv的设计原理,包含自监督学习框架、动态上下文建模等创新点;2)详细给出了三步修改步骤:创建包含RepMBConv的Python模块、在pointnet2_utils.py中添加注意力机制、修改pointnet2_sem_seg.py主网络结构;3)代码实现展示了如何将RepMBConv集成到PointNetSetAbstraction模块中,形成Po

AIcurator的博客 274

Modbus通信从入门到精通_2_Modbus TCP通信详解及仿真(搭建ModbusTCP仿真环境:创建虚拟PLC并进行ModbusTCP通讯;寄存器与PLC中映射关系;适合理解如何编写上位机)

LocalPort”是PLC的端口,最终的设置如下图所示:(相关的设置都可以查看帮助文档)P#DB1.DBX0.0 BYTE28是以指针形式表示的DB1的DBX0.0开始(在使用的西门子Modbus tcp的程序块中设置的“MB_HOLD_REG”输出寄存器),其有28个字节(28个字节对应14个寄存器),4001是第一个寄存器,往后数14个即可。在上面的基础上,增加一个“DB1”的“组对象”,同时将“MW0”的组对象禁止(双击组对象,“Active”取消勾选),启动之后发现无法连接。

分享学习成长历程,Winter is coming! 1万+

C++面试总结(持续更新)

C++面经总结1 C++基础1.1 C和C++的区别?1.2 指针和引用的区别1.3 new/delete与malloc/free的区别 1 C++基础 1.1 C和C++的区别? 回答一: C是面向过程的语言,C++是面向对象的语言 C++使用new和delete对内存分配的运算符,取代了c中的malloc和free C++中有引用的概念,C中没有 C++中引入类的概念,C中没有 C++有函数重载,C中不能 C只能在函数的开头处声明和定义,C++随时定义使用 回答二: 设计思想上: C++是面向对象

catkin_ws的博客 2046

YOLOv11的多任务学习:检测+分割+姿态估计-(扩展模型头部分支,实现多任务联合训练)

YOLOv11作为Ultralytics团队于2024年9月发布的最新YOLO系列模型,在前代版本基础上进行了多项架构创新,使其成为支持多任务学习的理想框架。其核心改进包括引入C2PSA(跨阶段局部自注意)模块,将跨阶段局部网络和自注意机制优势结合,使模型能够更有效地跨多层捕获上下文信息。C3k2模块取代了之前的C2f模块,作为CSP Bottleneck的自定义实现,使用两个较小卷积核而非一个大卷积核,在保持准确性的同时提高了效率。 多任务学习(Multi-Task Learning, MTL)在YOL

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 655

C++语言:面试官喜欢问什么

通过对C++技术面试题中高频关键词的分析,本文总结了面向对象编程、内存管理、多线程、STL容器、智能指针、底层原理等核心内容。这些关键词反映了后端开发、嵌入式、算法岗、系统开发等岗位的常见考察方向。文章详细解析了虚函数、智能指针、多态、底层实现原理、STL容器、多线程与线程安全、C++11新特性等重点内容,并提供了学习建议和推荐资源。掌握这些核心知识模块,能够帮助应聘者更有针对性地准备C++技术面试,提升通过率。

ocean2103的专栏 1523

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

面试题及解答:STL

STL(Standard Template Library)是C++中非常重要的一部分,在Qt/C++面试中通常会涉及到对其理解和应用程度的考察。下面我将为你梳理STL常见的面试考察方向、一些典型面试题及解答要点。

极地星辰 894

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

c++ 面试题(2)--STL ,新特性

容器可以用于存放各种类型的数据(基本类型的变量,对象等)的数据结构,都是模板类,分为顺序容 器、关联式容器、容器适配器三种类型,三种类型容器特性分别如下:1.顺序容器容器并非排序的,元素的插入位置同元素的值无关。包含vectordequelist,具体实现原理如下:(1)vector头文件动态数组。元素在内存。

cat_fish_rain的博客 724

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++智能指针与STL高阶应用:从原理到实战的进阶指南

在C++编程中,内存管理和数据结构的有效运用是提升代码质量与性能的核心。智能指针通过自动化资源管理,解决了传统手动内存分配可能引发的内存泄漏问题,其原理基于引用计数与所有权语义,为复杂系统提供了安全的基础。结合STL容器与算法,开发者能够构建高效、可维护的应用程序,尤其在并发编程和回调机制中展现技术价值。本文聚焦于shared_ptr的定制删除器与内存池集成、weak_ptr在缓存设计中的应用,以及std::function与STL算法的高阶技巧,通过实战案例如异步任务队列,帮助开发者深入理解这些工具在工程

keke1314520的博客 357

C++面试宝典

青玉白露 编译过程 编译链接 1.预处理器 C/C++的预处理器其实就是一个词法(而不是语法)预处理器,其主要完成文本替换、宏展开以及删除注释等,完成这些操作之后,将会获得真正地**“源代码”**。 常见的include语句即是一个预处理器命名,在预处理器中它将所有的头文件包含进来。(该步骤的文件扩展名为****.i) 2.编译器 在这一步骤,将.i文件翻译为.s**,得到**汇编程序语言,值得注意的是所有的编译器输出的汇编语言都是同一种语法。 注:内联函数就是在这一环节“膨胀”进源码的,它的作用即在于:不

青玉白露的博客 2535

cpp面试高频题

(1) 指针和引用的区别 引用: 1.引用初始化完成,将一直绑定一个对象,无法令引用绑定另外一个对象,这就是说引用必须初始化。 2.注意引用初始化的时候,绑定的是一个对象,而引用本身不是一个对象,所以不能定义引用的引用 3.引用的对象类型之间必须匹配 指针: 1.指针本身是一个对象,对对象的操作,对指针同样可以,例如拷贝赋值等 2.指针没有规定必须初始化,指针没有初始化,编译器会默认分配一个不确定...

qq_36222714的博客 2321

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 242
上一篇: C++ STL之vector详解:从使用到底层,再到面试八股
下一篇: C++ STL之正则表达式详解
Ricky_Theseus
博客等级 码龄3年 126粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ricky_Theseus

感谢大家,祝您生活愉快

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值