Files
reference/docs/cpp.html
jaywcjlove ba8136dd4f doc: update docs/cpp.md (#589)
* 数据结构和开发技巧以及C++面试知识点

* Update cpp.md

修改md中cpp格式 ffa69578a6
2024-05-07 06:21:36 +00:00

2359 lines
394 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" data-color-mode="dark">
<head>
<meta charset="utf-8">
<title>C++ 备忘清单
&#x26; cpp cheatsheet &#x26; Quick Reference</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta description="提供基本语法和方法的 C++ 快速参考备忘单
入门,为开发人员分享快速参考备忘单。">
<meta keywords="cpp,reference,Quick,Reference,cheatsheet,cheat,sheet">
<link rel="icon" href="data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20height%3D%221em%22%20width%3D%221em%22%3E%20%3Cpath%20d%3D%22m21.66%2010.44-.98%204.18c-.84%203.61-2.5%205.07-5.62%204.77-.5-.04-1.04-.13-1.62-.27l-1.68-.4c-4.17-.99-5.46-3.05-4.48-7.23l.98-4.19c.2-.85.44-1.59.74-2.2%201.17-2.42%203.16-3.07%206.5-2.28l1.67.39c4.19.98%205.47%203.05%204.49%207.23Z%22%20fill%3D%22%23c9d1d9%22%2F%3E%20%3Cpath%20d%3D%22M15.06%2019.39c-.62.42-1.4.77-2.35%201.08l-1.58.52c-3.97%201.28-6.06.21-7.35-3.76L2.5%2013.28c-1.28-3.97-.22-6.07%203.75-7.35l1.58-.52c.41-.13.8-.24%201.17-.31-.3.61-.54%201.35-.74%202.2l-.98%204.19c-.98%204.18.31%206.24%204.48%207.23l1.68.4c.58.14%201.12.23%201.62.27Zm2.43-8.88c-.06%200-.12-.01-.19-.02l-4.85-1.23a.75.75%200%200%201%20.37-1.45l4.85%201.23a.748.748%200%200%201-.18%201.47Z%22%20fill%3D%22%23228e6c%22%20%2F%3E%20%3Cpath%20d%3D%22M14.56%2013.89c-.06%200-.12-.01-.19-.02l-2.91-.74a.75.75%200%200%201%20.37-1.45l2.91.74c.4.1.64.51.54.91-.08.34-.38.56-.72.56Z%22%20fill%3D%22%23228e6c%22%20%2F%3E%20%3C%2Fsvg%3E" type="image/svg+xml">
<link rel="stylesheet" href="../style/style.css">
<link rel="stylesheet" href="../style/katex.css">
</head>
<body><nav class="header-nav"><div class="max-container"><a href="../index.html" class="logo"><svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" height="1em" width="1em">
<path d="m21.66 10.44-.98 4.18c-.84 3.61-2.5 5.07-5.62 4.77-.5-.04-1.04-.13-1.62-.27l-1.68-.4c-4.17-.99-5.46-3.05-4.48-7.23l.98-4.19c.2-.85.44-1.59.74-2.2 1.17-2.42 3.16-3.07 6.5-2.28l1.67.39c4.19.98 5.47 3.05 4.49 7.23Z" fill="#c9d1d9"></path>
<path d="M15.06 19.39c-.62.42-1.4.77-2.35 1.08l-1.58.52c-3.97 1.28-6.06.21-7.35-3.76L2.5 13.28c-1.28-3.97-.22-6.07 3.75-7.35l1.58-.52c.41-.13.8-.24 1.17-.31-.3.61-.54 1.35-.74 2.2l-.98 4.19c-.98 4.18.31 6.24 4.48 7.23l1.68.4c.58.14 1.12.23 1.62.27Zm2.43-8.88c-.06 0-.12-.01-.19-.02l-4.85-1.23a.75.75 0 0 1 .37-1.45l4.85 1.23a.748.748 0 0 1-.18 1.47Z" fill="#228e6c"></path>
<path d="M14.56 13.89c-.06 0-.12-.01-.19-.02l-2.91-.74a.75.75 0 0 1 .37-1.45l2.91.74c.4.1.64.51.54.91-.08.34-.38.56-.72.56Z" fill="#228e6c"></path>
</svg>
<span class="title">Quick Reference</span></a><div class="menu"><a href="javascript:void(0);" class="searchbtn" id="searchbtn"><svg xmlns="http://www.w3.org/2000/svg" height="1em" width="1em" viewBox="0 0 18 18">
<path fill="currentColor" d="M17.71,16.29 L14.31,12.9 C15.4069846,11.5024547 16.0022094,9.77665502 16,8 C16,3.581722 12.418278,0 8,0 C3.581722,0 0,3.581722 0,8 C0,12.418278 3.581722,16 8,16 C9.77665502,16.0022094 11.5024547,15.4069846 12.9,14.31 L16.29,17.71 C16.4777666,17.8993127 16.7333625,18.0057983 17,18.0057983 C17.2666375,18.0057983 17.5222334,17.8993127 17.71,17.71 C17.8993127,17.5222334 18.0057983,17.2666375 18.0057983,17 C18.0057983,16.7333625 17.8993127,16.4777666 17.71,16.29 Z M2,8 C2,4.6862915 4.6862915,2 8,2 C11.3137085,2 14,4.6862915 14,8 C14,11.3137085 11.3137085,14 8,14 C4.6862915,14 2,11.3137085 2,8 Z"></path>
</svg><span>搜索</span><span>⌘K</span></a><a href="https://github.com/jaywcjlove/reference/blob/main/docs/cpp.md" class="" target="__blank"><svg viewBox="0 0 36 36" fill="currentColor" height="1em" width="1em"><path d="m33 6.4-3.7-3.7a1.71 1.71 0 0 0-2.36 0L23.65 6H6a2 2 0 0 0-2 2v22a2 2 0 0 0 2 2h22a2 2 0 0 0 2-2V11.76l3-3a1.67 1.67 0 0 0 0-2.36ZM18.83 20.13l-4.19.93 1-4.15 9.55-9.57 3.23 3.23ZM29.5 9.43 26.27 6.2l1.85-1.85 3.23 3.23Z"></path><path fill="none" d="M0 0h36v36H0z"></path></svg><span>编辑</span></a><button id="darkMode" type="button"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="light" height="1em" width="1em">
<path d="M6.995 12c0 2.761 2.246 5.007 5.007 5.007s5.007-2.246 5.007-5.007-2.246-5.007-5.007-5.007S6.995 9.239 6.995 12zM11 19h2v3h-2zm0-17h2v3h-2zm-9 9h3v2H2zm17 0h3v2h-3zM5.637 19.778l-1.414-1.414 2.121-2.121 1.414 1.414zM16.242 6.344l2.122-2.122 1.414 1.414-2.122 2.122zM6.344 7.759 4.223 5.637l1.415-1.414 2.12 2.122zm13.434 10.605-1.414 1.414-2.122-2.122 1.414-1.414z"></path>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" class="dark" height="1em" width="1em">
<path d="M12 11.807A9.002 9.002 0 0 1 10.049 2a9.942 9.942 0 0 0-5.12 2.735c-3.905 3.905-3.905 10.237 0 14.142 3.906 3.906 10.237 3.905 14.143 0a9.946 9.946 0 0 0 2.735-5.119A9.003 9.003 0 0 1 12 11.807z"></path>
</svg>
</button><script src="../js/dark.js?v=1.5.3"></script><a href="https://github.com/jaywcjlove/reference" class="" target="__blank"><svg viewBox="0 0 16 16" fill="currentColor" height="1em" width="1em"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path></svg></a></div></div></nav><div class="wrap h1body-exist max-container"><header class="wrap-header h1wrap"><h1 id="c-备忘清单"><svg xmlns="http://www.w3.org/2000/svg" height="1em" width="1em" viewBox="0 0 187 155">
<path fill="currentColor" d="M77.4039102,0.01171875 C104.893578,0.01171875 130.532863,14.8054453 144.312707,38.6186211 L110.875113,57.9682852 C103.978656,46.0481602 91.1520117,38.6428945 77.4039102,38.6428945 C56.1021016,38.6428945 38.7718008,55.9731953 38.7718008,77.2750039 C38.7718008,98.5758789 56.1021016,115.90618 77.4039102,115.90618 C91.1529453,115.90618 103.97959,108.500914 110.87698,96.5789219 L144.314574,115.927652 C130.53473,139.743629 104.895445,154.537355 77.4039102,154.537355 C34.800293,154.537355 0.140625,119.877688 0.140625,77.2750039 C0.140625,34.6713867 34.800293,0.01171875 77.4039102,0.01171875 Z M146.080934,64.3970117 L146.080934,72.9823398 L154.666262,72.9823398 L154.666262,81.5667344 L146.080934,81.5667344 L146.080934,90.1520625 L137.497473,90.1520625 L137.497473,81.5667344 L128.912145,81.5667344 L128.912145,72.9823398 L137.497473,72.9823398 L137.497473,64.3970117 L146.080934,64.3970117 Z M178.274047,64.3970117 L178.274047,72.9823398 L186.859375,72.9823398 L186.859375,81.5667344 L178.274047,81.5667344 L178.274047,90.1520625 L169.690586,90.1520625 L169.690586,81.5667344 L161.105258,81.5667344 L161.105258,72.9823398 L169.690586,72.9823398 L169.690586,64.3970117 L178.274047,64.3970117 Z"></path></svg><a aria-hidden="true" tabindex="-1" href="#c-备忘清单"><span class="icon icon-link"></span></a>C++ 备忘清单</h1><div class="wrap-body">
<p>提供基本语法和方法的 <a href="https://zh.cppreference.com/">C++</a> 快速参考备忘单</p>
</div></header><div class="menu-tocs"><div class="menu-btn"><svg aria-hidden="true" fill="currentColor" height="1em" width="1em" viewBox="0 0 16 16" version="1.1" data-view-component="true">
<path fill-rule="evenodd" d="M2 4a1 1 0 100-2 1 1 0 000 2zm3.75-1.5a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zm0 5a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zm0 5a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zM3 8a1 1 0 11-2 0 1 1 0 012 0zm-1 6a1 1 0 100-2 1 1 0 000 2z"></path>
</svg></div><div class="menu-modal"><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#入门">入门</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#hellocpp">hello.cpp</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#变量">变量</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#原始数据类型">原始数据类型</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#用户输入">用户输入</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#交换">交换</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#注释">注释</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#if-语句">If 语句</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#循环">循环</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#函数">函数</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#引用">引用</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#命名空间">命名空间</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-数组">C++ 数组</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#定义">定义</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#操控">操控</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#展示">展示</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#多维">多维</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-条件">C++ 条件</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#if-clause">If Clause</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#else-if-语句">Else if 语句</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#运算符">运算符</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#关系运算符">关系运算符</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#赋值运算符">赋值运算符</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#逻辑运算符">逻辑运算符</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#位运算符">位运算符</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#三元运算符">三元运算符</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#switch-语句">switch 语句</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-循环">C++ 循环</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#while">While</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#do-while">Do-while</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#continue-语句">Continue 语句</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#无限循环">无限循环</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#for_each-c11-起">for_each (C++11 起)</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#基于范围-c11-起">基于范围 (C++11 起)</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#中断语句">中断语句</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#several-variations">Several variations</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#auto">auto</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-函数">C++ 函数</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#参数和返回">参数和返回</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#重载">重载</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#内置函数">内置函数</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#lambda-表达式">Lambda 表达式</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c多线程">C++多线程</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#多线程介绍">多线程介绍</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#线程的创建">线程的创建</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#线程的销毁">线程的销毁</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#this_thread">this_thread</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#锁"></a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#锁的基本操作">锁的基本操作</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#更简单的锁--stdlock_guardmutex">更简单的锁 —— std::lock_guard&#x3C;Mutex></a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#unique_lockmutex">unique_lock&#x3C;Mutex></a><a aria-hidden="true" class="leve5 tocs-link" data-num="5" href="#stdadopt_lock">std::adopt_lock</a><a aria-hidden="true" class="leve5 tocs-link" data-num="5" href="#stdtry_to_lock">std::try_to_lock</a><a aria-hidden="true" class="leve5 tocs-link" data-num="5" href="#stddefer_lock">std::defer_lock</a><a aria-hidden="true" class="leve5 tocs-link" data-num="5" href="#stdunique_lockmutexrelease">std::unique_lock&#x3C;Mutex>::release</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#stdcall_once">std::call_once</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#stdcondition_variable">std::condition_variable</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#创建条件变量">创建条件变量</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#等待条件变量被通知">等待条件变量被通知</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#stdcondition_variablenotify_one">std::condition_variable::notify_one</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#stdcondition_variablenotify_all">std::condition_variable::notify_all</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#获取线程的运行结果">获取线程的运行结果</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#创建异步任务">创建异步任务</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#获取异步任务的返回值">获取异步任务的返回值</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#stdasync-的额外参数">std::async 的额外参数</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#返回值的状态">返回值的状态</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#多个返回值">多个返回值</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-预处理器">C++ 预处理器</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#预处理器">预处理器</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#includes">Includes</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#defines">Defines</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#if">If</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#error">Error</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#宏"></a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#令牌连接">令牌连接</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#字符串化">字符串化</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#文件和行">文件和行</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#各种各样的">各种各样的</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#转义序列">转义序列</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#关键字">关键字</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#预处理器-1">预处理器</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#另见">另见</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#map和set">map和set</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#string">string</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#指针">指针</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#sstream类处理字符串">sstream类处理字符串</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#技巧">技巧</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c编译流程">C++编译流程</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#说一下-static-关键字的作用">说一下 static 关键字的作用</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#说一下-c和-c-的区别">说一下 C++和 C 的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#指针和引用">指针和引用</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#智能指针-为何使用智能指针">智能指针? 为何使用智能指针</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#解决的问题">解决的问题</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#unique_ptr-shared_ptr-weak_ptr">unique_ptr, shared_ptr, weak_ptr</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#define和const区别">#define和const区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#重载overload覆盖重写override隐藏重定义overwrite这三者之间的区别">重载overload覆盖重写override隐藏重定义overwrite这三者之间的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#多态">多态</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#动态多态和静态多态">动态多态和静态多态</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#动态多台和静态多态的比较">动态多台和静态多态的比较</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#虚函数表">虚函数表</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#多态的工作原理底层实现机制">多态的工作原理(底层实现机制)</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#动态绑定">动态绑定</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#析构函数为何为虚函数">析构函数为何为虚函数:</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#map和set的实现">map和set的实现</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#指针和数组的区别">指针和数组的区别?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#深浅拷贝">深浅拷贝</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#定义字符串的区别">定义字符串的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#类型转换-cast">类型转换? cast</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#const指针">const指针</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#newdelete-与-mallocfree-的区别是什么">new/delete 与 malloc/free 的区别是什么</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#构造函数和析构函数">构造函数和析构函数</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#allocator-内存分配和释放">allocator 内存分配和释放?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#malloc-的原理">malloc 的原理</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#stl迭代器删除元素">STL迭代器删除元素:</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#vector和list-的区别">vector和list 的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#stl迭代器的作用-为何不用指针而用迭代器">STL迭代器的作用, 为何不用指针而用迭代器?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c中类成员的访问权限">C++中类成员的访问权限</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#struct和class的区别">struct和class的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c源文从文本到可执行文件经历过程">C++源文从文本到可执行文件经历过程</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#include--和include-的区别">include "" 和include &#x3C;>的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#forkwaitexec-函数">fork,wait,exec 函数</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#stl-里-resize-和-reserve-的区别">STL 里 resize 和 reserve 的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#bss端等六段-c的内存管理">BSS端等六段: C++的内存管理?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#内存泄漏">内存泄漏</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#判断内存泄漏">判断内存泄漏:</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#如何采用单线程的方式处理高并发">如何采用单线程的方式处理高并发?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#大端小端">大端小端?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#设计一个server-实现多个客户端请求">设计一个server, 实现多个客户端请求</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c的线程锁你知道几种">C++的线程锁你知道几种?</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#互斥锁mutex">互斥锁mutex</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#条件锁">条件锁</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#自旋锁">自旋锁</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#读写锁">读写锁</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#什么类不能被继承">什么类不能被继承</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#结构体和类大小">结构体和类大小</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#类的什么方法不能是虚函数">类的什么方法不能是虚函数</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#hash扩容">hash扩容</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c派生类的构造函数和析构函数执行顺序及其构造形式">C++派生类的构造函数和析构函数执行顺序及其构造形式</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#派生类的构造函数和析构函数的执行顺序">派生类的构造函数和析构函数的执行顺序</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#派生类构造函数和析构函数的构造原则">派生类构造函数和析构函数的构造原则</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#注意">注意</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#虚函数调用的工作原理-基于虚函数多态的机制">虚函数调用的工作原理 基于虚函数多态的机制</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#虚函数和纯虚函数">虚函数和纯虚函数</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#抽象类">抽象类</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#虚函数表-1">虚函数表</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#多态的工作原理底层实现机制-1">多态的工作原理(底层实现机制)</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#动态绑定-1">动态绑定</a></div></div><div class="h1wrap-body"><div class="wrap h2body-exist"><div class="wrap-header h2wrap"><h2 id="入门"><a aria-hidden="true" tabindex="-1" href="#入门"><span class="icon icon-link"></span></a>入门</h2><div class="wrap-body">
</div></div><div class="h2wrap-body"><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="hellocpp"><a aria-hidden="true" tabindex="-1" href="#hellocpp"><span class="icon icon-link"></span></a>hello.cpp</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;iostream></span></span>
</span><span class="code-line"><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"Hello Quick Reference\n"</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
<p>编译运行</p>
<pre class="language-shell"><code class="language-shell code-highlight"><span class="code-line">$ g++ hello.cpp <span class="token parameter variable">-o</span> hello
</span><span class="code-line">$ ./hello
</span><span class="code-line">Hello Quick Reference
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="变量"><a aria-hidden="true" tabindex="-1" href="#变量"><span class="icon icon-link"></span></a>变量</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> number <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span> <span class="token comment">// 整数</span>
</span><span class="code-line"><span class="token keyword">float</span> f <span class="token operator">=</span> <span class="token number">0.95</span><span class="token punctuation">;</span> <span class="token comment">// 浮点数</span>
</span><span class="code-line"><span class="token keyword">double</span> PI <span class="token operator">=</span> <span class="token number">3.14159</span><span class="token punctuation">;</span> <span class="token comment">// 浮点数</span>
</span><span class="code-line"><span class="token keyword">char</span> yes <span class="token operator">=</span> <span class="token char">'Y'</span><span class="token punctuation">;</span> <span class="token comment">// 特点</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>string s <span class="token operator">=</span> <span class="token string">"ME"</span><span class="token punctuation">;</span> <span class="token comment">// 字符串(文本)</span>
</span><span class="code-line"><span class="token keyword">bool</span> isRight <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token comment">// 布尔值</span>
</span><span class="code-line"><span class="token comment">// 常量</span>
</span><span class="code-line"><span class="token keyword">const</span> <span class="token keyword">float</span> RATE <span class="token operator">=</span> <span class="token number">0.8</span><span class="token punctuation">;</span>
</span></code></pre>
<hr>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> age <span class="token punctuation">{</span><span class="token number">25</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token comment">// 自 C++11</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> age<span class="token punctuation">;</span> <span class="token comment">// 打印 25</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="原始数据类型"><a aria-hidden="true" tabindex="-1" href="#原始数据类型"><span class="icon icon-link"></span></a>原始数据类型</h3><div class="wrap-body">
<table class="show-header"><thead><tr><th align="left">数据类型</th><th>大小</th><th>范围</th></tr></thead><tbody><tr><td align="left"><code>int</code></td><td>4 bytes</td><td>-2<sup>31</sup> 到 2<sup>31</sup>-1</td></tr><tr><td align="left"><code>float</code></td><td>4 bytes</td><td><em>N/A</em></td></tr><tr><td align="left"><code>double</code></td><td>8 bytes</td><td><em>N/A</em></td></tr><tr><td align="left"><code>char</code></td><td>1 byte</td><td>-128 到 127</td></tr><tr><td align="left"><code>bool</code></td><td>1 byte</td><td><code>true</code> / <code>false</code></td></tr><tr><td align="left"><code>void</code></td><td><em>N/A</em></td><td><em>N/A</em></td></tr><tr><td align="left"><code>wchar_t</code></td><td>2 到 4 bytes</td><td>1 个宽字符</td></tr></tbody></table>
<!--rehype:className=show-header-->
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="用户输入"><a aria-hidden="true" tabindex="-1" href="#用户输入"><span class="icon icon-link"></span></a>用户输入</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> num<span class="token punctuation">;</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"Type a number: "</span><span class="token punctuation">;</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>cin <span class="token operator">>></span> num<span class="token punctuation">;</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"You entered "</span> <span class="token operator">&#x3C;&#x3C;</span> num<span class="token punctuation">;</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="交换"><a aria-hidden="true" tabindex="-1" href="#交换"><span class="icon icon-link"></span></a>交换</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> a <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">,</span> b <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">;</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span><span class="token function">swap</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> b<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 输出: a=10, b=5</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"a="</span> <span class="token operator">&#x3C;&#x3C;</span> a <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">", b="</span> <span class="token operator">&#x3C;&#x3C;</span> b<span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token comment">// 整数交换的奇技淫巧</span>
</span><span class="code-line"><span class="token punctuation">(</span>x <span class="token operator">^=</span> y<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>y <span class="token operator">^=</span> x<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">(</span>x <span class="token operator">^=</span> y<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 注意! 以下操作会造成 undefined behavior</span>
</span><span class="code-line">x <span class="token operator">^=</span> y <span class="token operator">^=</span> x <span class="token operator">^=</span> y<span class="token punctuation">;</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="注释"><a aria-hidden="true" tabindex="-1" href="#注释"><span class="icon icon-link"></span></a>注释</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token comment">// C++中的单行注释</span>
</span><span class="code-line"><span class="token comment">/* 这是一个多行注释
</span></span><span class="code-line"><span class="token comment"> 在 C++ 中 */</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="if-语句"><a aria-hidden="true" tabindex="-1" href="#if-语句"><span class="icon icon-link"></span></a>If 语句</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">if</span> <span class="token punctuation">(</span>a <span class="token operator">==</span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token comment">// do something</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
<p>查看: <a href="#c-%E6%9D%A1%E4%BB%B6">条件</a></p>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="循环"><a aria-hidden="true" tabindex="-1" href="#循环"><span class="icon icon-link"></span></a>循环</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&#x3C;</span> <span class="token number">10</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> i <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"\n"</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
<p>查看: <a href="#c-%E5%BE%AA%E7%8E%AF">循环 Loops</a></p>
</div></div></div><div class="wrap h3body-not-exist row-span-2"><div class="wrap-header h3wrap"><h3 id="函数"><a aria-hidden="true" tabindex="-1" href="#函数"><span class="icon icon-link"></span></a>函数</h3><div class="wrap-body">
<!--rehype:wrap-class=row-span-2-->
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;iostream></span></span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">void</span> <span class="token function">hello</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 声明</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 主函数</span>
</span><span class="code-line"> <span class="token function">hello</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 执行函数</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">void</span> <span class="token function">hello</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 定义</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"Hello Quick Reference!\n"</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
<p>查看: <a href="#c-%E5%87%BD%E6%95%B0">函数 Functions</a></p>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="引用"><a aria-hidden="true" tabindex="-1" href="#引用"><span class="icon icon-link"></span></a>引用</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">int</span><span class="token operator">&#x26;</span> ri <span class="token operator">=</span> i<span class="token punctuation">;</span> <span class="token comment">// ri 是对 i 的引用</span>
</span><span class="code-line">ri <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> <span class="token comment">// i 现在改为 2</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"i="</span> <span class="token operator">&#x3C;&#x3C;</span> i<span class="token punctuation">;</span>
</span><span class="code-line">i <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span> <span class="token comment">// i 现在改为 3</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"ri="</span> <span class="token operator">&#x3C;&#x3C;</span> ri<span class="token punctuation">;</span>
</span></code></pre>
<p><code>ri</code><code>i</code> 指的是相同的内存位置</p>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="命名空间"><a aria-hidden="true" tabindex="-1" href="#命名空间"><span class="icon icon-link"></span></a>命名空间</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;iostream></span></span>
</span><span class="code-line"><span class="token keyword">namespace</span> ns1 <span class="token punctuation">{</span><span class="token keyword">int</span> <span class="token function">val</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token number">5</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
</span><span class="code-line"><span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> ns1<span class="token double-colon punctuation">::</span><span class="token function">val</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
<hr>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;iostream></span></span>
</span><span class="code-line"><span class="token keyword">namespace</span> ns1 <span class="token punctuation">{</span><span class="token keyword">int</span> <span class="token function">val</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> <span class="token number">5</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token keyword">using</span> <span class="token keyword">namespace</span> ns1<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
</span><span class="code-line"><span class="token punctuation">{</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token function">val</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
<p>名称空间允许名称下的全局标识符</p>
</div></div></div></div></div><div class="wrap h2body-exist"><div class="wrap-header h2wrap"><h2 id="c-数组"><a aria-hidden="true" tabindex="-1" href="#c-数组"><span class="icon icon-link"></span></a>C++ 数组</h2><div class="wrap-body">
</div></div><div class="h2wrap-body"><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="定义"><a aria-hidden="true" tabindex="-1" href="#定义"><span class="icon icon-link"></span></a>定义</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">std<span class="token double-colon punctuation">::</span>array<span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token operator">></span> marks<span class="token punctuation">;</span> <span class="token comment">// 定义</span>
</span><span class="code-line">marks<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">92</span><span class="token punctuation">;</span>
</span><span class="code-line">marks<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">97</span><span class="token punctuation">;</span>
</span><span class="code-line">marks<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">98</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 定义和初始化</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>array<span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token operator">></span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">92</span><span class="token punctuation">,</span> <span class="token number">97</span><span class="token punctuation">,</span> <span class="token number">98</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 有空成员</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>array<span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token operator">></span> marks <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">92</span><span class="token punctuation">,</span> <span class="token number">97</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> marks<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// 输出: 0</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="操控"><a aria-hidden="true" tabindex="-1" href="#操控"><span class="icon icon-link"></span></a>操控</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">┌─────┬─────┬─────┬─────┬─────┬─────┐
</span><span class="code-line"><span class="token operator">|</span> <span class="token number">92</span> <span class="token operator">|</span> <span class="token number">97</span> <span class="token operator">|</span> <span class="token number">98</span> <span class="token operator">|</span> <span class="token number">99</span> <span class="token operator">|</span> <span class="token number">98</span> <span class="token operator">|</span> <span class="token number">94</span> <span class="token operator">|</span>
</span><span class="code-line">└─────┴─────┴─────┴─────┴─────┴─────┘
</span><span class="code-line"> <span class="token number">0</span> <span class="token number">1</span> <span class="token number">2</span> <span class="token number">3</span> <span class="token number">4</span> <span class="token number">5</span>
</span></code></pre>
<hr>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">std<span class="token double-colon punctuation">::</span>array<span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token operator">></span> marks <span class="token operator">=</span> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token number">92</span><span class="token punctuation">,</span> <span class="token number">97</span><span class="token punctuation">,</span> <span class="token number">98</span><span class="token punctuation">,</span> <span class="token number">99</span><span class="token punctuation">,</span> <span class="token number">98</span><span class="token punctuation">,</span> <span class="token number">94</span>
</span><span class="code-line"><span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 打印第一个元素</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> marks<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 将第 2 个元素更改为 99</span>
</span><span class="code-line">marks<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">99</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 从用户那里获取输入</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>cin <span class="token operator">>></span> marks<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="展示"><a aria-hidden="true" tabindex="-1" href="#展示"><span class="icon icon-link"></span></a>展示</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">char</span> ref<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token char">'R'</span><span class="token punctuation">,</span> <span class="token char">'e'</span><span class="token punctuation">,</span> <span class="token char">'f'</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 基于范围的for循环</span>
</span><span class="code-line"><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">&#x26;</span>n <span class="token operator">:</span> ref<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> std<span class="token double-colon punctuation">::</span><span class="token function">string</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> n<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token comment">// 传统的for循环</span>
</span><span class="code-line"><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&#x3C;</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span>ref<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> ref<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="多维"><a aria-hidden="true" tabindex="-1" href="#多维"><span class="icon icon-link"></span></a>多维</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"> j0 j1 j2 j3 j4 j5
</span><span class="code-line"> ┌────┬────┬────┬────┬────┬────┐
</span><span class="code-line">i0 <span class="token operator">|</span> <span class="token number">1</span> <span class="token operator">|</span> <span class="token number">2</span> <span class="token operator">|</span> <span class="token number">3</span> <span class="token operator">|</span> <span class="token number">4</span> <span class="token operator">|</span> <span class="token number">5</span> <span class="token operator">|</span> <span class="token number">6</span> <span class="token operator">|</span>
</span><span class="code-line"> ├────┼────┼────┼────┼────┼────┤
</span><span class="code-line">i1 <span class="token operator">|</span> <span class="token number">6</span> <span class="token operator">|</span> <span class="token number">5</span> <span class="token operator">|</span> <span class="token number">4</span> <span class="token operator">|</span> <span class="token number">3</span> <span class="token operator">|</span> <span class="token number">2</span> <span class="token operator">|</span> <span class="token number">1</span> <span class="token operator">|</span>
</span><span class="code-line"> └────┴────┴────┴────┴────┴────┘
</span></code></pre>
<hr>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> x<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">6</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">,</span><span class="token number">5</span><span class="token punctuation">,</span><span class="token number">6</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">6</span><span class="token punctuation">,</span><span class="token number">5</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&#x3C;</span> <span class="token number">2</span><span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator">&#x3C;</span> <span class="token number">6</span><span class="token punctuation">;</span> <span class="token operator">++</span>j<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> x<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">" "</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token comment">// 输出: 1 2 3 4 5 6 6 5 4 3 2 1</span>
</span></code></pre>
</div></div></div></div></div><div class="wrap h2body-exist"><div class="wrap-header h2wrap"><h2 id="c-条件"><a aria-hidden="true" tabindex="-1" href="#c-条件"><span class="icon icon-link"></span></a>C++ 条件</h2><div class="wrap-body">
</div></div><div class="h2wrap-body"><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="if-clause"><a aria-hidden="true" tabindex="-1" href="#if-clause"><span class="icon icon-link"></span></a>If Clause</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">if</span> <span class="token punctuation">(</span>a <span class="token operator">==</span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token comment">// do something</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
<hr>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> number <span class="token operator">=</span> <span class="token number">16</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">if</span> <span class="token punctuation">(</span>number <span class="token operator">%</span> <span class="token number">2</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span>
</span><span class="code-line"><span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"even"</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token keyword">else</span>
</span><span class="code-line"><span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"odd"</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token comment">// 输出: even</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="else-if-语句"><a aria-hidden="true" tabindex="-1" href="#else-if-语句"><span class="icon icon-link"></span></a>Else if 语句</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> score <span class="token operator">=</span> <span class="token number">99</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">if</span> <span class="token punctuation">(</span>score <span class="token operator">==</span> <span class="token number">100</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"Superb"</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>score <span class="token operator">>=</span> <span class="token number">90</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"Excellent"</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>score <span class="token operator">>=</span> <span class="token number">80</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"Very Good"</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>score <span class="token operator">>=</span> <span class="token number">70</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"Good"</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>score <span class="token operator">>=</span> <span class="token number">60</span><span class="token punctuation">)</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"OK"</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">else</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"What?"</span><span class="token punctuation">;</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-exist row-span-2"><div class="wrap-header h3wrap"><h3 id="运算符"><a aria-hidden="true" tabindex="-1" href="#运算符"><span class="icon icon-link"></span></a>运算符</h3><div class="wrap-body">
<!--rehype:wrap-class=row-span-2-->
<h4 id="关系运算符"><a aria-hidden="true" tabindex="-1" href="#关系运算符"><span class="icon icon-link"></span></a>关系运算符</h4>
<table><thead><tr><th align="left">:--</th><th>--</th></tr></thead><tbody><tr><td align="left"><code>a == b</code></td><td>a 等于 b</td></tr><tr><td align="left"><code>a != b</code></td><td>a 不等于 b</td></tr><tr><td align="left"><code>a &#x3C; b</code></td><td>a 小于 b</td></tr><tr><td align="left"><code>a > b</code></td><td>a 大于 b</td></tr><tr><td align="left"><code>a &#x3C;= b</code></td><td>a 小于或等于 b</td></tr><tr><td align="left"><code>a >= b</code></td><td>a 大于或等于 b</td></tr></tbody></table>
<h4 id="赋值运算符"><a aria-hidden="true" tabindex="-1" href="#赋值运算符"><span class="icon icon-link"></span></a>赋值运算符</h4>
<table><thead><tr><th align="left">范例</th><th>相当于</th></tr></thead><tbody><tr><td align="left"><code>a += b</code></td><td><em>Aka</em> <code>a = a + b</code></td></tr><tr><td align="left"><code>a -= b</code></td><td><em>Aka</em> <code>a = a - b</code></td></tr><tr><td align="left"><code>a *= b</code></td><td><em>Aka</em> <code>a = a * b</code></td></tr><tr><td align="left"><code>a /= b</code></td><td><em>Aka</em> <code>a = a / b</code></td></tr><tr><td align="left"><code>a %= b</code></td><td><em>Aka</em> <code>a = a % b</code></td></tr></tbody></table>
<h4 id="逻辑运算符"><a aria-hidden="true" tabindex="-1" href="#逻辑运算符"><span class="icon icon-link"></span></a>逻辑运算符</h4>
<table><thead><tr><th>Example</th><th>Meaning</th></tr></thead><tbody><tr><td><code>exp1 &#x26;&#x26; exp2</code></td><td>Both are true <em>(AND)</em></td></tr><tr><td>`exp1</td><td></td></tr><tr><td><code>!exp</code></td><td><code>exp</code> is false <em>(NOT)</em></td></tr></tbody></table>
<h4 id="位运算符"><a aria-hidden="true" tabindex="-1" href="#位运算符"><span class="icon icon-link"></span></a>位运算符</h4>
<table><thead><tr><th>Operator</th><th>Description</th></tr></thead><tbody><tr><td><code>a &#x26; b</code></td><td>Binary AND</td></tr><tr><td>`a</td><td>b`</td></tr><tr><td><code>a ^ b</code></td><td>Binary XOR</td></tr><tr><td><code>a ~ b</code></td><td>Binary One's Complement</td></tr><tr><td><code>a &#x3C;&#x3C; b</code></td><td>Binary Shift Left</td></tr><tr><td><code>a >> b</code></td><td>Binary Shift Right</td></tr></tbody></table>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="三元运算符"><a aria-hidden="true" tabindex="-1" href="#三元运算符"><span class="icon icon-link"></span></a>三元运算符</h3><div class="wrap-body">
<pre><code class="code-highlight"><span class="code-line"> ┌── True ──┐
</span><span class="code-line">Result = Condition ? Exp1 : Exp2;
</span><span class="code-line"> └───── False ─────┘
</span></code></pre>
<hr>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> x <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">,</span> y <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">,</span> max<span class="token punctuation">;</span>
</span><span class="code-line">max <span class="token operator">=</span> <span class="token punctuation">(</span>x <span class="token operator">></span> y<span class="token punctuation">)</span> <span class="token operator">?</span> x <span class="token operator">:</span> y<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 输出: 5</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> max <span class="token operator">&#x3C;&#x3C;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>
</span></code></pre>
<hr>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> x <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">,</span> y <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">,</span> max<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">></span> y<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> max <span class="token operator">=</span> x<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
</span><span class="code-line"> max <span class="token operator">=</span> y<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token comment">// 输出: 5</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> max <span class="token operator">&#x3C;&#x3C;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="switch-语句"><a aria-hidden="true" tabindex="-1" href="#switch-语句"><span class="icon icon-link"></span></a>switch 语句</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> num <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">switch</span> <span class="token punctuation">(</span>num<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">case</span> <span class="token number">0</span><span class="token operator">:</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"Zero"</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">break</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">case</span> <span class="token number">1</span><span class="token operator">:</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"One"</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">break</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">case</span> <span class="token number">2</span><span class="token operator">:</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"Two"</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">break</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">case</span> <span class="token number">3</span><span class="token operator">:</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"Three"</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">break</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">default</span><span class="token operator">:</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"What?"</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">break</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
</div></div></div></div></div><div class="wrap h2body-exist"><div class="wrap-header h2wrap"><h2 id="c-循环"><a aria-hidden="true" tabindex="-1" href="#c-循环"><span class="icon icon-link"></span></a>C++ 循环</h2><div class="wrap-body">
</div></div><div class="h2wrap-body"><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="while"><a aria-hidden="true" tabindex="-1" href="#while"><span class="icon icon-link"></span></a>While</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">while</span> <span class="token punctuation">(</span>i <span class="token operator">&#x3C;</span> <span class="token number">6</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> i<span class="token operator">++</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token comment">// 输出: 012345</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="do-while"><a aria-hidden="true" tabindex="-1" href="#do-while"><span class="icon icon-link"></span></a>Do-while</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">do</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> i<span class="token operator">++</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span> <span class="token keyword">while</span> <span class="token punctuation">(</span>i <span class="token operator">&#x3C;=</span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 输出: 12345</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="continue-语句"><a aria-hidden="true" tabindex="-1" href="#continue-语句"><span class="icon icon-link"></span></a>Continue 语句</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&#x3C;</span> <span class="token number">10</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">if</span> <span class="token punctuation">(</span>i <span class="token operator">%</span> <span class="token number">2</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">continue</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> i<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span> <span class="token comment">// 输出: 13579</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="无限循环"><a aria-hidden="true" tabindex="-1" href="#无限循环"><span class="icon icon-link"></span></a>无限循环</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// true or 1</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"无限循环"</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
<hr>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token punctuation">;</span><span class="token punctuation">;</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"无限循环"</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
<hr>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"infinite loop"</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="for_each-c11-起"><a aria-hidden="true" tabindex="-1" href="#for_each-c11-起"><span class="icon icon-link"></span></a>for_each (C++11 起)</h3><div class="wrap-body">
<pre class="wrap-text"><code class="language-cpp code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;iostream></span></span>
</span><span class="code-line"><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
</span><span class="code-line"><span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">auto</span> print <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword">int</span> num<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> num <span class="token operator">&#x3C;&#x3C;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>array<span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token operator">></span> arr <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span><span class="token function">for_each</span><span class="token punctuation">(</span>arr<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> arr<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> print<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
<!--rehype:className=wrap-text-->
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="基于范围-c11-起"><a aria-hidden="true" tabindex="-1" href="#基于范围-c11-起"><span class="icon icon-link"></span></a>基于范围 (C++11 起)</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> n <span class="token operator">:</span> <span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> n <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">" "</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token comment">// 输出: 1 2 3 4 5</span>
</span></code></pre>
<hr>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">std<span class="token double-colon punctuation">::</span>string hello <span class="token operator">=</span> <span class="token string">"Quick Reference.ME"</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">char</span> c<span class="token operator">:</span> hello<span class="token punctuation">)</span>
</span><span class="code-line"><span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> c <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">" "</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token comment">// 输出: Q u i c k R e f . M E</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="中断语句"><a aria-hidden="true" tabindex="-1" href="#中断语句"><span class="icon icon-link"></span></a>中断语句</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> password<span class="token punctuation">,</span> times <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">while</span> <span class="token punctuation">(</span>password <span class="token operator">!=</span> <span class="token number">1234</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">if</span> <span class="token punctuation">(</span>times<span class="token operator">++</span> <span class="token operator">>=</span> <span class="token number">3</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"Locked!\n"</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">break</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"Password: "</span><span class="token punctuation">;</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cin <span class="token operator">>></span> password<span class="token punctuation">;</span> <span class="token comment">// input</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="several-variations"><a aria-hidden="true" tabindex="-1" href="#several-variations"><span class="icon icon-link"></span></a>Several variations</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> j <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> i <span class="token operator">&#x3C;</span> <span class="token number">3</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">,</span> j<span class="token operator">--</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"i="</span> <span class="token operator">&#x3C;&#x3C;</span> i <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">","</span><span class="token punctuation">;</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"j="</span> <span class="token operator">&#x3C;&#x3C;</span> j <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">";"</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token comment">// 输出: i=0,j=2;i=1,j=1;i=2,j=0;</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="auto"><a aria-hidden="true" tabindex="-1" href="#auto"><span class="icon icon-link"></span></a>auto</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">std<span class="token double-colon punctuation">::</span> string s <span class="token operator">=</span> <span class="token string">"hello world"</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">auto</span> c<span class="token operator">:</span> s<span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span> cout <span class="token operator">&#x3C;&#x3C;</span> c <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">" "</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token comment">// 输出: h e l l o w o r l d</span>
</span></code></pre>
</div></div></div></div></div><div class="wrap h2body-exist"><div class="wrap-header h2wrap"><h2 id="c-函数"><a aria-hidden="true" tabindex="-1" href="#c-函数"><span class="icon icon-link"></span></a>C++ 函数</h2><div class="wrap-body">
</div></div><div class="h2wrap-body"><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="参数和返回"><a aria-hidden="true" tabindex="-1" href="#参数和返回"><span class="icon icon-link"></span></a>参数和返回</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;iostream></span></span>
</span><span class="code-line"><span class="token keyword">int</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">int</span> a<span class="token punctuation">,</span> <span class="token keyword">int</span> b<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">return</span> a <span class="token operator">+</span> b<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
<p><code>add</code> 是一个接受 2 个整数并返回整数的函数</p>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="重载"><a aria-hidden="true" tabindex="-1" href="#重载"><span class="icon icon-link"></span></a>重载</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">void</span> <span class="token function">fun</span><span class="token punctuation">(</span>string a<span class="token punctuation">,</span> string b<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> a <span class="token operator">+</span> <span class="token string">" "</span> <span class="token operator">+</span> b<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token keyword">void</span> <span class="token function">fun</span><span class="token punctuation">(</span>string a<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> a<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token keyword">void</span> <span class="token function">fun</span><span class="token punctuation">(</span><span class="token keyword">int</span> a<span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> a<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="内置函数"><a aria-hidden="true" tabindex="-1" href="#内置函数"><span class="icon icon-link"></span></a>内置函数</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;iostream></span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;cmath></span> <span class="token comment">// 导入库</span></span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token comment">// sqrt() 来自 cmath</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token function">sqrt</span><span class="token punctuation">(</span><span class="token number">9</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist col-span-2"><div class="wrap-header h3wrap"><h3 id="lambda-表达式"><a aria-hidden="true" tabindex="-1" href="#lambda-表达式"><span class="icon icon-link"></span></a>Lambda 表达式</h3><div class="wrap-body">
<!--rehype:wrap-class=col-span-2-->
<p>Lambda 表达式可以在函数内定义,可以理解为在函数内定义的临时函数。格式:</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">auto</span> func <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> return_type <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
</span></code></pre>
<ul class="style-timeline">
<li>
<p><code>[]</code>为捕获列表,能够捕获其所在函数的局部变量</p>
<ul>
<li>
<p>一个空的捕获列表代表Lambda表达式不捕获任何的变量</p>
</li>
<li>
<p>对于值捕获,直接在中括号中填写要捕获的变量即可:</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> val <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">auto</span> func <span class="token operator">=</span> <span class="token punctuation">[</span>val<span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> return_type <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
</span></code></pre>
</li>
</ul>
</li>
<li>
<p>对于引用捕获,需要在捕获的变量前添加<code>&#x26;</code></p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">string <span class="token function">str</span><span class="token punctuation">(</span><span class="token string">"hello world!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">auto</span> func <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token operator">&#x26;</span>str<span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> return_type <span class="token punctuation">{</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
</span></code></pre>
</li>
<li>
<p>如果变量太多,需要编译器根据我们编写的代码自动捕获,可以采用隐式捕获的方式。</p>
<ul>
<li>
<p>全部值捕获:</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> val1<span class="token punctuation">,</span> val2<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">auto</span> func <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token operator">=</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token keyword">int</span>
</span><span class="code-line"> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">return</span> val1 <span class="token operator">+</span> val2<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span><span class="token punctuation">;</span>
</span></code></pre>
</li>
<li>
<p>全部引用捕获:</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">string <span class="token function">str1</span><span class="token punctuation">(</span><span class="token string">"hello"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">str2</span><span class="token punctuation">(</span><span class="token string">"word!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">auto</span> func <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token operator">&#x26;</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> string
</span><span class="code-line"> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">return</span> str1 <span class="token operator">+</span> str2<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span><span class="token punctuation">;</span>
</span></code></pre>
</li>
<li>
<p>混合隐式捕获:</p>
<p>如果希望对一部分变量采用值捕获,对其他变量采用引用捕获,可以混合使用:</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> val1 <span class="token operator">=</span> <span class="token number">123</span><span class="token punctuation">,</span> val2 <span class="token operator">=</span> <span class="token number">456</span><span class="token punctuation">;</span>
</span><span class="code-line">string <span class="token function">str1</span><span class="token punctuation">(</span><span class="token string">"123"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">str2</span><span class="token punctuation">(</span><span class="token number">456</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">auto</span> func1 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token operator">=</span><span class="token punctuation">,</span> <span class="token operator">&#x26;</span>str1<span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token keyword">int</span>
</span><span class="code-line"> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">return</span> val1 <span class="token operator">==</span> std<span class="token double-colon punctuation">::</span><span class="token function">stoi</span><span class="token punctuation">(</span>str1<span class="token punctuation">)</span>
</span><span class="code-line"> <span class="token operator">?</span> val1 <span class="token operator">:</span> val2<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">auto</span> func2 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token operator">&#x26;</span><span class="token punctuation">,</span> val1<span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token keyword">int</span>
</span><span class="code-line"> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">return</span> str1 <span class="token operator">==</span> std<span class="token double-colon punctuation">::</span><span class="token function">to_string</span><span class="token punctuation">(</span>val1<span class="token punctuation">)</span>
</span><span class="code-line"> <span class="token operator">?</span> str1 <span class="token operator">:</span> str2<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span><span class="token punctuation">;</span>
</span></code></pre>
</li>
</ul>
</li>
<li>
<p><code>()</code> 是参数列表,我们只需要按照普通函数的使用方法来使用即可</p>
</li>
<li>
<p><code>return_type</code> 是函数的返回类型,<code>-> return_type</code> 可以不写,编译器会自动推导</p>
</li>
<li>
<p><code>{}</code> 中的内容就是函数体,依照普通函数的使用方法使用即可</p>
</li>
</ul>
<!--rehype:className=style-timeline-->
<p>此处给出一个 Lambda 表达式的实际使用例子(当然可以使用 <code>str::copy</code>):</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token comment">// vec中包含1, 2, 3, 4, 5</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token operator">></span> <span class="token function">vec</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span><span class="token function">for_each</span><span class="token punctuation">(</span>vec<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> vec<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
</span><span class="code-line"> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token operator">&#x26;</span> ele<span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token keyword">void</span>
</span><span class="code-line"> <span class="token punctuation">{</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&#x3C;&#x3C;</span> ele
</span><span class="code-line"> <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">" "</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
</div></div></div></div></div><div class="wrap h2body-exist"><div class="wrap-header h2wrap"><h2 id="c多线程"><a aria-hidden="true" tabindex="-1" href="#c多线程"><span class="icon icon-link"></span></a>C++多线程</h2><div class="wrap-body">
</div></div><div class="h2wrap-body"><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="多线程介绍"><a aria-hidden="true" tabindex="-1" href="#多线程介绍"><span class="icon icon-link"></span></a>多线程介绍</h3><div class="wrap-body">
<p>g++编译选项:<code>-std=c++11</code>。包含头文件:</p>
<ul>
<li><code>#include &#x3C;thread></code>C++多线程库</li>
<li><code>#include &#x3C;mutex></code>C++互斥量库</li>
<li><code>#include &#x3C;future></code>C++异步库</li>
</ul>
</div></div></div><div class="wrap h3body-not-exist row-span-2"><div class="wrap-header h3wrap"><h3 id="线程的创建"><a aria-hidden="true" tabindex="-1" href="#线程的创建"><span class="icon icon-link"></span></a>线程的创建</h3><div class="wrap-body">
<!--rehype:wrap-class=row-span-2-->
<p>以普通函数作为线程入口函数:</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">void</span> <span class="token function">entry_1</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span>
</span><span class="code-line"><span class="token keyword">void</span> <span class="token function">entry_2</span><span class="token punctuation">(</span><span class="token keyword">int</span> val<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>thread <span class="token function">my_thread_1</span><span class="token punctuation">(</span>entry_1<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>thread <span class="token function">my_thread_2</span><span class="token punctuation">(</span>entry_2<span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
<p>以类对象作为线程入口函数:</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">class</span> <span class="token class-name">Entry</span>
</span><span class="code-line"><span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">void</span> <span class="token keyword">operator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span>
</span><span class="code-line"> <span class="token keyword">void</span> <span class="token function">entry_function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span>
</span><span class="code-line"><span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line">Entry entry<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 调用operator()()</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>thread <span class="token function">my_thread_1</span><span class="token punctuation">(</span>entry<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 调用Entry::entry_function</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>thread <span class="token function">my_thread_2</span><span class="token punctuation">(</span><span class="token operator">&#x26;</span>Entry<span class="token double-colon punctuation">::</span>entry_function<span class="token punctuation">,</span> <span class="token operator">&#x26;</span>entry<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
<p>以lambda表达式作为线程入口函数</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">std<span class="token double-colon punctuation">::</span>thread <span class="token function">my_thread</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token keyword">void</span>
</span><span class="code-line"> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token comment">// ...</span>
</span><span class="code-line"> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="线程的销毁"><a aria-hidden="true" tabindex="-1" href="#线程的销毁"><span class="icon icon-link"></span></a>线程的销毁</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">thread my_thread<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 阻塞</span>
</span><span class="code-line">my_thread<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 非阻塞</span>
</span><span class="code-line">my_thread<span class="token punctuation">.</span><span class="token function">detach</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="this_thread"><a aria-hidden="true" tabindex="-1" href="#this_thread"><span class="icon icon-link"></span></a><code>this_thread</code></h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token comment">// 获取当前线程ID</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>this_thread<span class="token double-colon punctuation">::</span><span class="token function">get_id</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 使当前线程休眠一段指定时间</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>this_thread<span class="token double-colon punctuation">::</span><span class="token function">sleep_for</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 使当前线程休眠到指定时间</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>this_thread<span class="token double-colon punctuation">::</span><span class="token function">sleep_until</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 暂停当前线程的执行,让别的线程执行</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>this_thread<span class="token double-colon punctuation">::</span><span class="token function">yield</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-exist row-span-3"><div class="wrap-header h3wrap"><h3 id="锁"><a aria-hidden="true" tabindex="-1" href="#锁"><span class="icon icon-link"></span></a></h3><div class="wrap-body">
<!--rehype:wrap-class=row-span-3-->
<blockquote>
<p><code>#include &#x3C;mutex></code></p>
</blockquote>
<h4 id="锁的基本操作"><a aria-hidden="true" tabindex="-1" href="#锁的基本操作"><span class="icon icon-link"></span></a>锁的基本操作</h4>
<p>创建锁</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">std<span class="token double-colon punctuation">::</span>mutex m<span class="token punctuation">;</span>
</span></code></pre>
<p>上锁</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">m<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
<p>解锁</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">m<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
<p>尝试上锁:成功返回<code>true</code>,失败返回<code>false</code></p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">m<span class="token punctuation">.</span><span class="token function">try_lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
<p>解锁</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">m<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
<h4 id="更简单的锁--stdlock_guardmutex"><a aria-hidden="true" tabindex="-1" href="#更简单的锁--stdlock_guardmutex"><span class="icon icon-link"></span></a>更简单的锁 —— <code>std::lock_guard&#x3C;Mutex></code></h4>
<p>构造时上锁,析构时解锁</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">std<span class="token double-colon punctuation">::</span>mutex m<span class="token punctuation">;</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>lock_guard<span class="token operator">&#x3C;</span>std<span class="token double-colon punctuation">::</span>mutex<span class="token operator">></span> <span class="token function">lock</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
<p>额外参数:<code>std::adopt_lock</code>:只需解锁,无需上锁</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token comment">// 手动上锁</span>
</span><span class="code-line">m<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>lock_guard<span class="token operator">&#x3C;</span>mutex<span class="token operator">></span> <span class="token function">lock</span><span class="token punctuation">(</span>m<span class="token punctuation">,</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>adopt_lock<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
<h4 id="unique_lockmutex"><a aria-hidden="true" tabindex="-1" href="#unique_lockmutex"><span class="icon icon-link"></span></a><code>unique_lock&#x3C;Mutex></code></h4>
<p>构造上锁,析构解锁</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">std<span class="token double-colon punctuation">::</span>mutex m<span class="token punctuation">;</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>unique_lock<span class="token operator">&#x3C;</span>mutex<span class="token operator">></span> <span class="token function">lock</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
<h5 id="stdadopt_lock"><a aria-hidden="true" tabindex="-1" href="#stdadopt_lock"><span class="icon icon-link"></span></a><code>std::adopt_lock</code></h5>
<p>只需解锁,无需上锁</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token comment">// 手动上锁</span>
</span><span class="code-line">m<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>unique_lock<span class="token operator">&#x3C;</span>mutex<span class="token operator">></span> <span class="token function">lock</span><span class="token punctuation">(</span>m<span class="token punctuation">,</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>adopt_lock<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
<h5 id="stdtry_to_lock"><a aria-hidden="true" tabindex="-1" href="#stdtry_to_lock"><span class="icon icon-link"></span></a><code>std::try_to_lock</code></h5>
<p>尝试上锁,可以通过<code>std::unique_lock&#x3C;Mutex>::owns_lock()</code>查看状态</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">std<span class="token double-colon punctuation">::</span>unique_lock<span class="token operator">&#x3C;</span>mutex<span class="token operator">></span> <span class="token function">lock</span><span class="token punctuation">(</span>m<span class="token punctuation">,</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>try_to_lock<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">if</span> <span class="token punctuation">(</span>lock<span class="token punctuation">.</span><span class="token function">owns_lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
</span><span class="code-line"><span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token comment">// 拿到了锁</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token keyword">else</span>
</span><span class="code-line"><span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token comment">// 没有</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
<h5 id="stddefer_lock"><a aria-hidden="true" tabindex="-1" href="#stddefer_lock"><span class="icon icon-link"></span></a><code>std::defer_lock</code></h5>
<p>绑定锁,但不上锁</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">std<span class="token double-colon punctuation">::</span>unique_lock<span class="token operator">&#x3C;</span>mutex<span class="token operator">></span> <span class="token function">lock</span><span class="token punctuation">(</span>m<span class="token punctuation">,</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>defer_lock<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">lock<span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">lock<span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
<h5 id="stdunique_lockmutexrelease"><a aria-hidden="true" tabindex="-1" href="#stdunique_lockmutexrelease"><span class="icon icon-link"></span></a><code>std::unique_lock&#x3C;Mutex>::release</code></h5>
<p>返回所管理的<code>mutex</code>对象指针,**释放所有权。**一旦释放了所有权,那么如果原来互斥量处于互斥状态,程序员有责任手动解锁。</p>
<h4 id="stdcall_once"><a aria-hidden="true" tabindex="-1" href="#stdcall_once"><span class="icon icon-link"></span></a><code>std::call_once</code></h4>
<p>当多个线程通过这个函数调用一个可调用对象时,只会有一个线程成功调用。</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">std<span class="token double-colon punctuation">::</span>once_flag flag<span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">void</span> <span class="token function">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line">std<span class="token double-colon punctuation">::</span><span class="token function">call_once</span><span class="token punctuation">(</span>flag<span class="token punctuation">,</span> foo<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-exist"><div class="wrap-header h3wrap"><h3 id="stdcondition_variable"><a aria-hidden="true" tabindex="-1" href="#stdcondition_variable"><span class="icon icon-link"></span></a><code>std::condition_variable</code></h3><div class="wrap-body">
<h4 id="创建条件变量"><a aria-hidden="true" tabindex="-1" href="#创建条件变量"><span class="icon icon-link"></span></a>创建条件变量</h4>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">std<span class="token double-colon punctuation">::</span>condition_variable cond<span class="token punctuation">;</span>
</span></code></pre>
<h4 id="等待条件变量被通知"><a aria-hidden="true" tabindex="-1" href="#等待条件变量被通知"><span class="icon icon-link"></span></a>等待条件变量被通知</h4>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">std<span class="token double-colon punctuation">::</span>unique_lock<span class="token operator">&#x3C;</span>std<span class="token double-colon punctuation">::</span>mutex<span class="token operator">></span>
</span><span class="code-line"> lock<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">extern</span> <span class="token keyword">bool</span> <span class="token function">predicate</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token comment">// 调用方式 1</span>
</span><span class="code-line">cond<span class="token punctuation">.</span><span class="token function">wait</span><span class="token punctuation">(</span>lock<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 调用方式 2</span>
</span><span class="code-line">cond<span class="token punctuation">.</span><span class="token function">wait</span><span class="token punctuation">(</span>lock<span class="token punctuation">,</span> predicate<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
<hr>
<ul>
<li><code>wait</code>不断地尝试重新获取并加锁该互斥量,如果获取不到,它就卡在这里并反复尝试重新获取,如果获取到了,执行流程就继续往下走</li>
<li><code>wait</code>在获取到互斥量并加锁了互斥量之后:
<ul>
<li>如果<code>wait</code>被提供了可调用对象,那么就执行这个可调用对象:
<ul>
<li>如果返回值为<code>false</code>,那么<code>wait</code>继续加锁,直到再次被 notified</li>
<li>如果返回值为<code>true</code>,那么<code>wait</code>返回,继续执行流程</li>
</ul>
</li>
<li>如果<code>wait</code>没有第二个参数,那么直接返回,继续执行</li>
</ul>
</li>
</ul>
<h4 id="stdcondition_variablenotify_one"><a aria-hidden="true" tabindex="-1" href="#stdcondition_variablenotify_one"><span class="icon icon-link"></span></a><code>std::condition_variable::notify_one</code></h4>
<p><code>notify_one</code> 唤醒一个调用 <code>wait</code> 的线程。注意在唤醒之前要解锁,否则调用 <code>wait</code> 的线程也会因为无法加锁而阻塞。</p>
<h4 id="stdcondition_variablenotify_all"><a aria-hidden="true" tabindex="-1" href="#stdcondition_variablenotify_all"><span class="icon icon-link"></span></a><code>std::condition_variable::notify_all</code></h4>
<p>唤醒所有调用 <code>wait</code> 的线程。</p>
</div></div></div><div class="wrap h3body-exist row-span-2"><div class="wrap-header h3wrap"><h3 id="获取线程的运行结果"><a aria-hidden="true" tabindex="-1" href="#获取线程的运行结果"><span class="icon icon-link"></span></a>获取线程的运行结果</h3><div class="wrap-body">
<!--rehype:wrap-class=row-span-2-->
<blockquote>
<p><code>#include &#x3C;future></code></p>
</blockquote>
<h4 id="创建异步任务"><a aria-hidden="true" tabindex="-1" href="#创建异步任务"><span class="icon icon-link"></span></a>创建异步任务</h4>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">double</span> <span class="token function">func</span><span class="token punctuation">(</span><span class="token keyword">int</span> val<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token comment">// 使用std::async创建异步任务</span>
</span><span class="code-line"><span class="token comment">// 使用std::future获取结果</span>
</span><span class="code-line"><span class="token comment">// future模板中存放返回值类型</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>future<span class="token operator">&#x3C;</span><span class="token keyword">double</span><span class="token operator">></span> result <span class="token operator">=</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span><span class="token function">async</span><span class="token punctuation">(</span>func<span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
<h4 id="获取异步任务的返回值"><a aria-hidden="true" tabindex="-1" href="#获取异步任务的返回值"><span class="icon icon-link"></span></a>获取异步任务的返回值</h4>
<p>等待异步任务结束,但是不获取返回值:</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">result<span class="token punctuation">.</span><span class="token function">wait</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
<p>获取异步任务的返回值:</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> val <span class="token operator">=</span> result<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
<p>注:</p>
<ul>
<li><code>get()</code>返回右值,因此只可调用一次</li>
<li>只要调用上述任意函数,线程就会一直阻塞到返回值可用(入口函数运行结束)</li>
</ul>
<h4 id="stdasync-的额外参数"><a aria-hidden="true" tabindex="-1" href="#stdasync-的额外参数"><span class="icon icon-link"></span></a><code>std::async</code> 的额外参数</h4>
<p>额外参数可以被放在 <code>std::async</code> 的第一个参数位置,用于设定 <code>std::async</code> 的行为:</p>
<ul>
<li><code>std::launch::deferred</code>:入口函数的运行会被推迟到<code>std::future&#x3C;T>::get()</code>或者<code>std::future&#x3C;T>::wait()</code>被调用时。此时调用线程会直接运行线程入口函数,换言之,<strong>不会创建子线程</strong></li>
<li><code>std::launch::async</code>:立即创建子线程,并运行线程入口函数</li>
<li><code>std::launch::deferred | std::launch::async</code>:默认值,由系统自行决定</li>
</ul>
<h4 id="返回值的状态"><a aria-hidden="true" tabindex="-1" href="#返回值的状态"><span class="icon icon-link"></span></a>返回值的状态</h4>
<p>让当前线程等待一段时间(等待到指定时间点),以期待返回值准备好:</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">extern</span> <span class="token keyword">double</span> <span class="token function">foo</span><span class="token punctuation">(</span><span class="token keyword">int</span> val<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>future<span class="token operator">&#x3C;</span><span class="token keyword">double</span><span class="token operator">></span> result <span class="token operator">=</span>
</span><span class="code-line"> <span class="token function">async</span><span class="token punctuation">(</span>foo<span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token comment">//返回值类型</span>
</span><span class="code-line">std<span class="token double-colon punctuation">::</span>future_status status<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 等待一段时间</span>
</span><span class="code-line">status <span class="token operator">=</span> result<span class="token punctuation">.</span><span class="token function">wait_for</span><span class="token punctuation">(</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>chrono<span class="token double-colon punctuation">::</span><span class="token function">seconds</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>
</span><span class="code-line"> <span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 等待到某一时间点</span>
</span><span class="code-line">status <span class="token operator">=</span> result<span class="token punctuation">.</span><span class="token function">wait_for</span><span class="token punctuation">(</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>chrono<span class="token double-colon punctuation">::</span><span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>chrono<span class="token double-colon punctuation">::</span><span class="token function">seconds</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>
</span><span class="code-line"> <span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
<p>在指定的时间过去后,可以获取等待的结果:</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token comment">// 返回值已经准备好</span>
</span><span class="code-line"><span class="token keyword">if</span> <span class="token punctuation">(</span>status <span class="token operator">==</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>future_status<span class="token double-colon punctuation">::</span>ready<span class="token punctuation">)</span>
</span><span class="code-line"><span class="token punctuation">{</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line"><span class="token comment">// 超时:尚未准备好</span>
</span><span class="code-line"><span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>status <span class="token operator">==</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>future_status<span class="token double-colon punctuation">::</span>timeout<span class="token punctuation">)</span>
</span><span class="code-line"><span class="token punctuation">{</span> <span class="token punctuation">}</span>
</span><span class="code-line"><span class="token comment">// 尚未启动: std::launch::deferred</span>
</span><span class="code-line"><span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>status <span class="token operator">==</span>
</span><span class="code-line"> std<span class="token double-colon punctuation">::</span>future_status<span class="token double-colon punctuation">::</span>deferred<span class="token punctuation">)</span>
</span><span class="code-line"><span class="token punctuation">{</span> <span class="token punctuation">}</span>
</span></code></pre>
<h4 id="多个返回值"><a aria-hidden="true" tabindex="-1" href="#多个返回值"><span class="icon icon-link"></span></a>多个返回值</h4>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">std<span class="token double-colon punctuation">::</span>shared_future<span class="token operator">&#x3C;</span>T<span class="token operator">></span> result<span class="token punctuation">;</span>
</span></code></pre>
<p>如果要多次获取结果,可以使用<code>std::shared_future</code>,其会返回结果的一个<strong>拷贝</strong></p>
<p>对于不可拷贝对象,可以在<code>std::shared_future</code>中存储对象的指针,而非指针本身。</p>
</div></div></div></div></div><div class="wrap h2body-exist"><div class="wrap-header h2wrap"><h2 id="c-预处理器"><a aria-hidden="true" tabindex="-1" href="#c-预处理器"><span class="icon icon-link"></span></a>C++ 预处理器</h2><div class="wrap-body">
</div></div><div class="h2wrap-body"><div class="wrap h3body-not-exist row-span-3"><div class="wrap-header h3wrap"><h3 id="预处理器"><a aria-hidden="true" tabindex="-1" href="#预处理器"><span class="icon icon-link"></span></a>预处理器</h3><div class="wrap-body">
<!--rehype:wrap-class=row-span-3-->
<ul class="style-none cols-2">
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/conditional">if</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/conditional">elif</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/conditional">else</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/conditional">endif</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/conditional">ifdef</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/conditional">ifndef</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/replace">define</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/replace">undef</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/include">include</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/line">line</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/error">error</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/impl">pragma</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/conditional">defined</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/feature_test">__has_include</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/feature_test">__has_cpp_attribute</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/export">export</a></li>
<li><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/keyword/import&#x26;action=edit&#x26;redlink=1">import</a></li>
<li><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/keyword/module&#x26;action=edit&#x26;redlink=1">module</a></li>
</ul>
<!--rehype:className=style-none cols-2-->
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="includes"><a aria-hidden="true" tabindex="-1" href="#includes"><span class="icon icon-link"></span></a>Includes</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">"iostream"</span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;iostream></span></span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="defines"><a aria-hidden="true" tabindex="-1" href="#defines"><span class="icon icon-link"></span></a>Defines</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">FOO</span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">FOO</span> <span class="token string">"hello"</span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">undef</span> <span class="token expression">FOO</span></span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist row-span-2"><div class="wrap-header h3wrap"><h3 id="if"><a aria-hidden="true" tabindex="-1" href="#if"><span class="icon icon-link"></span></a>If</h3><div class="wrap-body">
<!--rehype:wrap-class=row-span-2-->
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">ifdef</span> <span class="token expression">DEBUG</span></span>
</span><span class="code-line"> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token char">'hi'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">elif</span> <span class="token expression">defined VERBOSE</span></span>
</span><span class="code-line"> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">else</span></span>
</span><span class="code-line"> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="error"><a aria-hidden="true" tabindex="-1" href="#error"><span class="icon icon-link"></span></a>Error</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">if</span> <span class="token expression">VERSION <span class="token operator">==</span> <span class="token number">2.0</span></span></span>
</span><span class="code-line"> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">error</span> <span class="token expression">Unsupported</span></span>
</span><span class="code-line"> <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">warning</span> <span class="token expression">Not really supported</span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="宏"><a aria-hidden="true" tabindex="-1" href="#宏"><span class="icon icon-link"></span></a></h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name function">DEG</span><span class="token expression"><span class="token punctuation">(</span>x<span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">57.29</span><span class="token punctuation">)</span></span></span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="令牌连接"><a aria-hidden="true" tabindex="-1" href="#令牌连接"><span class="icon icon-link"></span></a>令牌连接</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name function">DST</span><span class="token expression"><span class="token punctuation">(</span>name<span class="token punctuation">)</span> name</span><span class="token punctuation">##</span><span class="token expression">_s name</span><span class="token punctuation">##</span><span class="token expression">_t</span></span>
</span><span class="code-line"><span class="token function">DST</span><span class="token punctuation">(</span>object<span class="token punctuation">)</span><span class="token punctuation">;</span> #<span class="token operator">=</span><span class="token operator">></span> object_s object_t<span class="token punctuation">;</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="字符串化"><a aria-hidden="true" tabindex="-1" href="#字符串化"><span class="icon icon-link"></span></a>字符串化</h3><div class="wrap-body">
<pre class="wrap-text"><code class="language-cpp code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name function">STR</span><span class="token expression"><span class="token punctuation">(</span>name<span class="token punctuation">)</span> #name</span></span>
</span><span class="code-line"><span class="token keyword">char</span> <span class="token operator">*</span> a <span class="token operator">=</span> <span class="token function">STR</span><span class="token punctuation">(</span>object<span class="token punctuation">)</span><span class="token punctuation">;</span> #<span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">char</span> <span class="token operator">*</span> a <span class="token operator">=</span> <span class="token string">"object"</span><span class="token punctuation">;</span>
</span></code></pre>
<!--rehype:className=wrap-text-->
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="文件和行"><a aria-hidden="true" tabindex="-1" href="#文件和行"><span class="icon icon-link"></span></a>文件和行</h3><div class="wrap-body">
<pre class="wrap-text"><code class="language-cpp code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name function">LOG</span><span class="token expression"><span class="token punctuation">(</span>msg<span class="token punctuation">)</span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token constant">__FILE__</span><span class="token punctuation">,</span> <span class="token constant">__LINE__</span><span class="token punctuation">,</span> msg<span class="token punctuation">)</span></span></span>
</span><span class="code-line">#<span class="token operator">=</span><span class="token operator">></span> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">"file.txt"</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token string">"hey"</span><span class="token punctuation">)</span>
</span></code></pre>
<!--rehype:className=wrap-text-->
</div></div></div></div></div><div class="wrap h2body-exist"><div class="wrap-header h2wrap"><h2 id="各种各样的"><a aria-hidden="true" tabindex="-1" href="#各种各样的"><span class="icon icon-link"></span></a>各种各样的</h2><div class="wrap-body">
</div></div><div class="h2wrap-body"><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="转义序列"><a aria-hidden="true" tabindex="-1" href="#转义序列"><span class="icon icon-link"></span></a>转义序列</h3><div class="wrap-body">
<table><thead><tr><th align="left">转义序列</th><th>说明</th></tr></thead><tbody><tr><td align="left"><code>\b</code></td><td>退格键</td></tr><tr><td align="left"><code>\f</code></td><td>换页</td></tr><tr><td align="left"><code>\n</code></td><td>换行</td></tr><tr><td align="left"><code>\r</code></td><td>返回</td></tr><tr><td align="left"><code>\t</code></td><td>水平制表符</td></tr><tr><td align="left"><code>\v</code></td><td>垂直制表符</td></tr><tr><td align="left"><code>\\</code></td><td>反斜杠</td></tr><tr><td align="left"><code>\'</code></td><td>单引号</td></tr><tr><td align="left"><code>\"</code></td><td>双引号</td></tr><tr><td align="left"><code>\?</code></td><td>问号</td></tr><tr><td align="left"><code>\0</code></td><td>空字符</td></tr></tbody></table>
</div></div></div><div class="wrap h3body-not-exist row-span-2 col-span-2"><div class="wrap-header h3wrap"><h3 id="关键字"><a aria-hidden="true" tabindex="-1" href="#关键字"><span class="icon icon-link"></span></a>关键字</h3><div class="wrap-body">
<!--rehype:wrap-class=row-span-2 col-span-2-->
<ul class="style-none cols-5">
<li><a href="https://zh.cppreference.com/w/cpp/keyword/alignas">alignas</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/alignof">alignof</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/and">and</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/and_eq">and_eq</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/asm">asm</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/atomic_cancel">atomic_cancel</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/atomic_commit">atomic_commit</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/atomic_noexcept">atomic_noexcept</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/auto">auto</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/bitand">bitand</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/bitor">bitor</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/bool">bool</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/break">break</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/case">case</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/catch">catch</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/char">char</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/char8_t">char8_t</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/char16_t">char16_t</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/char32_t">char32_t</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/class">class</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/compl">compl</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/concept">concept</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/const">const</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/consteval">consteval</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/constexpr">constexpr</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/constinit">constinit</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/const_cast">const_cast</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/continue">continue</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/co_await">co_await</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/co_return">co_return</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/co_yield">co_yield</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/decltype">decltype</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/default">default</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/delete">delete</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/do">do</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/double">double</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/dynamic_cast">dynamic_cast</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/else">else</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/enum">enum</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/explicit">explicit</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/export">export</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/extern">extern</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/false">false</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/float">float</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/for">for</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/friend">friend</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/goto">goto</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/if">if</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/inline">inline</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/int">int</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/long">long</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/mutable">mutable</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/namespace">namespace</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/new">new</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/noexcept">noexcept</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/not">not</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/not_eq">not_eq</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/nullptr">nullptr</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/operator">operator</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/or">or</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/or_eq">or_eq</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/private">private</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/protected">protected</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/public">public</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/reflexpr">reflexpr</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/register">register</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/reinterpret_cast">reinterpret_cast</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/requires">requires</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/language/return">return</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/short">short</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/signed">signed</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/sizeof">sizeof</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/static">static</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/static_assert">static_assert</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/static_cast">static_cast</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/struct">struct</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/switch">switch</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/synchronized">synchronized</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/template">template</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/this">this</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/thread_local">thread_local</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/throw">throw</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/true">true</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/try">try</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/typedef">typedef</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/typeid">typeid</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/typename">typename</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/union">union</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/unsigned">unsigned</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/using">using</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/virtual">virtual</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/void">void</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/volatile">volatile</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/wchar_t">wchar_t</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/while">while</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/xor">xor</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/xor_eq">xor_eq</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/language/final">final</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/language/override">override</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/language/transactional_memory">transaction_safe</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/language/transactional_memory">transaction_safe_dynamic</a></li>
</ul>
<!--rehype:className=style-none cols-5-->
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="预处理器-1"><a aria-hidden="true" tabindex="-1" href="#预处理器-1"><span class="icon icon-link"></span></a>预处理器</h3><div class="wrap-body">
<ul class="style-none cols-2">
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/conditional">if</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/conditional">elif</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/conditional">else</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/conditional">endif</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/conditional">ifdef</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/conditional">ifndef</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/replace">define</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/replace">undef</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/include">include</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/line">line</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/error">error</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/impl">pragma</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/preprocessor/conditional">defined</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/feature_test">__has_include</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/feature_test">__has_cpp_attribute</a></li>
<li><a href="https://zh.cppreference.com/w/cpp/keyword/export">export</a></li>
<li><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/keyword/import&#x26;action=edit&#x26;redlink=1">import</a></li>
<li><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/keyword/module&#x26;action=edit&#x26;redlink=1">module</a></li>
</ul>
<!--rehype:className=style-none cols-2-->
</div></div></div></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="另见"><a aria-hidden="true" tabindex="-1" href="#另见"><span class="icon icon-link"></span></a>另见</h2><div class="wrap-body">
<ul>
<li><a href="https://hackingcpp.com/cpp/cheat_sheets.html">C++ Infographics &#x26; Cheat Sheets</a> <em>(hackingcpp.com)</em></li>
<li><a href="https://zh.cppreference.com/w/">C++ reference</a> <em>(cppreference.com)</em></li>
<li><a href="http://www.cplusplus.com/doc/tutorial/">C++ Language Tutorials</a> <em>(cplusplus.com)</em></li>
</ul>
</div></div><div class="h2wrap-body"></div></div></div><script src="https://giscus.app/client.js" data-repo="jaywcjlove/reference" data-repo-id="R_kgDOID2-Mw" data-category="Q&#x26;A" data-category-id="DIC_kwDOID2-M84CS5wo" data-mapping="pathname" data-strict="0" data-reactions-enabled="1" data-emit-metadata="0" data-input-position="bottom" data-theme="dark" data-lang="zh-CN" crossorigin="anonymous" async></script><div class="giscus"></div></div><div class="wrap h1body-exist max-container"><header class="wrap-header h1wrap"><h1 id="数据结构与开发技巧"><svg xmlns="http://www.w3.org/2000/svg" height="1em" width="1em" viewBox="0 0 187 155">
<path fill="currentColor" d="M77.4039102,0.01171875 C104.893578,0.01171875 130.532863,14.8054453 144.312707,38.6186211 L110.875113,57.9682852 C103.978656,46.0481602 91.1520117,38.6428945 77.4039102,38.6428945 C56.1021016,38.6428945 38.7718008,55.9731953 38.7718008,77.2750039 C38.7718008,98.5758789 56.1021016,115.90618 77.4039102,115.90618 C91.1529453,115.90618 103.97959,108.500914 110.87698,96.5789219 L144.314574,115.927652 C130.53473,139.743629 104.895445,154.537355 77.4039102,154.537355 C34.800293,154.537355 0.140625,119.877688 0.140625,77.2750039 C0.140625,34.6713867 34.800293,0.01171875 77.4039102,0.01171875 Z M146.080934,64.3970117 L146.080934,72.9823398 L154.666262,72.9823398 L154.666262,81.5667344 L146.080934,81.5667344 L146.080934,90.1520625 L137.497473,90.1520625 L137.497473,81.5667344 L128.912145,81.5667344 L128.912145,72.9823398 L137.497473,72.9823398 L137.497473,64.3970117 L146.080934,64.3970117 Z M178.274047,64.3970117 L178.274047,72.9823398 L186.859375,72.9823398 L186.859375,81.5667344 L178.274047,81.5667344 L178.274047,90.1520625 L169.690586,90.1520625 L169.690586,81.5667344 L161.105258,81.5667344 L161.105258,72.9823398 L169.690586,72.9823398 L169.690586,64.3970117 L178.274047,64.3970117 Z"></path></svg><a aria-hidden="true" tabindex="-1" href="#数据结构与开发技巧"><span class="icon icon-link"></span></a>数据结构与开发技巧</h1><div class="wrap-body">
</div></header><div class="menu-tocs"><div class="menu-btn"><svg aria-hidden="true" fill="currentColor" height="1em" width="1em" viewBox="0 0 16 16" version="1.1" data-view-component="true">
<path fill-rule="evenodd" d="M2 4a1 1 0 100-2 1 1 0 000 2zm3.75-1.5a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zm0 5a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zm0 5a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zM3 8a1 1 0 11-2 0 1 1 0 012 0zm-1 6a1 1 0 100-2 1 1 0 000 2z"></path>
</svg></div><div class="menu-modal"><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#入门">入门</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#hellocpp">hello.cpp</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#变量">变量</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#原始数据类型">原始数据类型</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#用户输入">用户输入</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#交换">交换</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#注释">注释</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#if-语句">If 语句</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#循环">循环</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#函数">函数</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#引用">引用</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#命名空间">命名空间</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-数组">C++ 数组</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#定义">定义</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#操控">操控</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#展示">展示</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#多维">多维</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-条件">C++ 条件</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#if-clause">If Clause</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#else-if-语句">Else if 语句</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#运算符">运算符</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#关系运算符">关系运算符</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#赋值运算符">赋值运算符</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#逻辑运算符">逻辑运算符</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#位运算符">位运算符</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#三元运算符">三元运算符</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#switch-语句">switch 语句</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-循环">C++ 循环</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#while">While</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#do-while">Do-while</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#continue-语句">Continue 语句</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#无限循环">无限循环</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#for_each-c11-起">for_each (C++11 起)</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#基于范围-c11-起">基于范围 (C++11 起)</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#中断语句">中断语句</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#several-variations">Several variations</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#auto">auto</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-函数">C++ 函数</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#参数和返回">参数和返回</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#重载">重载</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#内置函数">内置函数</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#lambda-表达式">Lambda 表达式</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c多线程">C++多线程</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#多线程介绍">多线程介绍</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#线程的创建">线程的创建</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#线程的销毁">线程的销毁</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#this_thread">this_thread</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#锁"></a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#锁的基本操作">锁的基本操作</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#更简单的锁--stdlock_guardmutex">更简单的锁 —— std::lock_guard&#x3C;Mutex></a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#unique_lockmutex">unique_lock&#x3C;Mutex></a><a aria-hidden="true" class="leve5 tocs-link" data-num="5" href="#stdadopt_lock">std::adopt_lock</a><a aria-hidden="true" class="leve5 tocs-link" data-num="5" href="#stdtry_to_lock">std::try_to_lock</a><a aria-hidden="true" class="leve5 tocs-link" data-num="5" href="#stddefer_lock">std::defer_lock</a><a aria-hidden="true" class="leve5 tocs-link" data-num="5" href="#stdunique_lockmutexrelease">std::unique_lock&#x3C;Mutex>::release</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#stdcall_once">std::call_once</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#stdcondition_variable">std::condition_variable</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#创建条件变量">创建条件变量</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#等待条件变量被通知">等待条件变量被通知</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#stdcondition_variablenotify_one">std::condition_variable::notify_one</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#stdcondition_variablenotify_all">std::condition_variable::notify_all</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#获取线程的运行结果">获取线程的运行结果</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#创建异步任务">创建异步任务</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#获取异步任务的返回值">获取异步任务的返回值</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#stdasync-的额外参数">std::async 的额外参数</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#返回值的状态">返回值的状态</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#多个返回值">多个返回值</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-预处理器">C++ 预处理器</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#预处理器">预处理器</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#includes">Includes</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#defines">Defines</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#if">If</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#error">Error</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#宏"></a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#令牌连接">令牌连接</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#字符串化">字符串化</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#文件和行">文件和行</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#各种各样的">各种各样的</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#转义序列">转义序列</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#关键字">关键字</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#预处理器-1">预处理器</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#另见">另见</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#map和set">map和set</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#string">string</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#指针">指针</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#sstream类处理字符串">sstream类处理字符串</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#技巧">技巧</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c编译流程">C++编译流程</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#说一下-static-关键字的作用">说一下 static 关键字的作用</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#说一下-c和-c-的区别">说一下 C++和 C 的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#指针和引用">指针和引用</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#智能指针-为何使用智能指针">智能指针? 为何使用智能指针</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#解决的问题">解决的问题</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#unique_ptr-shared_ptr-weak_ptr">unique_ptr, shared_ptr, weak_ptr</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#define和const区别">#define和const区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#重载overload覆盖重写override隐藏重定义overwrite这三者之间的区别">重载overload覆盖重写override隐藏重定义overwrite这三者之间的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#多态">多态</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#动态多态和静态多态">动态多态和静态多态</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#动态多台和静态多态的比较">动态多台和静态多态的比较</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#虚函数表">虚函数表</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#多态的工作原理底层实现机制">多态的工作原理(底层实现机制)</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#动态绑定">动态绑定</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#析构函数为何为虚函数">析构函数为何为虚函数:</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#map和set的实现">map和set的实现</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#指针和数组的区别">指针和数组的区别?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#深浅拷贝">深浅拷贝</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#定义字符串的区别">定义字符串的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#类型转换-cast">类型转换? cast</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#const指针">const指针</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#newdelete-与-mallocfree-的区别是什么">new/delete 与 malloc/free 的区别是什么</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#构造函数和析构函数">构造函数和析构函数</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#allocator-内存分配和释放">allocator 内存分配和释放?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#malloc-的原理">malloc 的原理</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#stl迭代器删除元素">STL迭代器删除元素:</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#vector和list-的区别">vector和list 的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#stl迭代器的作用-为何不用指针而用迭代器">STL迭代器的作用, 为何不用指针而用迭代器?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c中类成员的访问权限">C++中类成员的访问权限</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#struct和class的区别">struct和class的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c源文从文本到可执行文件经历过程">C++源文从文本到可执行文件经历过程</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#include--和include-的区别">include "" 和include &#x3C;>的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#forkwaitexec-函数">fork,wait,exec 函数</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#stl-里-resize-和-reserve-的区别">STL 里 resize 和 reserve 的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#bss端等六段-c的内存管理">BSS端等六段: C++的内存管理?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#内存泄漏">内存泄漏</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#判断内存泄漏">判断内存泄漏:</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#如何采用单线程的方式处理高并发">如何采用单线程的方式处理高并发?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#大端小端">大端小端?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#设计一个server-实现多个客户端请求">设计一个server, 实现多个客户端请求</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c的线程锁你知道几种">C++的线程锁你知道几种?</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#互斥锁mutex">互斥锁mutex</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#条件锁">条件锁</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#自旋锁">自旋锁</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#读写锁">读写锁</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#什么类不能被继承">什么类不能被继承</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#结构体和类大小">结构体和类大小</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#类的什么方法不能是虚函数">类的什么方法不能是虚函数</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#hash扩容">hash扩容</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c派生类的构造函数和析构函数执行顺序及其构造形式">C++派生类的构造函数和析构函数执行顺序及其构造形式</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#派生类的构造函数和析构函数的执行顺序">派生类的构造函数和析构函数的执行顺序</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#派生类构造函数和析构函数的构造原则">派生类构造函数和析构函数的构造原则</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#注意">注意</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#虚函数调用的工作原理-基于虚函数多态的机制">虚函数调用的工作原理 基于虚函数多态的机制</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#虚函数和纯虚函数">虚函数和纯虚函数</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#抽象类">抽象类</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#虚函数表-1">虚函数表</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#多态的工作原理底层实现机制-1">多态的工作原理(底层实现机制)</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#动态绑定-1">动态绑定</a></div></div><div class="h1wrap-body"><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="map和set"><a aria-hidden="true" tabindex="-1" href="#map和set"><span class="icon icon-link"></span></a>map和set</h2><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string">&#x3C;iostream></span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string">&#x3C;map></span> <span class="token comment">// 注意map的key会自动排序, 所以在遇到排序问题时参考</span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string">&#x3C;algorithm></span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string">&#x3C;vector></span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;unordered_map></span></span>
</span><span class="code-line"><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// map中 所有元素都是pair</span>
</span><span class="code-line"><span class="token comment">// pair中 第一个元素为key(键值) 用于索引 第二个元素value(实值)</span>
</span><span class="code-line"><span class="token comment">// 所有元素都会根据键值自动排序</span>
</span><span class="code-line"><span class="token comment">// 本质:</span>
</span><span class="code-line"><span class="token comment">// map /mulmap底层都是二叉树</span>
</span><span class="code-line"><span class="token comment">// 优点:</span>
</span><span class="code-line"><span class="token comment">// 可根据key值快速找到value值</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token comment">// map不允许容器中出现相同的值 </span>
</span><span class="code-line"><span class="token comment">// mulmap中允许出现重复的值2</span>
</span><span class="code-line"><span class="token comment">// map大小和交换</span>
</span><span class="code-line"><span class="token comment">// .size() //返回容器中元素的数目</span>
</span><span class="code-line"><span class="token comment">// .empty() //判断容器是否为空</span>
</span><span class="code-line"><span class="token comment">// .swap(st) //交换两个容器</span>
</span><span class="code-line"><span class="token comment">// 插入和删除:</span>
</span><span class="code-line"><span class="token comment">// insert(elem) //容器中插入元素 inseert(pair&#x3C;int,int> ( , ));</span>
</span><span class="code-line"><span class="token comment">// clear() //清除所有元素</span>
</span><span class="code-line"><span class="token comment">// erase(pos) //删除pos迭代器所指的元素 返回下一个迭 代器位置</span>
</span><span class="code-line"><span class="token comment">// erase(key) 删除键值为key的元素</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">void</span> <span class="token function">map_test</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token comment">// https://blog.csdn.net/tcx1992/article/details/80928790</span>
</span><span class="code-line"> <span class="token comment">// https://blog.csdn.net/sevenjoin/article/details/81937695</span>
</span><span class="code-line"> <span class="token keyword">typedef</span> map<span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token punctuation">,</span> string<span class="token operator">></span> myMap<span class="token punctuation">;</span> <span class="token comment">// 这其实就是将map里面的数据格式给固定下来而已, map&#x3C;int, string> = myMap</span>
</span><span class="code-line"> myMap test<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token comment">//插入</span>
</span><span class="code-line"> test<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token generic-function"><span class="token function">pair</span><span class="token generic class-name"><span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token punctuation">,</span> string<span class="token operator">></span></span></span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token string">"a"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> test<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token generic-function"><span class="token function">pair</span><span class="token generic class-name"><span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token punctuation">,</span> string<span class="token operator">></span></span></span><span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token string">"b"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> test<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token generic-function"><span class="token function">pair</span><span class="token generic class-name"><span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token punctuation">,</span> string<span class="token operator">></span></span></span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token string">"c"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> test<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token generic-function"><span class="token function">pair</span><span class="token generic class-name"><span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token punctuation">,</span> string<span class="token operator">></span></span></span><span class="token punctuation">(</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token string">"d"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> test<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token generic-function"><span class="token function">pair</span><span class="token generic class-name"><span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token punctuation">,</span> string<span class="token operator">></span></span></span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">,</span> <span class="token string">"e"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">//遍历二叉搜索树的中序遍历按照key值递增顺序</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"遍历"</span> <span class="token operator">&#x3C;&#x3C;</span> endl<span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">// for(auto i : test){ // 将temp里面的每个值, 放到i中, 这个i是新建的</span>
</span><span class="code-line"> <span class="token comment">// for(auto &#x26;i : test){ // 将temp里面的每个值, 软连接到i, 修改i就是在修改temp中的值</span>
</span><span class="code-line"> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">auto</span> <span class="token operator">&#x26;</span>i <span class="token operator">:</span> test<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment">// 将temp里面的每个值, 软连接到i, 禁用修改, 防止在遍历过程中出现改值</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> i<span class="token punctuation">.</span>second <span class="token operator">&#x3C;&#x3C;</span> endl<span class="token punctuation">;</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> endl<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">auto</span> iter <span class="token operator">=</span> test<span class="token punctuation">.</span><span class="token function">rbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//最大的N个数</span>
</span><span class="code-line"> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&#x3C;</span> <span class="token number">3</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> iter<span class="token operator">++</span><span class="token operator">-></span>second <span class="token operator">&#x3C;&#x3C;</span> endl<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token comment">//查找</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"查找"</span> <span class="token operator">&#x3C;&#x3C;</span> endl<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token comment">// 使用find返回的是被查找元素的位置没有则返回map.end()。</span>
</span><span class="code-line"> <span class="token keyword">auto</span> it <span class="token operator">=</span> test<span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//查找key=50的数据是, find(key)返回的是pair格式, 也就是(50, e), 所以it->second=</span>
</span><span class="code-line"> <span class="token keyword">if</span> <span class="token punctuation">(</span>it <span class="token operator">!=</span> test<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> it<span class="token operator">-></span>second <span class="token operator">&#x3C;&#x3C;</span> endl<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token comment">// 使用count返回的是被查找元素的个数。如果有返回1否则返回0</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> test<span class="token punctuation">.</span><span class="token function">count</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span> <span class="token operator">&#x3C;&#x3C;</span> endl<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token comment">//删除</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"删除"</span> <span class="token operator">&#x3C;&#x3C;</span> endl<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">if</span> <span class="token punctuation">(</span>test<span class="token punctuation">.</span><span class="token function">erase</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"delete success"</span> <span class="token operator">&#x3C;&#x3C;</span> endl<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">auto</span> <span class="token operator">&#x26;</span>i <span class="token operator">:</span> test<span class="token punctuation">)</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> i<span class="token punctuation">.</span>second <span class="token operator">&#x3C;&#x3C;</span> endl<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">void</span> <span class="token function">map_test2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> map<span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token punctuation">,</span> string<span class="token operator">></span> myMap<span class="token punctuation">;</span> <span class="token comment">// 创建</span>
</span><span class="code-line"> myMap<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token generic-function"><span class="token function">pair</span><span class="token generic class-name"><span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token punctuation">,</span> string<span class="token operator">></span></span></span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token string">"a"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 插入</span>
</span><span class="code-line"> myMap<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token generic-function"><span class="token function">pair</span><span class="token generic class-name"><span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token punctuation">,</span> string<span class="token operator">></span></span></span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token string">"b"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> myMap<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token generic-function"><span class="token function">pair</span><span class="token generic class-name"><span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token punctuation">,</span> string<span class="token operator">></span></span></span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">,</span> <span class="token string">"d"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">auto</span> <span class="token operator">&#x26;</span>i <span class="token operator">:</span> myMap<span class="token punctuation">)</span> cout <span class="token operator">&#x3C;&#x3C;</span>i<span class="token punctuation">.</span>first <span class="token operator">&#x3C;&#x3C;</span><span class="token string">"value="</span><span class="token operator">&#x3C;&#x3C;</span> i<span class="token punctuation">.</span>second<span class="token operator">&#x3C;&#x3C;</span><span class="token string">"; "</span><span class="token punctuation">;</span> cout<span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span> <span class="token comment">// 遍历</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">//返回map最后一个值</span>
</span><span class="code-line"> map<span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token punctuation">,</span> string<span class="token operator">></span><span class="token double-colon punctuation">::</span>reverse_iterator iter <span class="token operator">=</span> myMap<span class="token punctuation">.</span><span class="token function">rbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">if</span> <span class="token punctuation">(</span>iter <span class="token operator">!=</span> myMap<span class="token punctuation">.</span><span class="token function">rend</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> cout<span class="token operator">&#x3C;&#x3C;</span><span class="token string">"最后一个值是"</span><span class="token operator">&#x3C;&#x3C;</span>iter<span class="token operator">-></span>first <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"-"</span> <span class="token operator">&#x3C;&#x3C;</span> iter<span class="token operator">-></span>second <span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token comment">// cout&#x3C;&#x3C;"最后一个值是"&#x3C;&#x3C;myMap.end()->first &#x3C;&#x3C; "-" &#x3C;&#x3C; myMap.end()->second &#x3C;&#x3C;endl; //这样是错误的, 因为rend()和end()这两个函数只是标记找没找到 不是返回最后一个元素</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">// 最大的2个数</span>
</span><span class="code-line"> <span class="token keyword">auto</span> iter1 <span class="token operator">=</span> myMap<span class="token punctuation">.</span><span class="token function">rbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&#x3C;</span> <span class="token number">2</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> iter1<span class="token operator">++</span><span class="token operator">-></span>second <span class="token operator">&#x3C;&#x3C;</span> endl<span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">// 查找find</span>
</span><span class="code-line"> <span class="token keyword">auto</span> it <span class="token operator">=</span> myMap<span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//查找key=50的数据是, find(key)返回的是pair格式, 也就是(50, e), 所以it->second=</span>
</span><span class="code-line"> <span class="token keyword">if</span> <span class="token punctuation">(</span>it <span class="token operator">!=</span> myMap<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span>it<span class="token operator">-></span>first <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"-"</span><span class="token operator">&#x3C;&#x3C;</span>it<span class="token operator">-></span>second <span class="token operator">&#x3C;&#x3C;</span> endl<span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">// 判断存在, </span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"3有"</span> <span class="token operator">&#x3C;&#x3C;</span> myMap<span class="token punctuation">.</span><span class="token function">count</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span> <span class="token operator">&#x3C;&#x3C;</span> endl<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
</span><span class="code-line"><span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token comment">// map_test2();</span>
</span><span class="code-line"> unordered_map<span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token punctuation">,</span> string<span class="token operator">></span> map1<span class="token punctuation">{</span><span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token string">"hel"</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token string">"ahskg"</span><span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token string">"world"</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span>map1<span class="token punctuation">.</span><span class="token function">at</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span> <span class="token comment">// 最简单的查找</span>
</span><span class="code-line"> <span class="token comment">// cout&#x3C;&#x3C;map1.at(5)&#x3C;&#x3C;endl; // 最简单的查找</span>
</span><span class="code-line"> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="string"><a aria-hidden="true" tabindex="-1" href="#string"><span class="icon icon-link"></span></a>string</h2><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;iostream></span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;algorithm></span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;stdio.h></span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;vector></span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;sstream></span> <span class="token comment">// 为了使用stringsteam</span></span>
</span><span class="code-line"><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 题目描述: 给定字符串S,T, 求S中包含T所有字符的最短连续子字符串的长度, 时间复杂度不能超过O(n)</span>
</span><span class="code-line"><span class="token comment">// 输入样例: </span>
</span><span class="code-line"><span class="token comment">// Input: S = "ADOBECODEBANC", T = "ABC"</span>
</span><span class="code-line"><span class="token comment">// Output: "BANC"</span>
</span><span class="code-line">
</span><span class="code-line">string <span class="token function">String_test</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> string str<span class="token operator">=</span><span class="token string">"hello world"</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">//直接打印字符串</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span><span class="token string">"str="</span><span class="token operator">&#x3C;&#x3C;</span>str<span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token comment">// printf("%s\n", str); //这里会报错, 需要将string转化为const char*类型</span>
</span><span class="code-line"> <span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>p <span class="token operator">=</span> str<span class="token punctuation">.</span><span class="token function">c_str</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"str=%s\n"</span><span class="token punctuation">,</span> p<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">// 求字符串长度:</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span><span class="token string">"字符串长度等于: "</span><span class="token operator">&#x3C;&#x3C;</span>str<span class="token punctuation">.</span><span class="token function">length</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">// 打印字符串最后一位</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span><span class="token string">"字符串最后一位"</span><span class="token operator">&#x3C;&#x3C;</span>str<span class="token punctuation">[</span>str<span class="token punctuation">.</span><span class="token function">length</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span><span class="token string">"字符串最后一位"</span><span class="token operator">&#x3C;&#x3C;</span>str<span class="token punctuation">.</span><span class="token function">back</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">// string切片 substr(起始位置, 长度)</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span><span class="token string">"切片"</span><span class="token operator">&#x3C;&#x3C;</span>str<span class="token punctuation">.</span><span class="token function">substr</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">//比较字符串</span>
</span><span class="code-line"> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token number">0</span> <span class="token operator">==</span> str<span class="token punctuation">.</span><span class="token function">compare</span><span class="token punctuation">(</span><span class="token string">"hello world"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"字符串等于hello world\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">// 字符串判断空</span>
</span><span class="code-line"> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>str<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"字符串不为空\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">// 字符串翻转</span>
</span><span class="code-line"> <span class="token comment">// reverse(str.begin(), str.end()); // algorithm定义</span>
</span><span class="code-line">
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">// char*、char[]转换为string </span>
</span><span class="code-line"> <span class="token keyword">const</span> <span class="token keyword">char</span><span class="token operator">*</span> pszName <span class="token operator">=</span> <span class="token string">"liitdar"</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">char</span> pszCamp<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"alliance"</span><span class="token punctuation">;</span>
</span><span class="code-line"> string strName <span class="token operator">=</span> pszName<span class="token punctuation">;</span>
</span><span class="code-line"> string strCamp <span class="token operator">=</span> pszCamp<span class="token punctuation">;</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"strName is: "</span> <span class="token operator">&#x3C;&#x3C;</span> strName <span class="token operator">&#x3C;&#x3C;</span> endl<span class="token punctuation">;</span> <span class="token comment">//strName is: liitdar</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"strCamp is: "</span> <span class="token operator">&#x3C;&#x3C;</span> strCamp <span class="token operator">&#x3C;&#x3C;</span> endl<span class="token punctuation">;</span> <span class="token comment">//strCamp is: alliance</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">// find检测是否存在</span>
</span><span class="code-line"> <span class="token comment">// size_t find (const string&#x26; str, size_t pos = 0) const;</span>
</span><span class="code-line"> <span class="token comment">// size_t find (const char* s, size_t pos = 0) const;</span>
</span><span class="code-line"> <span class="token comment">// size_t find (const char* s, size_t pos, size_t n) const;</span>
</span><span class="code-line"> <span class="token comment">// size_t find (char c, size_t pos = 0) const;</span>
</span><span class="code-line"> string str2 <span class="token operator">=</span> <span class="token string">"world"</span><span class="token punctuation">;</span>
</span><span class="code-line"> size_t son_location <span class="token operator">=</span> str<span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span>str2<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">if</span> <span class="token punctuation">(</span>son_location <span class="token operator">!=</span> string<span class="token double-colon punctuation">::</span>npos<span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span><span class="token string">"找到子串str2, 在str位置是: "</span><span class="token operator">&#x3C;&#x3C;</span>son_location<span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span> <span class="token comment">//找到子串str2, 在str位置是: 6</span>
</span><span class="code-line"> <span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">// 插入方法 insert</span>
</span><span class="code-line"> str<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token number">6</span><span class="token punctuation">,</span> <span class="token string">"zjq's "</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//hello zjq's world</span>
</span><span class="code-line"> str<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token char">'a'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//在5的位置, 插入4个a</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span>str<span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">// int2string stringstream</span>
</span><span class="code-line"> <span class="token keyword">int</span> n1 <span class="token operator">=</span> <span class="token number">1234</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token comment">// n1.str(); // 这肯定不对</span>
</span><span class="code-line"> stringstream str3<span class="token punctuation">;</span> <span class="token comment">//注意这里导入头文件&#x3C;sstream></span>
</span><span class="code-line"> str3 <span class="token operator">&#x3C;&#x3C;</span> n1<span class="token punctuation">;</span>
</span><span class="code-line"> string str4 <span class="token operator">=</span> str3<span class="token punctuation">.</span><span class="token function">str</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span><span class="token string">"将int类型转化为string类型: "</span><span class="token operator">&#x3C;&#x3C;</span>str4<span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"> string str5<span class="token punctuation">;</span>
</span><span class="code-line"> str3 <span class="token operator">>></span> str5<span class="token punctuation">;</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span>str5<span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span> <span class="token comment">//总之都要将int转化为string类型</span>
</span><span class="code-line">
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">// 方法2 to_string</span>
</span><span class="code-line"> <span class="token keyword">int</span> numb2 <span class="token operator">=</span> <span class="token number">456</span><span class="token punctuation">;</span>
</span><span class="code-line"> string str6<span class="token punctuation">;</span>
</span><span class="code-line"> str6 <span class="token operator">=</span> <span class="token function">to_string</span><span class="token punctuation">(</span>numb2<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// C++11 标准</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"str6 is: "</span> <span class="token operator">&#x3C;&#x3C;</span> str6 <span class="token operator">&#x3C;&#x3C;</span> endl<span class="token punctuation">;</span> <span class="token comment">//str6 is: 456</span>
</span><span class="code-line"> <span class="token keyword">return</span> str6<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token keyword">int</span> argc<span class="token punctuation">,</span> <span class="token keyword">char</span> <span class="token keyword">const</span> <span class="token operator">*</span>argv<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
</span><span class="code-line"><span class="token punctuation">{</span>
</span><span class="code-line"> string str <span class="token operator">=</span> <span class="token function">String_test</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span>str<span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="指针"><a aria-hidden="true" tabindex="-1" href="#指针"><span class="icon icon-link"></span></a>指针</h2><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;iostream></span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;vector></span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;algorithm></span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;stdio.h></span></span>
</span><span class="code-line"><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token comment">// 指针和引用</span>
</span><span class="code-line"><span class="token keyword">void</span> <span class="token function">test1</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token operator">*</span>a<span class="token punctuation">,</span> <span class="token keyword">int</span> b<span class="token punctuation">,</span> <span class="token keyword">int</span> <span class="token operator">&#x26;</span>c<span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span><span class="token string">"函数参数输入是: *a="</span><span class="token operator">&#x3C;&#x3C;</span><span class="token operator">*</span>a<span class="token operator">&#x3C;&#x3C;</span><span class="token string">" b="</span><span class="token operator">&#x3C;&#x3C;</span>b<span class="token operator">&#x3C;&#x3C;</span><span class="token string">" c="</span><span class="token operator">&#x3C;&#x3C;</span>c<span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token operator">*</span>a <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">;</span>
</span><span class="code-line"> b <span class="token operator">=</span> <span class="token number">23</span><span class="token punctuation">;</span>
</span><span class="code-line"> c <span class="token operator">=</span> <span class="token number">25</span><span class="token punctuation">;</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span><span class="token string">"函数参数修改后的结果是: *a="</span><span class="token operator">&#x3C;&#x3C;</span><span class="token operator">*</span>a<span class="token operator">&#x3C;&#x3C;</span><span class="token string">" b="</span><span class="token operator">&#x3C;&#x3C;</span>b<span class="token operator">&#x3C;&#x3C;</span><span class="token string">" c="</span><span class="token operator">&#x3C;&#x3C;</span>c<span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">void</span> <span class="token function">pointor_test1</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">int</span> x<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">,</span> y<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">,</span> z<span class="token operator">=</span><span class="token number">3</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">int</span> <span class="token operator">*</span>z1 <span class="token operator">=</span> <span class="token operator">&#x26;</span>z<span class="token punctuation">;</span> <span class="token comment">//指向z地址的指针z1</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span><span class="token string">"原始数据值是: *z1="</span><span class="token operator">&#x3C;&#x3C;</span><span class="token operator">*</span>z1<span class="token operator">&#x3C;&#x3C;</span><span class="token string">" x="</span><span class="token operator">&#x3C;&#x3C;</span>x<span class="token operator">&#x3C;&#x3C;</span><span class="token string">" y="</span><span class="token operator">&#x3C;&#x3C;</span>y<span class="token operator">&#x3C;&#x3C;</span><span class="token string">" z="</span><span class="token operator">&#x3C;&#x3C;</span>z<span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token function">test1</span><span class="token punctuation">(</span>z1<span class="token punctuation">,</span>x<span class="token punctuation">,</span>y<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span><span class="token string">"经过函数洗礼后的结果是: *z1="</span><span class="token operator">&#x3C;&#x3C;</span><span class="token operator">*</span>z1<span class="token operator">&#x3C;&#x3C;</span><span class="token string">" x="</span><span class="token operator">&#x3C;&#x3C;</span>x<span class="token operator">&#x3C;&#x3C;</span><span class="token string">" y="</span><span class="token operator">&#x3C;&#x3C;</span>y<span class="token operator">&#x3C;&#x3C;</span><span class="token string">" z="</span><span class="token operator">&#x3C;&#x3C;</span>z<span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token comment">/*
</span></span><span class="code-line"><span class="token comment"> 总结: 引用&#x26;跟指针的原理都是一样, 就是传递的是指针,所以当函数参数使用&#x26;时,该参数的改变就会影响到调用的值
</span></span><span class="code-line"><span class="token comment">
</span></span><span class="code-line"><span class="token comment"> *z1和y的引用: 根据结果可以看出来, 其实指针*跟引用&#x26;有着异曲同工之妙呀, \
</span></span><span class="code-line"><span class="token comment"> 因为指针*z1指向的地址, 传递给函数后, 函数对这个地址的内容进行了修改\
</span></span><span class="code-line"><span class="token comment"> 但是由于*z1指向的地址的参数z的作用于是main函数, 也就是只有等到main函数结束后, \
</span></span><span class="code-line"><span class="token comment"> 回收机制才会将z回收, 所以当*z1去函数test的作用域走了一圈以后, 他指向的地址依然有效;"
</span></span><span class="code-line"><span class="token comment">
</span></span><span class="code-line"><span class="token comment"> x的调用: 虽然x的作用域是main, 但是传递到test的x, 其实只是值传递给了b, 而b的作用域只是函数test1, 当test1执行完毕, \
</span></span><span class="code-line"><span class="token comment"> b自然就废了, 所以即使b的值改变了, 但是并没有影响到x的值变化
</span></span><span class="code-line"><span class="token comment"> */</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">int</span> <span class="token operator">*</span> <span class="token function">addition</span><span class="token punctuation">(</span><span class="token keyword">int</span> a<span class="token punctuation">,</span> <span class="token keyword">int</span> b<span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token comment">// new函数和malloc函数申请的内存在堆, 因此函数即使执行完毕, 堆不会回收</span>
</span><span class="code-line"> <span class="token keyword">int</span> <span class="token operator">*</span>sum <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">int</span><span class="token punctuation">(</span>a<span class="token operator">+</span>b<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//创建指针, 指针指向一块新开辟的内存(这块内存是new开辟出来的), 内存的里面的值是a+b</span>
</span><span class="code-line"> <span class="token keyword">return</span> sum<span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">// 这里之所以返回的地址虽然正确, 但是内容错误, </span>
</span><span class="code-line"> <span class="token comment">// 这是因为在函数中创建的c是在栈中创建, 作用域只有在函数内有效, 等函数执行完毕,c被回收, </span>
</span><span class="code-line"> <span class="token comment">// 因此即使地址还是那个地址, 但是c已经不再是那个c了</span>
</span><span class="code-line"> <span class="token comment">// int c = a+b;</span>
</span><span class="code-line"> <span class="token comment">// int *sum = &#x26;c; //sum 指向c这块地址</span>
</span><span class="code-line"> <span class="token comment">// cout&#x3C;&#x3C;"sum="&#x3C;&#x3C;*sum&#x3C;&#x3C;" 地址是:"&#x3C;&#x3C;sum&#x3C;&#x3C;endl;</span>
</span><span class="code-line"> <span class="token comment">// return sum; </span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">// int *c = a+b; //这个错误出在了a+b是一个值, 不是一个地址</span>
</span><span class="code-line"> <span class="token comment">// return c;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">int</span> <span class="token function">subtraction</span><span class="token punctuation">(</span><span class="token keyword">int</span> a<span class="token punctuation">,</span> <span class="token keyword">int</span> b<span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">return</span> a<span class="token operator">-</span>b<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">int</span> <span class="token function">operation</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">,</span> <span class="token keyword">int</span> y<span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token punctuation">(</span><span class="token operator">*</span>func<span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">,</span><span class="token keyword">int</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token operator">*</span>func<span class="token punctuation">)</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span>y<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token keyword">int</span> argc<span class="token punctuation">,</span> <span class="token keyword">char</span> <span class="token keyword">const</span> <span class="token operator">*</span>argv<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
</span><span class="code-line"><span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token function">pointor_test1</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 指针和引用的基础使用</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token keyword">int</span> <span class="token operator">*</span>p <span class="token operator">=</span> <span class="token function">addition</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//函数指针, 返回指针, 同时证明new int(a+b)开辟的空间在堆上, 需要手动回收或者程序执行完毕才会回收</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span><span class="token string">"返回来的值和地址是:"</span><span class="token operator">&#x3C;&#x3C;</span> <span class="token operator">*</span>p<span class="token operator">&#x3C;&#x3C;</span><span class="token string">" 地址:"</span><span class="token operator">&#x3C;&#x3C;</span> p <span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token keyword">int</span> x <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">int</span> <span class="token operator">*</span>p1 <span class="token operator">=</span> <span class="token operator">&#x26;</span>x<span class="token punctuation">;</span> <span class="token comment">//此时p1指向一块内存, 内存里面存的是3, </span>
</span><span class="code-line"> <span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">*</span>p2<span class="token operator">=</span><span class="token operator">&#x26;</span>x<span class="token punctuation">;</span> <span class="token comment">// 指针能修改, 但是值不能被修改</span>
</span><span class="code-line"> <span class="token keyword">int</span> <span class="token operator">*</span> <span class="token keyword">const</span> p3 <span class="token operator">=</span> <span class="token operator">&#x26;</span>x<span class="token punctuation">;</span> <span class="token comment">// 指针不能被修改, 但是值可以</span>
</span><span class="code-line"> <span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">*</span> <span class="token keyword">const</span> p4 <span class="token operator">=</span> <span class="token operator">&#x26;</span>x<span class="token punctuation">;</span> <span class="token comment">// 指针不能被修改, 值也不能</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">// 指针函数minus, 指向函数的指针</span>
</span><span class="code-line"> <span class="token keyword">int</span> <span class="token punctuation">(</span><span class="token operator">*</span>minus<span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token punctuation">)</span> <span class="token operator">=</span> subtraction<span class="token punctuation">;</span> <span class="token comment">// minus指向函数subtraction</span>
</span><span class="code-line"> <span class="token keyword">int</span> <span class="token operator">*</span>m <span class="token operator">=</span> <span class="token function">addition</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 返回的是addition结果保存的地址</span>
</span><span class="code-line"> <span class="token keyword">int</span> n <span class="token operator">=</span> <span class="token function">operation</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token operator">*</span>m<span class="token punctuation">,</span> minus<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// x=3, y=1+2=3, 函数执行minus,即subtraction</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span><span class="token string">"结果是:"</span><span class="token operator">&#x3C;&#x3C;</span>n<span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="sstream类处理字符串"><a aria-hidden="true" tabindex="-1" href="#sstream类处理字符串"><span class="icon icon-link"></span></a>sstream类处理字符串</h2><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;vector></span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;iostream></span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;unordered_map></span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;unordered_map></span></span>
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;sstream></span> <span class="token comment">// C++引入了ostringstream、istringstream、stringstream这三个类</span></span>
</span><span class="code-line"><span class="token comment">/*
</span></span><span class="code-line"><span class="token comment">istringstream类用于执行C++风格的串流的输入操作。 string str="i am a boy"; 该类可以搞出来一个队列分解这四个单词
</span></span><span class="code-line"><span class="token comment">ostringstream类用于执行C风格的串流的输出操作。
</span></span><span class="code-line"><span class="token comment">strstream类同时可以支持C风格的串流的输入输出操作。
</span></span><span class="code-line"><span class="token comment">*/</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token keyword">int</span> argc<span class="token punctuation">,</span> <span class="token keyword">char</span> <span class="token keyword">const</span> <span class="token operator">*</span>argv<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
</span><span class="code-line"><span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token comment">// 这里打印出来的东西主要是看s的类型, </span>
</span><span class="code-line"> <span class="token comment">// 如果s是int, 就打印出12,3,4,5,67</span>
</span><span class="code-line"> <span class="token comment">// 如果s是char, 就打印出所有字符</span>
</span><span class="code-line"> <span class="token comment">// 如果s是string, 就直接将整行打印出来</span>
</span><span class="code-line"> string a <span class="token operator">=</span> <span class="token string">"12+3-4+5*67"</span><span class="token punctuation">;</span>
</span><span class="code-line"> istringstream <span class="token function">s1</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">int</span> i<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token comment">// 12 3 -4 5 </span>
</span><span class="code-line"> <span class="token keyword">while</span><span class="token punctuation">(</span>s1 <span class="token operator">>></span> i<span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span>i<span class="token operator">&#x3C;&#x3C;</span><span class="token string">" "</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span>cout<span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"> istringstream <span class="token function">s2</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">char</span> c<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token comment">// 1 2 + 3 - 4 + 5 * 6 7 </span>
</span><span class="code-line"> <span class="token keyword">while</span><span class="token punctuation">(</span>s2 <span class="token operator">>></span> c<span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span>c<span class="token operator">&#x3C;&#x3C;</span><span class="token string">" "</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span>cout<span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"> string b <span class="token operator">=</span> <span class="token string">"hello world, my name is zjq, hello worldB, my name is xixi"</span><span class="token punctuation">;</span>
</span><span class="code-line"> istringstream <span class="token function">s3</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> string s<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token comment">// hello//world,//my//name//is//zjq//</span>
</span><span class="code-line"> <span class="token keyword">while</span><span class="token punctuation">(</span>s3 <span class="token operator">>></span> s<span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span>s<span class="token operator">&#x3C;&#x3C;</span><span class="token string">"//"</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span>cout<span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token comment">// 统计b里面的单词和数量</span>
</span><span class="code-line"> istringstream <span class="token function">s4</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> string str1<span class="token punctuation">;</span>
</span><span class="code-line"> unordered_map<span class="token operator">&#x3C;</span>string <span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token operator">></span> counts<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token comment">// hello//world,//my//name//is//zjq//</span>
</span><span class="code-line"> <span class="token keyword">while</span><span class="token punctuation">(</span>s4 <span class="token operator">>></span> str1<span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> counts<span class="token punctuation">[</span>str1<span class="token punctuation">]</span><span class="token operator">++</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span>cout<span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">auto</span><span class="token operator">&#x26;</span> count<span class="token operator">:</span> counts<span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> cout<span class="token operator">&#x3C;&#x3C;</span>count<span class="token punctuation">.</span>first<span class="token operator">&#x3C;&#x3C;</span><span class="token string">":"</span><span class="token operator">&#x3C;&#x3C;</span>count<span class="token punctuation">.</span>second<span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span></code></pre>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="技巧"><a aria-hidden="true" tabindex="-1" href="#技巧"><span class="icon icon-link"></span></a>技巧</h2><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token comment">// 子串表示连续的, 子序列表示不连续</span>
</span><span class="code-line"><span class="token comment">// 没有特别需要排序的要求, 最好使用unordered_map和unordered_set, 底层是hash, 索引速度快, 没有排序的过程</span>
</span><span class="code-line"><span class="token comment">// 能使用&#x26;进行参数传递, 尽可能使用&#x26;, 提高内存使用效率</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&#x3C;string></span> <span class="token comment">// getline</span></span>
</span><span class="code-line">
</span><span class="code-line">string str<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token function">getline</span><span class="token punctuation">(</span>cin<span class="token punctuation">,</span> str<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//可以将带空格的字符放入到str中</span>
</span><span class="code-line">cout<span class="token operator">&#x3C;&#x3C;</span>str<span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span></code></pre>
</div></div><div class="h2wrap-body"></div></div></div><script src="https://giscus.app/client.js" data-repo="jaywcjlove/reference" data-repo-id="R_kgDOID2-Mw" data-category="Q&#x26;A" data-category-id="DIC_kwDOID2-M84CS5wo" data-mapping="pathname" data-strict="0" data-reactions-enabled="1" data-emit-metadata="0" data-input-position="bottom" data-theme="dark" data-lang="zh-CN" crossorigin="anonymous" async></script><div class="giscus"></div></div><div class="wrap h1body-exist max-container"><header class="wrap-header h1wrap"><h1 id="面试知识点"><svg xmlns="http://www.w3.org/2000/svg" height="1em" width="1em" viewBox="0 0 187 155">
<path fill="currentColor" d="M77.4039102,0.01171875 C104.893578,0.01171875 130.532863,14.8054453 144.312707,38.6186211 L110.875113,57.9682852 C103.978656,46.0481602 91.1520117,38.6428945 77.4039102,38.6428945 C56.1021016,38.6428945 38.7718008,55.9731953 38.7718008,77.2750039 C38.7718008,98.5758789 56.1021016,115.90618 77.4039102,115.90618 C91.1529453,115.90618 103.97959,108.500914 110.87698,96.5789219 L144.314574,115.927652 C130.53473,139.743629 104.895445,154.537355 77.4039102,154.537355 C34.800293,154.537355 0.140625,119.877688 0.140625,77.2750039 C0.140625,34.6713867 34.800293,0.01171875 77.4039102,0.01171875 Z M146.080934,64.3970117 L146.080934,72.9823398 L154.666262,72.9823398 L154.666262,81.5667344 L146.080934,81.5667344 L146.080934,90.1520625 L137.497473,90.1520625 L137.497473,81.5667344 L128.912145,81.5667344 L128.912145,72.9823398 L137.497473,72.9823398 L137.497473,64.3970117 L146.080934,64.3970117 Z M178.274047,64.3970117 L178.274047,72.9823398 L186.859375,72.9823398 L186.859375,81.5667344 L178.274047,81.5667344 L178.274047,90.1520625 L169.690586,90.1520625 L169.690586,81.5667344 L161.105258,81.5667344 L161.105258,72.9823398 L169.690586,72.9823398 L169.690586,64.3970117 L178.274047,64.3970117 Z"></path></svg><a aria-hidden="true" tabindex="-1" href="#面试知识点"><span class="icon icon-link"></span></a>面试知识点</h1><div class="wrap-body">
</div></header><div class="menu-tocs"><div class="menu-btn"><svg aria-hidden="true" fill="currentColor" height="1em" width="1em" viewBox="0 0 16 16" version="1.1" data-view-component="true">
<path fill-rule="evenodd" d="M2 4a1 1 0 100-2 1 1 0 000 2zm3.75-1.5a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zm0 5a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zm0 5a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zM3 8a1 1 0 11-2 0 1 1 0 012 0zm-1 6a1 1 0 100-2 1 1 0 000 2z"></path>
</svg></div><div class="menu-modal"><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#入门">入门</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#hellocpp">hello.cpp</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#变量">变量</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#原始数据类型">原始数据类型</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#用户输入">用户输入</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#交换">交换</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#注释">注释</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#if-语句">If 语句</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#循环">循环</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#函数">函数</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#引用">引用</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#命名空间">命名空间</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-数组">C++ 数组</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#定义">定义</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#操控">操控</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#展示">展示</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#多维">多维</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-条件">C++ 条件</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#if-clause">If Clause</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#else-if-语句">Else if 语句</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#运算符">运算符</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#关系运算符">关系运算符</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#赋值运算符">赋值运算符</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#逻辑运算符">逻辑运算符</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#位运算符">位运算符</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#三元运算符">三元运算符</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#switch-语句">switch 语句</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-循环">C++ 循环</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#while">While</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#do-while">Do-while</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#continue-语句">Continue 语句</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#无限循环">无限循环</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#for_each-c11-起">for_each (C++11 起)</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#基于范围-c11-起">基于范围 (C++11 起)</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#中断语句">中断语句</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#several-variations">Several variations</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#auto">auto</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-函数">C++ 函数</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#参数和返回">参数和返回</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#重载">重载</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#内置函数">内置函数</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#lambda-表达式">Lambda 表达式</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c多线程">C++多线程</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#多线程介绍">多线程介绍</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#线程的创建">线程的创建</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#线程的销毁">线程的销毁</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#this_thread">this_thread</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#锁"></a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#锁的基本操作">锁的基本操作</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#更简单的锁--stdlock_guardmutex">更简单的锁 —— std::lock_guard&#x3C;Mutex></a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#unique_lockmutex">unique_lock&#x3C;Mutex></a><a aria-hidden="true" class="leve5 tocs-link" data-num="5" href="#stdadopt_lock">std::adopt_lock</a><a aria-hidden="true" class="leve5 tocs-link" data-num="5" href="#stdtry_to_lock">std::try_to_lock</a><a aria-hidden="true" class="leve5 tocs-link" data-num="5" href="#stddefer_lock">std::defer_lock</a><a aria-hidden="true" class="leve5 tocs-link" data-num="5" href="#stdunique_lockmutexrelease">std::unique_lock&#x3C;Mutex>::release</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#stdcall_once">std::call_once</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#stdcondition_variable">std::condition_variable</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#创建条件变量">创建条件变量</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#等待条件变量被通知">等待条件变量被通知</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#stdcondition_variablenotify_one">std::condition_variable::notify_one</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#stdcondition_variablenotify_all">std::condition_variable::notify_all</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#获取线程的运行结果">获取线程的运行结果</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#创建异步任务">创建异步任务</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#获取异步任务的返回值">获取异步任务的返回值</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#stdasync-的额外参数">std::async 的额外参数</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#返回值的状态">返回值的状态</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#多个返回值">多个返回值</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-预处理器">C++ 预处理器</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#预处理器">预处理器</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#includes">Includes</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#defines">Defines</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#if">If</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#error">Error</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#宏"></a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#令牌连接">令牌连接</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#字符串化">字符串化</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#文件和行">文件和行</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#各种各样的">各种各样的</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#转义序列">转义序列</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#关键字">关键字</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#预处理器-1">预处理器</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#另见">另见</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#map和set">map和set</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#string">string</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#指针">指针</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#sstream类处理字符串">sstream类处理字符串</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#技巧">技巧</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c编译流程">C++编译流程</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#说一下-static-关键字的作用">说一下 static 关键字的作用</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#说一下-c和-c-的区别">说一下 C++和 C 的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#指针和引用">指针和引用</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#智能指针-为何使用智能指针">智能指针? 为何使用智能指针</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#解决的问题">解决的问题</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#unique_ptr-shared_ptr-weak_ptr">unique_ptr, shared_ptr, weak_ptr</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#define和const区别">#define和const区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#重载overload覆盖重写override隐藏重定义overwrite这三者之间的区别">重载overload覆盖重写override隐藏重定义overwrite这三者之间的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#多态">多态</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#动态多态和静态多态">动态多态和静态多态</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#动态多台和静态多态的比较">动态多台和静态多态的比较</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#虚函数表">虚函数表</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#多态的工作原理底层实现机制">多态的工作原理(底层实现机制)</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#动态绑定">动态绑定</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#析构函数为何为虚函数">析构函数为何为虚函数:</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#map和set的实现">map和set的实现</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#指针和数组的区别">指针和数组的区别?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#深浅拷贝">深浅拷贝</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#定义字符串的区别">定义字符串的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#类型转换-cast">类型转换? cast</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#const指针">const指针</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#newdelete-与-mallocfree-的区别是什么">new/delete 与 malloc/free 的区别是什么</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#构造函数和析构函数">构造函数和析构函数</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#allocator-内存分配和释放">allocator 内存分配和释放?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#malloc-的原理">malloc 的原理</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#stl迭代器删除元素">STL迭代器删除元素:</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#vector和list-的区别">vector和list 的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#stl迭代器的作用-为何不用指针而用迭代器">STL迭代器的作用, 为何不用指针而用迭代器?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c中类成员的访问权限">C++中类成员的访问权限</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#struct和class的区别">struct和class的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c源文从文本到可执行文件经历过程">C++源文从文本到可执行文件经历过程</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#include--和include-的区别">include "" 和include &#x3C;>的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#forkwaitexec-函数">fork,wait,exec 函数</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#stl-里-resize-和-reserve-的区别">STL 里 resize 和 reserve 的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#bss端等六段-c的内存管理">BSS端等六段: C++的内存管理?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#内存泄漏">内存泄漏</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#判断内存泄漏">判断内存泄漏:</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#如何采用单线程的方式处理高并发">如何采用单线程的方式处理高并发?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#大端小端">大端小端?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#设计一个server-实现多个客户端请求">设计一个server, 实现多个客户端请求</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c的线程锁你知道几种">C++的线程锁你知道几种?</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#互斥锁mutex">互斥锁mutex</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#条件锁">条件锁</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#自旋锁">自旋锁</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#读写锁">读写锁</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#什么类不能被继承">什么类不能被继承</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#结构体和类大小">结构体和类大小</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#类的什么方法不能是虚函数">类的什么方法不能是虚函数</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#hash扩容">hash扩容</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c派生类的构造函数和析构函数执行顺序及其构造形式">C++派生类的构造函数和析构函数执行顺序及其构造形式</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#派生类的构造函数和析构函数的执行顺序">派生类的构造函数和析构函数的执行顺序</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#派生类构造函数和析构函数的构造原则">派生类构造函数和析构函数的构造原则</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#注意">注意</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#虚函数调用的工作原理-基于虚函数多态的机制">虚函数调用的工作原理 基于虚函数多态的机制</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#虚函数和纯虚函数">虚函数和纯虚函数</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#抽象类">抽象类</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#虚函数表-1">虚函数表</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#多态的工作原理底层实现机制-1">多态的工作原理(底层实现机制)</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#动态绑定-1">动态绑定</a></div></div><div class="h1wrap-body"><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="c编译流程"><a aria-hidden="true" tabindex="-1" href="#c编译流程"><span class="icon icon-link"></span></a><a href="https://www.cnblogs.com/ericling/articles/11736681.html">C++编译流程</a></h2><div class="wrap-body">
<p><a href="C/C++%E7%A8%8B%E5%BA%8F%E7%BC%96%E8%AF%91%E8%BF%87%E7%A8%8B%E8%AF%A6%E8%A7%A3">C/C++程序编译过程详解</a></p>
<ol>
<li>预处理: <strong>预处理用于将所有的#include头文件以及宏定义替换成其真正的内容</strong></li>
<li>编译: <strong>将经过预处理之后的程序转换成特定汇编代码</strong></li>
<li>汇编: <strong>汇编过程将上一步的汇编代码转换成机器码</strong></li>
<li>链接: <strong>链接过程将多个目标文件以及所需的库文件(.so等)链接成最终的可执行文件(executable file)</strong></li>
</ol>
<p><img src="D:/0_2024/work/README.assets/image-20210906112152587.png" alt="image-20210906112152587"></p>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="说一下-static-关键字的作用"><a aria-hidden="true" tabindex="-1" href="#说一下-static-关键字的作用"><span class="icon icon-link"></span></a><a href="https://www.runoob.com/w3cnote/cpp-static-usage.html">说一下 static 关键字的作用</a></h2><div class="wrap-body">
<ol>
<li>
<p>静态局部变量只初始化一次, 延长局部变量生命周期</p>
</li>
<li>
<p>全局, 只能本文件中使用, 不能在其他文件中访问, 既是extern也不行 等于是在每个源文件中都定义了该变量一次</p>
</li>
<li>
<p>头文件中定义: 每个CPP文件中会拷贝一份对应的变量</p>
</li>
<li>
<p>修饰函数: 该函数只能本文件访问</p>
</li>
<li>
<p>不想被释放时, 比如修饰函数中存放栈空间的数组, 可以加static</p>
</li>
<li>
<p></p>
<pre class="language-c"><code class="language-c code-highlight"><span class="code-line">class A<span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">int</span> a<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">static</span> <span class="token keyword">int</span> b<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">static</span> <span class="token keyword">int</span> c<span class="token punctuation">;</span>
</span><span class="code-line">public<span class="token operator">:</span>
</span><span class="code-line"> <span class="token keyword">void</span> <span class="token function">fun1</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span>
</span><span class="code-line"> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">fun2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span>
</span><span class="code-line"> <span class="token comment">// 这句话本来就是错误的, 以为fun3比对象先实现, 但是a还没init</span>
</span><span class="code-line"> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">fun3</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> cout<span class="token operator">&#x3C;&#x3C;</span> a <span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// err </span>
</span><span class="code-line"> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">fun4</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> cout <span class="token operator">&#x3C;&#x3C;</span> b <span class="token operator">&#x3C;&#x3C;</span> endl<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// 通过, 因为fun4和b一起初始化</span>
</span><span class="code-line"> <span class="token keyword">void</span> <span class="token function">fun5</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> cout <span class="token operator">&#x3C;&#x3C;</span> b <span class="token operator">&#x3C;&#x3C;</span> endl<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// 通过, 因为b先初始化, 创建对象实例的时候才初始化fun5</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line">
</span><span class="code-line">A<span class="token operator">::</span><span class="token function">fun1</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 1. err 因为类实例化对象后才能使用成员函数</span>
</span><span class="code-line">A<span class="token operator">::</span><span class="token function">fun2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 2. 通过 因为类实例化对象之前已经给静态成员函数分配了空间</span>
</span><span class="code-line">A<span class="token operator">::</span><span class="token function">fun3</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 3. err 因为完成成员函数, 但是此时类成员变量还没有初始化, 因此错误</span>
</span><span class="code-line">
</span><span class="code-line">A a <span class="token operator">=</span> new A<span class="token punctuation">;</span>
</span><span class="code-line">a<span class="token punctuation">.</span><span class="token function">fun3</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 4. err 跟3一个道理, fun3先初始化, 但是里面包含的成员变量a未初始化, 编译错误</span>
</span><span class="code-line">
</span><span class="code-line">总结<span class="token operator">:</span>
</span><span class="code-line"><span class="token number">1.</span> 静态成员函数不能使用非静态成员<span class="token punctuation">(</span>函数和变量<span class="token punctuation">)</span>
</span><span class="code-line"><span class="token number">2.</span> 非静态成员函数可以调用静态成员
</span><span class="code-line"><span class="token number">3.</span> 静态成员变量必须在初始化先 比如 <span class="token keyword">int</span> A<span class="token operator">::</span>c <span class="token operator">=</span> <span class="token number">20</span><span class="token punctuation">;</span>
</span></code></pre>
</li>
</ol>
<hr>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="说一下-c和-c-的区别"><a aria-hidden="true" tabindex="-1" href="#说一下-c和-c-的区别"><span class="icon icon-link"></span></a>说一下 C++和 C 的区别</h2><div class="wrap-body">
<ol>
<li>思想: 面向对象, 面向过程的结构化编程语言</li>
<li>语法: 封装(隐藏实现细节,代码模块化) 继承(派生类可以继承父类数据和方法,扩展已存在的模块, 代码重用) 多态(一个接口, 多种实现, 派生类重写父类虚函数, 实现接口重用)三种特性, 更安全:强制类型转化</li>
<li>动态管理内存方法不一样: C是malloc和free, C++除此之外还有new/delete</li>
<li>支持范式, 模板类, 函数模板等</li>
</ol>
<hr>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="指针和引用"><a aria-hidden="true" tabindex="-1" href="#指针和引用"><span class="icon icon-link"></span></a>指针和引用</h2><div class="wrap-body">
<table><thead><tr><th>指针</th><th>引用</th></tr></thead><tbody><tr><td>有自己的一块空间</td><td>引用只是一个别名</td></tr><tr><td>sizeof 看一个指针的大小是 4</td><td>被引用对象的大小</td></tr><tr><td>可以被初始化为 NULL</td><td>引用必须被初始化且必须是一个已有对象的引用</td></tr><tr><td>作为参数传递时, 指针需要被解引用才可以对对象进行操作</td><td>直接对引用的修改都会改变引用所指向的对象</td></tr><tr><td>可以有 const 指针</td><td></td></tr><tr><td>指针在使用中可以指向其它对象</td><td>只能是一个对象的引用, 不能被改变</td></tr><tr><td>多级指针(**p</td><td>引用只有一级</td></tr><tr><td>指针和引用使用++运算符的意义不一样</td><td></td></tr><tr><td>返回动态内存分配的对象或者内存, 必须使用指针</td><td></td></tr></tbody></table>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-exist"><div class="wrap-header h2wrap"><h2 id="智能指针-为何使用智能指针"><a aria-hidden="true" tabindex="-1" href="#智能指针-为何使用智能指针"><span class="icon icon-link"></span></a>智能指针? 为何使用智能指针</h2><div class="wrap-body">
<p>减少内存泄漏等问题</p>
</div></div><div class="h2wrap-body"><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="解决的问题"><a aria-hidden="true" tabindex="-1" href="#解决的问题"><span class="icon icon-link"></span></a>解决的问题</h3><div class="wrap-body">
<ol>
<li>空指针和野指针</li>
<li>对象重复释放</li>
<li>内存泄漏</li>
<li>不匹配new和delete</li>
</ol>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="unique_ptr-shared_ptr-weak_ptr"><a aria-hidden="true" tabindex="-1" href="#unique_ptr-shared_ptr-weak_ptr"><span class="icon icon-link"></span></a>unique_ptr, shared_ptr, weak_ptr</h3><div class="wrap-body">
<p>unique_ptr 注意: 初始化相当于一个空指针, 再用make_unique初始化; 唯一指针, 不允许共享, 禁止拷贝复制; 相当于当我相对一个对象进行操作, 但是我不想别的指针操作这个对象, 就可以用unique_ptr; 尽量不要对其赋值操作, 让他自生自灭</p>
<p>shared_ptr 允许多个指针指向, 类似原始指针, 继承了<code>p->name</code><code> (*p).name</code>注意: 降低程序运行效率, shared_ptr析构函数不能太复杂, 特别慢, 当他析构的时候, 整个线程会阻塞,</p>
<p>weak_ptr 打破循环引用, 只做观察指针, 看一下对象对象存不存在</p>
<p>auto_ptr已经不用了</p>
<p><a href="http://www.cppblog.com/Solstice/archive/2013/01/28/197597.html">智能指针是线程安全的么?</a> 显然智能指针控制写不是,因为智能指针操作不是原子性, 当赋值语句执行时, 其实智能指针拷贝对象同时还得对对象的计数进行+1操作, 这两步就会被其他线程钻空子了</p>
<p>C++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11 支持,并且第一个已经被 11 弃用。</p>
<ol>
<li>作用是管理一个指针; 申请空间在函数结束时忘记释放, 造成内存泄漏, 而使用智能指针, 一旦智能指针超出类的作用域, 类会自动调用析构函数, 释放资源, 所以智能指针的作用原理在函数结束后, 自动释放内存空间;</li>
<li>auto_ptr<string> p1 (new string ("I reigned lonely as a cloud.”));
auto_ptr<string> p2;
p2 = p1; //auto_ptr 不会报错. 此时p2掠夺了p1所有权, 使用p1的时候, 内存崩溃</string></string></li>
<li>unique_ptr<string> p3 (new string ("auto"));
unique_ptr<string> p4;
p4 = p3;// 报错, 非法, 避免内存崩溃</string></string></li>
<li>shared_ptr共享拥有, 多个智能指针可以指向同一个对象, 该对象和其相关资源会在最后一个引用被销毁后释放</li>
<li>weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象, 作为管理指针; 为了解决循环引用导致的内存泄漏, 构造函数不会改变引用计数, 不会对对象内存进行管理, 像是一个普通指针, 但会检测所管理的对象是否被释放, 从而避免内存泄漏;
**</li>
</ol>
<hr>
</div></div></div></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="define和const区别"><a aria-hidden="true" tabindex="-1" href="#define和const区别"><span class="icon icon-link"></span></a>#define和const区别</h2><div class="wrap-body">
<table><thead><tr><th>const</th></tr></thead><tbody><tr><td>有类型有名字, 放到静态存储</td></tr><tr><td>编译时确定, 只有一个拷贝</td></tr><tr><td>可以用指针去指向该变量的地址</td></tr><tr><td>不能定义函数</td></tr></tbody></table>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="重载overload覆盖重写override隐藏重定义overwrite这三者之间的区别"><a aria-hidden="true" tabindex="-1" href="#重载overload覆盖重写override隐藏重定义overwrite这三者之间的区别"><span class="icon icon-link"></span></a>重载overload覆盖重写override隐藏重定义overwrite这三者之间的区别</h2><div class="wrap-body">
<ol>
<li>overload将语义相近的几个函数用同一个名字表示但是参数列表参数的类型个数顺序不同不同这就是==函数重载==,返回值类型可以不同
特征相同范围同一个类中、函数名字相同、参数不同、virtual关键字可有可无</li>
<li>override派生类覆盖基类的虚函数实现接口的重用==返回值类型必须相同==
特征:==不同范围基类和派生类、函数名字相同、参数相同、基类中必须有virtual关键字==(必须是虚函数)</li>
<li>overwrite派生类屏蔽了其同名的基类函数返回值类型可以不同
特征不同范围基类和派生类、函数名字相同、参数不同或者参数相同且无virtual关键字</li>
</ol>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-exist"><div class="wrap-header h2wrap"><h2 id="多态"><a aria-hidden="true" tabindex="-1" href="#多态"><span class="icon icon-link"></span></a>多态</h2><div class="wrap-body">
</div></div><div class="h2wrap-body"><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="动态多态和静态多态"><a aria-hidden="true" tabindex="-1" href="#动态多态和静态多态"><span class="icon icon-link"></span></a><a href="https://www.cnblogs.com/lizhenghn/p/3667681.html">动态多态和静态多态</a></h3><div class="wrap-body">
<p>多态的实现分为==静态多态和动态多态==</p>
<ol>
<li>静态多态: 主要是 ==重载== ,在编译的时候就已经确定;</li>
<li>静态多态设计思想: 对于相关的对象类型,直接实现它们各自的定义,不需要共有基类,甚至可以没有任何关系。只需要各个具体类的实现中要求相同的接口声明,这里的接口称之为隐式接口。客户端把操作这些对象的函数定义为模板,当需要操作什么类型的对象时,直接对模板指定该类型实参即可(或通过实参演绎获得)。</li>
<li>动态多态: 用虚函数机制实现的,在运行期间动态绑定</li>
<li>动态多态设计思想: 对于相关的对象类型,确定它们之间的一个共同功能集,然后在基类中,把这些共同的功能声明为多个公共的虚函数接口。各个子类重写这些虚函数,以完成具体的功能。客户端的代码(操作函数)通过指向基类的引用或指针来操作这些对象,对虚函数的调用会自动绑定到实际提供的子类对象上去。</li>
</ol>
<p>如动物音乐大赛, 乌鸦和狗和猫报名, 但是这三个对象都指向动物类(这是一个基类), 使用动物指针对乌鸦, 狗, 猫进行方法调用, 就是多态</p>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="动态多台和静态多态的比较"><a aria-hidden="true" tabindex="-1" href="#动态多台和静态多态的比较"><span class="icon icon-link"></span></a>动态多台和静态多态的比较</h3><div class="wrap-body">
<table><thead><tr><th></th><th>静态多态</th><th>动态多态</th></tr></thead><tbody><tr><td>优点</td><td>编译期完成, 效率高, 编译器可优化</td><td>运行期动态绑定,</td></tr><tr><td></td><td>强适配性和松耦合性, 通过偏特化,全特化处理特殊类型</td><td>实现与接口分离, 可以复用</td></tr><tr><td></td><td>静态多态通过模板编程为C++带来了泛型设计概念, 如STL库</td><td>处理同一继承体系下异质对象集合的强大威力</td></tr><tr><td>缺点</td><td>用模板实现静态多态, 模板不足, 调试困难,编译耗时, 代码膨胀, 编译器支持的兼容性,</td><td>运行期绑定, 运行开销大</td></tr><tr><td></td><td>不能处理异质对象集合</td><td>编译器无法对虚函数进行优化</td></tr><tr><td></td><td></td><td>笨重的类继承体系, 对接口的修改影响整个类的层次</td></tr><tr><td>不同点</td><td>本质不同, 静态多态,编译阶段, 模板实现, 动态多态,运行阶段, 继承虚函数实现</td><td></td></tr><tr><td></td><td>动态多态接口是显式, 静态是隐式,</td><td></td></tr></tbody></table>
<p><a href="https://www.cnblogs.com/zkfopen/p/11061414.html">https://www.cnblogs.com/zkfopen/p/11061414.html</a></p>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="虚函数表"><a aria-hidden="true" tabindex="-1" href="#虚函数表"><span class="icon icon-link"></span></a>虚函数表</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">class</span> <span class="token class-name">B</span> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">virtual</span> <span class="token keyword">int</span> <span class="token function">f1</span> <span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 0</span>
</span><span class="code-line"> <span class="token keyword">virtual</span> <span class="token keyword">void</span> <span class="token function">f2</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 1</span>
</span><span class="code-line"> <span class="token keyword">virtual</span> <span class="token keyword">int</span> <span class="token function">f3</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 2</span>
</span><span class="code-line"><span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token comment">// 虚函数表</span>
</span><span class="code-line">vptr <span class="token operator">-></span> <span class="token punctuation">[</span>B<span class="token double-colon punctuation">::</span>f1<span class="token punctuation">,</span> B<span class="token double-colon punctuation">::</span>f2<span class="token punctuation">,</span> B<span class="token double-colon punctuation">::</span>f3<span class="token punctuation">]</span>
</span><span class="code-line"> <span class="token number">0</span> <span class="token number">1</span> <span class="token number">2</span>
</span></code></pre>
<p>首先对于包含虚函数的类, 编译器会为每个包含虚函数的类生成一张虚函数表,即存放每个虚函数地址的函数指针的数组,简称虚表(vtbl),每个虚函数对应一个虚函数表中的下标。</p>
<p>除了为包含虚函数的类生成虚函数表以外,编译器还会为该类增加一个隐式成员变量,通常在该类实例化对象的起始位置,用于存放虚函数表的首地址,
该变量被称为虚函数表指针,简称虚指针(vptr)。例如:</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">B<span class="token operator">*</span> pb <span class="token operator">=</span> <span class="token keyword">new</span> B<span class="token punctuation">;</span> <span class="token operator">/</span>
</span><span class="code-line">pb<span class="token operator">-></span><span class="token function">f3</span> <span class="token punctuation">(</span><span class="token number">12</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 被编译为</span>
</span><span class="code-line">pb<span class="token operator">-></span>vptr<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pb<span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// B::f3 参数pb是this指针, 他首先找到虚函数表, 调用对应的f3函数</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token comment">// 注意:虚表是一个类一张,而不是一个对象一张,同一个类的多个对象,通过各自的虚指针,共享同一张虚表。</span>
</span><span class="code-line">vptr<span class="token operator">-></span> <span class="token operator">|</span> vptr1 <span class="token operator">|</span> vptr2 <span class="token operator">|</span> vptr3 <span class="token operator">|</span>
</span></code></pre>
</div></div></div></div></div><div class="wrap h2body-exist"><div class="wrap-header h2wrap"><h2 id="多态的工作原理底层实现机制"><a aria-hidden="true" tabindex="-1" href="#多态的工作原理底层实现机制"><span class="icon icon-link"></span></a>多态的工作原理(底层实现机制)</h2><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token comment">// 继承自B的子类</span>
</span><span class="code-line"><span class="token keyword">class</span> <span class="token class-name">D</span> <span class="token operator">:</span> <span class="token base-clause"><span class="token keyword">public</span> <span class="token class-name">B</span></span> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">int</span> <span class="token function">f1</span> <span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">int</span> <span class="token function">f3</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">virtual</span> <span class="token keyword">void</span> <span class="token function">f4</span> <span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token comment">// 虚函数表</span>
</span><span class="code-line"><span class="token comment">// 子类覆盖了基类的f1和f3,继承了基类的f2,增加了自己的f4,编译器同样会为子类生成一张专属于它的虚表。</span>
</span><span class="code-line"><span class="token comment">// 如下所示, 当基类指向子类时, vptr->vptr(子类)->D::f3, 这是因为他根据动态绑定原则, 先不直接加载基类自身函数, 编译器在运行时, 根据基类指向的子类的vptr函数进行加载指令, 这就实现了多态</span>
</span><span class="code-line"><span class="token function">vptr</span><span class="token punctuation">(</span>子类<span class="token punctuation">)</span><span class="token operator">-></span> D<span class="token double-colon punctuation">::</span>f1<span class="token punctuation">,</span> B<span class="token double-colon punctuation">::</span>f2<span class="token punctuation">,</span> D<span class="token double-colon punctuation">::</span>f3<span class="token punctuation">,</span> D<span class="token double-colon punctuation">::</span>f4
</span><span class="code-line"> <span class="token number">0</span> <span class="token number">1</span> <span class="token number">2</span> <span class="token number">3</span>
</span></code></pre>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token comment">// 指向子类虚表的虚指针就存放在子类对象的基类子对象中。例如:</span>
</span><span class="code-line">B<span class="token operator">*</span> pb <span class="token operator">=</span> <span class="token keyword">new</span> D<span class="token punctuation">;</span> <span class="token comment">// 父类指向子类, 调用子类的方法</span>
</span><span class="code-line">pb<span class="token operator">-></span><span class="token function">f3</span> <span class="token punctuation">(</span><span class="token number">12</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 被编译为</span>
</span><span class="code-line">pb<span class="token operator">-></span><span class="token function">vptr</span><span class="token punctuation">(</span>子类<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pb<span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// D::f3 pb是基类指针, 他首先找基类的虚函数表vptr, </span>
</span></code></pre>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token comment">// 示例</span>
</span><span class="code-line"><span class="token keyword">class</span> <span class="token class-name">A</span><span class="token punctuation">{</span>
</span><span class="code-line"><span class="token keyword">public</span><span class="token operator">:</span>
</span><span class="code-line"> <span class="token function">A</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span><span class="token function">m_ch</span><span class="token punctuation">(</span><span class="token char">'A'</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span>
</span><span class="code-line"> <span class="token keyword">virtual</span> <span class="token keyword">void</span> <span class="token function">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> m_ch <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"::foo()"</span> <span class="token operator">&#x3C;&#x3C;</span> endl <span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span>
</span><span class="code-line"> <span class="token keyword">virtual</span> <span class="token keyword">void</span> <span class="token function">bar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> m_ch <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"::bar()"</span> <span class="token operator">&#x3C;&#x3C;</span> endl <span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span>
</span><span class="code-line"><span class="token keyword">private</span><span class="token operator">:</span>
</span><span class="code-line"> <span class="token keyword">char</span> m_ch <span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span> <span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">class</span> <span class="token class-name">B</span><span class="token operator">:</span><span class="token base-clause"><span class="token keyword">public</span> <span class="token class-name">A</span></span><span class="token punctuation">{</span>
</span><span class="code-line"><span class="token keyword">public</span><span class="token operator">:</span>
</span><span class="code-line"> <span class="token function">B</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span><span class="token function">m_ch</span><span class="token punctuation">(</span><span class="token char">'B'</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span>
</span><span class="code-line"> <span class="token keyword">void</span> <span class="token function">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"B::foo()"</span> <span class="token operator">&#x3C;&#x3C;</span>endl <span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span>
</span><span class="code-line"><span class="token keyword">private</span><span class="token operator">:</span>
</span><span class="code-line"> <span class="token keyword">char</span> m_ch <span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span> <span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> A a <span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">void</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token operator">*</span>vptr_a<span class="token punctuation">)</span><span class="token punctuation">(</span>A<span class="token operator">*</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">*</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token operator">*</span><span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">(</span>A<span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">&#x26;</span>a <span class="token punctuation">;</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token punctuation">(</span><span class="token keyword">void</span> <span class="token operator">*</span><span class="token punctuation">)</span>vptr_a <span class="token operator">&#x3C;&#x3C;</span>endl <span class="token punctuation">;</span> <span class="token comment">//0x8048bb0</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"foo():"</span><span class="token operator">&#x3C;&#x3C;</span><span class="token punctuation">(</span><span class="token keyword">void</span> <span class="token operator">*</span><span class="token punctuation">)</span>vptr_a<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">&#x3C;&#x3C;</span>endl <span class="token punctuation">;</span> <span class="token comment">//foo():0x8048992</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"bar():"</span> <span class="token operator">&#x3C;&#x3C;</span><span class="token punctuation">(</span><span class="token keyword">void</span> <span class="token operator">*</span><span class="token punctuation">)</span>vptr_a<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">&#x3C;&#x3C;</span>endl <span class="token punctuation">;</span> <span class="token comment">//bar():0x80489d4</span>
</span><span class="code-line"> vptr_a<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token operator">&#x26;</span>a<span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">//A::foo()</span>
</span><span class="code-line"> vptr_a<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token operator">&#x26;</span>a<span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">//A::bar()</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"-----------------------------------------"</span> <span class="token operator">&#x3C;&#x3C;</span>endl <span class="token punctuation">;</span>
</span><span class="code-line"> B b <span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">void</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token operator">*</span>vptr_b<span class="token punctuation">)</span><span class="token punctuation">(</span>B<span class="token operator">*</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">*</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token operator">*</span><span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">(</span>B<span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">&#x26;</span>b <span class="token punctuation">;</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token punctuation">(</span><span class="token keyword">void</span> <span class="token operator">*</span><span class="token punctuation">)</span>vptr_b <span class="token operator">&#x3C;&#x3C;</span>endl <span class="token punctuation">;</span> <span class="token comment">//0x8048ba0</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"foo():"</span><span class="token operator">&#x3C;&#x3C;</span><span class="token punctuation">(</span><span class="token keyword">void</span> <span class="token operator">*</span><span class="token punctuation">)</span>vptr_b<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">&#x3C;&#x3C;</span>endl <span class="token punctuation">;</span> <span class="token comment">//foo():0x8048a3a </span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"bar():"</span> <span class="token operator">&#x3C;&#x3C;</span><span class="token punctuation">(</span><span class="token keyword">void</span> <span class="token operator">*</span><span class="token punctuation">)</span>vptr_b<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">&#x3C;&#x3C;</span>endl <span class="token punctuation">;</span> <span class="token comment">//bar():0x80489d4</span>
</span><span class="code-line"> vptr_b<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token operator">&#x26;</span>b<span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">//B::foo()</span>
</span><span class="code-line"> vptr_b<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token operator">&#x26;</span>b<span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">//A::bar()</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line">
</span></code></pre>
<p>上述程序说明了虚函数表是真实存在的:
void(<em><em>vptr_a)(A</em>) = <em>(void(</em>**)(A</em>))&#x26;a ;建立一个vptr_a的虚函数表如下图</p>
</div></div><div class="h2wrap-body"><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="动态绑定"><a aria-hidden="true" tabindex="-1" href="#动态绑定"><span class="icon icon-link"></span></a>动态绑定</h3><div class="wrap-body">
<p>当编译器“看到”通过指针或者引用调用基类中的虚函数时,并不急于生成有关函数调用的指令,相反它会用一段代码替代该调用语句,这段代码在运行时被执行,完成如下操作:
1)根据调用指针或引用的目标对象找到其内部的虚表指针;
2)根据虚表指针找到其所指向的虚函数表;
3)根据虚函数名和函数指针在虚函数表中的索引,找到所调用虚函数的入口地址;
4)在完成函数调用的准备工作以后,直接跳转到虚函数入口地址处顺序执行函数体指令序列,直到从函数中返回。
3.动态绑定对性能的影响
1)虚函数表和虚指针的存在势必要增加内存空间的开销。
2)和普通函数调用相比,虚函数调用要多出一个步骤,增加运行时间的开销。
3)动态绑定会妨碍编译器通过内联优化代码,虚函数不能内联。</p>
</div></div></div></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="析构函数为何为虚函数"><a aria-hidden="true" tabindex="-1" href="#析构函数为何为虚函数"><span class="icon icon-link"></span></a>析构函数为何为虚函数:</h2><div class="wrap-body">
<p>父类设置为虚函数,保证new子类时,使用父类指针指向子类对象,释放父类指针时, 会自动释放子类空间, 防止内存泄漏</p>
<p>也就是父类指针释放的应该是子类对象的父类成员, 但是由于虚函数的特点, 同时会调用子类的析构函数</p>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="map和set的实现"><a aria-hidden="true" tabindex="-1" href="#map和set的实现"><span class="icon icon-link"></span></a>map和set的实现</h2><div class="wrap-body">
<table><thead><tr><th></th><th>map/set</th><th>unordered_map/unordered_set</th></tr></thead><tbody><tr><td>底层</td><td>红黑树</td><td>哈希表</td></tr><tr><td>有序性</td><td>自动排序</td><td>无序, key映射</td></tr><tr><td>查找时间</td><td>O(logn)</td><td>O(1)</td></tr><tr><td></td><td>空间占用率高(保存父子节点关系)</td><td>空间占用率低</td></tr></tbody></table>
<ol>
<li>C++关联容器,红黑树,map是KV对,K索引,V数据, set中K为集合;</li>
<li>map修改V不改K, 因为红黑树底层按照K排列,保证有序,如果可以修改K,首先需要删除K,调节树平衡,在插入修改后的K,调节平衡, 将会破坏map和set的结构;</li>
<li>map支持下标查询,不存在默认值, 因此慎用, 建议find</li>
</ol>
<hr>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="指针和数组的区别"><a aria-hidden="true" tabindex="-1" href="#指针和数组的区别"><span class="icon icon-link"></span></a>指针和数组的区别?</h2><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> arr<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">int</span><span class="token operator">*</span> p1 <span class="token operator">=</span> arr<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">int</span> <span class="token operator">*</span>p2 <span class="token operator">=</span> <span class="token operator">&#x26;</span>arr<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
</span><span class="code-line">cout<span class="token operator">&#x3C;&#x3C;</span>arr<span class="token operator">&#x3C;&#x3C;</span><span class="token string">" "</span><span class="token operator">&#x3C;&#x3C;</span> p1 <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">" "</span><span class="token operator">&#x3C;&#x3C;</span>p2<span class="token operator">&#x3C;&#x3C;</span>endl<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token operator">*</span><span class="token punctuation">(</span>p1<span class="token operator">+</span><span class="token number">4</span><span class="token punctuation">)</span> <span class="token comment">// 越界, 你不能更改</span>
</span><span class="code-line"><span class="token comment">// 0x7fffeebfabf0 0x7fffeebfabf0 0x7fffeebfabf0</span>
</span></code></pre>
<table><thead><tr><th>指针</th><th>数组 arr=[1,2,3], arr表示数组的首地址</th></tr></thead><tbody><tr><td>数据的地址</td><td>保存数据</td></tr><tr><td>间接访问数据, 获得指针内容</td><td>直接访问数据</td></tr><tr><td>动态数据结构</td><td>固定数目, 数据类型相同</td></tr><tr><td>malloc分配内存和free释放</td><td>隐式分配和删除</td></tr><tr><td>指向匿名数据, 操作匿名函数</td><td>自身作为数据名</td></tr><tr><td></td><td>*(arr+1) 表示第2个元素, 也就是数组的这个指针支持加减法, 加减的是元素位置</td></tr><tr><td></td><td></td></tr></tbody></table>
<hr>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="深浅拷贝"><a aria-hidden="true" tabindex="-1" href="#深浅拷贝"><span class="icon icon-link"></span></a><a href="https://www.zhihu.com/question/36370072/answer/99839254">深浅拷贝</a></h2><div class="wrap-body">
<p>==浅拷贝==实际上是对类成员的引用,==深拷贝==是对类成员的复制并且重新分配了内存</p>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="定义字符串的区别"><a aria-hidden="true" tabindex="-1" href="#定义字符串的区别"><span class="icon icon-link"></span></a>定义字符串的区别</h2><div class="wrap-body">
<p>const char * arr = "123"; char * brr = "123"; const char crr[] = "123"; char drr[] = "123"; 区别
const 常量区<br>
* brr 地址存放</p>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="类型转换-cast"><a aria-hidden="true" tabindex="-1" href="#类型转换-cast"><span class="icon icon-link"></span></a><a href="https://mp.weixin.qq.com/s/6YW7VX787X7kZiRBLbVn-Q">类型转换? cast</a></h2><div class="wrap-body">
<ol>
<li>reinterpret_cast任意类型的指针之间的转换对转换的结果不做任何保证(不建议使用)</li>
<li>dynamic_cast只能用于存在虚函数的父子关系的强制类型转换</li>
<li>const_cast删除变量的const属性方便再次赋值</li>
<li>static_cast完成基础数据类型同一个继承体系中类型的转换任意类型与空指针类型 void* 之间的转换。不能对其他指针类型进行转换</li>
</ol>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">double</span> d2 <span class="token operator">=</span> <span class="token generic-function"><span class="token function">static_cast</span><span class="token generic class-name"><span class="token operator">&#x3C;</span><span class="token keyword">double</span><span class="token operator">></span></span></span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//相当于创建一个static_cast&#x3C;double>类型的匿名对象赋值给d2</span>
</span><span class="code-line"><span class="token keyword">float</span> <span class="token operator">*</span>p4 <span class="token operator">=</span> <span class="token generic-function"><span class="token function">static_cast</span><span class="token generic class-name"><span class="token operator">&#x3C;</span><span class="token keyword">float</span><span class="token operator">*</span><span class="token operator">></span></span></span><span class="token punctuation">(</span><span class="token operator">&#x26;</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// err</span>
</span><span class="code-line"><span class="token keyword">int</span><span class="token operator">*</span> p2 <span class="token operator">=</span> <span class="token generic-function"><span class="token function">reinterpret_cast</span><span class="token generic class-name"><span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token operator">*</span><span class="token operator">></span></span></span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 任意类型转换</span>
</span><span class="code-line"><span class="token keyword">int</span> <span class="token operator">*</span>p <span class="token operator">=</span> <span class="token generic-function"><span class="token function">const_cast</span><span class="token generic class-name"><span class="token operator">&#x3C;</span><span class="token keyword">int</span><span class="token operator">*</span><span class="token operator">></span></span></span><span class="token punctuation">(</span><span class="token operator">&#x26;</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></code></pre>
<hr>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="const指针"><a aria-hidden="true" tabindex="-1" href="#const指针"><span class="icon icon-link"></span></a><a href="https://blog.csdn.net/xixihaha331/article/details/51280263">const指针</a></h2><div class="wrap-body">
<ol>
<li>常量指针和指针常量</li>
</ol>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">int</span> a <span class="token operator">=</span> <span class="token number">20</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">int</span> b<span class="token operator">=</span><span class="token number">40</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">//------------------------------------------------</span>
</span><span class="code-line"><span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">*</span>p<span class="token punctuation">;</span> <span class="token comment">// 常量指针值不变, 对象可变, 这就是为何 for(const auto &#x26;a : arr){}</span>
</span><span class="code-line">p<span class="token operator">=</span><span class="token operator">&#x26;</span>a<span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// (*p)++; // 这里会报错, 因为不能修改指向的值</span>
</span><span class="code-line">p<span class="token operator">=</span><span class="token operator">&#x26;</span>b<span class="token punctuation">;</span> <span class="token comment">// 这里不会报错, 因为可以指向别的对象</span>
</span><span class="code-line"><span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"a=%d, b=%d, *p=%d\n"</span><span class="token punctuation">,</span> a<span class="token punctuation">,</span> b<span class="token punctuation">,</span> <span class="token operator">*</span>p<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//a=20, b=40, *p=40</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token comment">//------------------------------------------------</span>
</span><span class="code-line"><span class="token keyword">int</span><span class="token operator">*</span> <span class="token keyword">const</span> p1 <span class="token operator">=</span> <span class="token operator">&#x26;</span>a<span class="token punctuation">;</span> <span class="token comment">// 指针常量, 对象不可变, 值可变</span>
</span><span class="code-line"><span class="token comment">// p1=&#x26;b; // 会报错, 因为指针是常量, 对象不能变</span>
</span><span class="code-line"><span class="token punctuation">(</span><span class="token operator">*</span>p1<span class="token punctuation">)</span><span class="token operator">++</span><span class="token punctuation">;</span> <span class="token comment">// 这里不会报错, 因为可以改值, 但是不可以改对象</span>
</span><span class="code-line"><span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"a=%d, b=%d, *p1=%d\n"</span><span class="token punctuation">,</span> a<span class="token punctuation">,</span> b<span class="token punctuation">,</span> <span class="token operator">*</span>p1<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//a=21, b=40, *p1=40</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token comment">//------------------------------------------------</span>
</span><span class="code-line"><span class="token keyword">const</span> <span class="token keyword">int</span><span class="token operator">*</span> <span class="token keyword">const</span> p2 <span class="token operator">=</span> <span class="token operator">&#x26;</span>b<span class="token punctuation">;</span> <span class="token comment">// 常量指针常量值, </span>
</span><span class="code-line"><span class="token comment">// p2=&#x26;a; // 会报错, 因为指针是常量, 对象不能变</span>
</span><span class="code-line"><span class="token comment">// (*p2)++; // 会报错, 因为值是常量, 值不能变</span>
</span><span class="code-line"><span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"a=%d, b=%d, *p2=%d\n"</span><span class="token punctuation">,</span> a<span class="token punctuation">,</span> b<span class="token punctuation">,</span> <span class="token operator">*</span>p2<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//a=21, b=40, *p2=40</span>
</span></code></pre>
<ol start="2">
<li>常量参数 <code>void func(char *dest_str, const char *src_str)</code></li>
<li>修饰函数返回值 <code>const char *get_string(void)</code> 注意只能是指针传递, 如果是值传递就没用了</li>
<li>修饰成员函数 <code>int get_count(void) const;</code> 不可以修改对象的成员变量</li>
</ol>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="newdelete-与-mallocfree-的区别是什么"><a aria-hidden="true" tabindex="-1" href="#newdelete-与-mallocfree-的区别是什么"><span class="icon icon-link"></span></a><a href="https://blog.csdn.net/linux_ever/article/details/50533149">new/delete 与 malloc/free 的区别是什么</a></h2><div class="wrap-body">
<table><thead><tr><th></th><th>new/delete</th><th>malloc/free</th></tr></thead><tbody><tr><td>类型</td><td>C++的关键字</td><td>C语言库函数</td></tr><tr><td>返回类型安全性</td><td>只需要对象名即可创建对象, 返回的是对象类型指针, 类型严格与对象匹配, 无需进行类型转换</td><td>开辟空间大小严格, 返回的是(void*), 需要通过强制类型转换成需要的类型</td></tr><tr><td></td><td>==new调用构造函数, delete调用析构函数, 能保证对象的初始化和回收内存==</td><td>不会调用构造析构函数, 无法满足动态对象要求</td></tr><tr><td></td><td>==由于new对象返回的指针, 在底层空间还存储了这个对象开辟空间的大小, 因此在析构的时候能够根据这个存储进行回收内存==</td><td></td></tr><tr><td>内存分配失败</td><td>==抛出bac_alloc异常try { int *a = new int(); } catch (bad_alloc) { }==</td><td>返回NULL</td></tr><tr><td>是都需要指定内存</td><td>==new无需指定, 编译器会根据类型自行计算==</td><td>需要显式指出所需内存</td></tr><tr><td>实际创建步骤</td><td>1, 调用operator new函数, 分配一块足够大的内存, 方便存储特定类型对象, 2, 编译器运行相应的构造函数, 构造对象, 并传入初始值, 3, 对象构造完成, 返回一个指向该对象的指针</td><td></td></tr><tr><td>delete释放对象步骤</td><td>1, 调用对象析构函数, 2, 编译器调用operator delete函数释放内存空间</td><td></td></tr></tbody></table>
<p>new/delete 是 C++的关键字,而 malloc/free 是 C 语言的库函数,后者使用必须指明申请内存空间的大小,对于类类型的对象,后者不会调用构造函数和析构函数</p>
<hr>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="构造函数和析构函数"><a aria-hidden="true" tabindex="-1" href="#构造函数和析构函数"><span class="icon icon-link"></span></a>构造函数和析构函数</h2><div class="wrap-body">
<table><thead><tr><th>构造函数</th><th>析构函数</th></tr></thead><tbody><tr><td>无类型, 没有返回值, 名字和类名相同, 可重载</td><td>无类型, 无返回值, 名字和类名相同, 不带参数, 不可重载, 析构函数只有一个, 前面加个<code>~</code></td></tr><tr><td>作用: 完成对象的初始化</td><td>对象被删除前有系统自动执行清理工作</td></tr><tr><td>当对象d被创建时, 会自动调用构造函数, 当未定义构造函数时,编译器会自动假设存在两个默认构造函数cdata::cdata(){}</td><td></td></tr><tr><td>Cdate::Cdate(const Cdate&#x26; a)</td><td></td></tr><tr><td>对象的析构函数在被销毁前调用, 对象何时销毁与其作用域相关</td><td></td></tr><tr><td>全局对象在程序运行结束时销毁</td><td></td></tr><tr><td>自动对象在离开作用域时销毁</td><td></td></tr><tr><td>动态对象使用delete时销毁</td><td></td></tr></tbody></table>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="allocator-内存分配和释放"><a aria-hidden="true" tabindex="-1" href="#allocator-内存分配和释放"><span class="icon icon-link"></span></a>allocator 内存分配和释放?</h2><div class="wrap-body">
<ol>
<li>STL分配器封装与STL容器在内存管理上的底层细节;</li>
<li>new(调用operate new配置内存,调用对象构造函数构造对象内容)delete(调用析构函数, 释放内存);</li>
<li>allocator将两个阶段操作区分开来,内存配置有alloc::allocate()负责, 释放alloc::deallocate(); 对象构造由construct负责,内存析构由destroy负责;</li>
<li>为了提升内存管理效率, 减少申请小内存内存碎片问题, STL采用两级配置器, 当分配大小空间超过128B, 使用一级空间配置器(malloc, realloc, free进行内存管理和内存空间分配和释放),大于128B, 二级(内存池技术,通过空闲链表来管理内存)</li>
</ol>
<hr>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="malloc-的原理"><a aria-hidden="true" tabindex="-1" href="#malloc-的原理"><span class="icon icon-link"></span></a>malloc 的原理</h2><div class="wrap-body">
<p>malloc函数用于动态分配内存; 为了减少内存碎片和系统调用开销, malloc采用内存池的方式, 首先申请大块内存作为堆, 再将堆分成多个内存块, 以块作为内存管理的基础单位; 当用户申请内存时, 直接从堆区分配一块合适的空闲块; malloc采用隐式链表结构将堆区分成连续,大小不一的块, 包含已分配和未分配块; 同时malloc采用显示链表结构管理所有空闲块, 双向链表, 每个空闲块记录一个连续的, 未分配的地址;
当进行内存分配时Malloc 会通过隐式链表遍历所有的空闲块选择满足要求的块进行分配当进行内存合并时malloc 采用边界标记法,根据每个块的前后块是否已经分配来决定是否进行块合并。
Malloc 在申请内存时,一般会通过 brk 或者 mmap 系统调用进行申请。其中当申请内存小于128K 时,会使用系统函数 brk 在堆区中分配;而当申请内存大于 128K 时,会使用系统函数 mmap在映射区分配。</p>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="stl迭代器删除元素"><a aria-hidden="true" tabindex="-1" href="#stl迭代器删除元素"><span class="icon icon-link"></span></a>STL迭代器删除元素:</h2><div class="wrap-body">
<ol>
<li>对于序列容器vector,deque来讲,使用erase, 后面元素前移一位,erase返回下一个有效的迭代器;</li>
<li>对于map,set,使用erase,当前元素迭代器失效,但是因为结构为红黑树,所以删除元素不会影响下一元素迭代器,在调用erase之前,记录下一个元素的迭代器即可,</li>
<li>对于list,使用不连续分配内存, erase返回下一个有效迭代器</li>
</ol>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="vector和list-的区别"><a aria-hidden="true" tabindex="-1" href="#vector和list-的区别"><span class="icon icon-link"></span></a>vector和list 的区别</h2><div class="wrap-body">
<table><thead><tr><th align="center">Vector</th><th align="center">List</th></tr></thead><tbody><tr><td align="center">连续存储的容器,动态数组,在堆上分配空间, 两倍容量增长, 顺序内存</td><td align="center">动态双向链表, 堆上空间, 每删除一个元素会释放一个空间</td></tr><tr><td align="center">访问O(1)(随机访问);插入:后插快, 中间需要内存拷贝, 内存申请和释放; 删除: 后删快, 中间需要内存拷贝</td><td align="center">访问: 随机访问差, 只能开头和结尾; 插入和删除快, 常数开销</td></tr><tr><td align="center">适用场景:经常随机访问,且不经常对非尾节点进行插入删除</td><td align="center">适用于经常插入和删除</td></tr><tr><td align="center">下面是区别</td><td align="center"></td></tr><tr><td align="center">数组</td><td align="center">双向链表</td></tr><tr><td align="center">支持随机访问</td><td align="center">不支持随机访问</td></tr><tr><td align="center">顺序内存</td><td align="center">离散内存</td></tr><tr><td align="center">中间节点插入删除会导致拷贝</td><td align="center">不会</td></tr><tr><td align="center">一次性分配好内存, 二倍扩容</td><td align="center">list每次在新节点插入会进行内存申请</td></tr><tr><td align="center">随机访问性能好,插入性能差</td><td align="center">相反</td></tr></tbody></table>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="stl迭代器的作用-为何不用指针而用迭代器"><a aria-hidden="true" tabindex="-1" href="#stl迭代器的作用-为何不用指针而用迭代器"><span class="icon icon-link"></span></a>STL迭代器的作用, 为何不用指针而用迭代器?</h2><div class="wrap-body">
<ol>
<li>迭代器提供一种方法顺序访问一个聚合对象各个元素, 而又不暴露该对象的内部表示; 或者说运用这种方法, 是的我们可以在不知道对象内部结构情况下, 按照一定顺序规则直接反问聚合对象的各个元素</li>
<li>与指针的区别: 迭代器不是指针, 而是类模板, 表现像指针,模拟指针功能,重载指针操作符如->, *, ++等, 相当于一种智能指针, 根据不同类型的数据结构实现不同的操作</li>
<li>迭代器类的访问方式就是把不同集合类的访问逻辑抽象出来, 是的不用暴露集合内部的结构而达到循环遍历的效果;</li>
</ol>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="c中类成员的访问权限"><a aria-hidden="true" tabindex="-1" href="#c中类成员的访问权限"><span class="icon icon-link"></span></a>C++中类成员的访问权限</h2><div class="wrap-body">
<p>C++通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符
类内部, 不区分, 无限制
子类, 能访问父类的private以外的属性和方法
其他类, 只能访问public</p>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="struct和class的区别"><a aria-hidden="true" tabindex="-1" href="#struct和class的区别"><span class="icon icon-link"></span></a>struct和class的区别</h2><div class="wrap-body">
<p>在 C++中,可以用 struct 和 class 定义类都可以继承。区别在于structural 的默认继承权限和默认访问权限是 public而 class 的默认继承权限和默认访问权限是 private。另外class 还可以定义模板类形参,比如 template &#x3C;class T, int i></p>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="c源文从文本到可执行文件经历过程"><a aria-hidden="true" tabindex="-1" href="#c源文从文本到可执行文件经历过程"><span class="icon icon-link"></span></a>C++源文从文本到可执行文件经历过程</h2><div class="wrap-body">
<ol>
<li>预处理: 源代码文件包含的头文件, 预编译语句, 分析替换, 生成预编译文件</li>
<li>编译阶段: 特定编码</li>
<li>汇编阶段: 转化为机器码, 重定位目标文件</li>
<li>链接阶段: 多个目标文件及所需要的库链接成为最终可执行文件</li>
</ol>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="include--和include-的区别"><a aria-hidden="true" tabindex="-1" href="#include--和include-的区别"><span class="icon icon-link"></span></a>include "" 和include &#x3C;>的区别</h2><div class="wrap-body">
<ol>
<li>编译器预处理阶段查找头文件的路径不一样</li>
<li>双引号查找路径: 当前头文件目录, 编译器设置的头文件路径, 系统变量路径path指定的路径</li>
<li>&#x3C;>查找路径: 编译器设置的头文件, 系统变量</li>
</ol>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="forkwaitexec-函数"><a aria-hidden="true" tabindex="-1" href="#forkwaitexec-函数"><span class="icon icon-link"></span></a>fork,wait,exec 函数</h2><div class="wrap-body">
<p>父进程产生子进程使用 fork 拷贝出来一个父进程的副本此时只拷贝了父进程的页表两个进程都读同一块内存当有进程写的时候使用写实拷贝机制分配内存exec 函数可以加载一个 elf文件去替换父进程从此父进程和子进程就可以运行不同的程序了。fork 从父进程返回子进程的 pid从子进程返回 0.调用了 wait 的父进程将会发生阻塞,直到有子进程状态改变,执行成功返回 0错误返回-1。exec 执行成功则子进程从新的程序开始运行,无返回值,执行失败返回-1</p>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="stl-里-resize-和-reserve-的区别"><a aria-hidden="true" tabindex="-1" href="#stl-里-resize-和-reserve-的区别"><span class="icon icon-link"></span></a>STL 里 resize 和 reserve 的区别</h2><div class="wrap-body">
<ol>
<li>resize(): 改变当前容器内含有元素的数量
vector<int>v;
v.resize(20);
v.push_back(2); // 此时的2是21位置</int></li>
<li>reserve(len): 改变当前容器最大容量, 不会生成元素; 如果reserve大于capacity, 重新分配个len的对象空间, 原始对象复制过来</li>
</ol>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="bss端等六段-c的内存管理"><a aria-hidden="true" tabindex="-1" href="#bss端等六段-c的内存管理"><span class="icon icon-link"></span></a>BSS端等六段: C++的内存管理?</h2><div class="wrap-body">
<p><img src="D:/0_2024/work/README.assets/%E4%BB%A3%E7%A0%81%E5%AD%98%E5%82%A8%E7%BB%93%E6%9E%84.jpg" alt="代码存储结构">
在C++中, 虚拟内存分为代码段,数据段, BSS段, 堆区, 文件映射区, 栈区六个部分</p>
<ol>
<li>代码段: 包括只读存储区(字符串常量)和文本区(程序的机器代码), 只读</li>
<li>数据段: 存储程序中已初始化的全局变量和静态变量; 属于静态内存分配</li>
<li>BSS段: 存储未初始化或初始化为0的全局变量和静态变量(局部+全局); 属于静态分配, 程序结束后静态变量资源由系统自动释放。</li>
<li>堆区: 调用 new/malloc 函数时在堆区动态分配内存,同时需要调用 delete/free 来手动释放申请的内存。频繁的malloc free造成内存空间不连续, 产生碎片, 因此堆比栈效率低</li>
<li>映射区:存储动态链接库以及调用 mmap 函数进行的文件映射</li>
<li>栈区: 存储函数的返回地址,返回值, 参数, 局部变量; 编译器自动释放,</li>
</ol>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="内存泄漏"><a aria-hidden="true" tabindex="-1" href="#内存泄漏"><span class="icon icon-link"></span></a>内存泄漏</h2><div class="wrap-body">
<ol>
<li>堆内存泄漏, 如果malloc, new, realloc从堆分配的内存, 由于程序错误造成内存未释放, 产生的</li>
<li>系统资源泄漏: 程序使用系统资源: bitmap, handle, socket忘记释放, 将导致系统效能和稳定差</li>
<li>没有将基类析构函数定义为虚函数, 基类指针指向子类对象后, 释放基类时, 子类资源不会被正确释放</li>
</ol>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="判断内存泄漏"><a aria-hidden="true" tabindex="-1" href="#判断内存泄漏"><span class="icon icon-link"></span></a>判断内存泄漏:</h2><div class="wrap-body">
<ol>
<li>内存泄漏原因: 通常调用malloc/new等内存申请操作, 缺少对应的free/delete</li>
<li>判断内存是否泄漏, 可以使用Linux环境下的内存泄漏检测工具, 也可以在写代码时添加内存申请和释放统计功能, 统计申请和释放是否一致, 以此判断内存泄漏
varglindmtrace 检测</li>
</ol>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="如何采用单线程的方式处理高并发"><a aria-hidden="true" tabindex="-1" href="#如何采用单线程的方式处理高并发"><span class="icon icon-link"></span></a>如何采用单线程的方式处理高并发?</h2><div class="wrap-body">
<p>I/O 复用 异步回调</p>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="大端小端"><a aria-hidden="true" tabindex="-1" href="#大端小端"><span class="icon icon-link"></span></a>大端小端?</h2><div class="wrap-body">
<p>大端是指低字节存储在高地址;小端存储是指低字节存储在低地址。我们可以根据联合体来判断该系统是大端还是小端。因为联合体变量总是从低地址存储。</p>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="设计一个server-实现多个客户端请求"><a aria-hidden="true" tabindex="-1" href="#设计一个server-实现多个客户端请求"><span class="icon icon-link"></span></a>设计一个server, 实现多个客户端请求</h2><div class="wrap-body">
<ol>
<li>多线程,</li>
<li>线程池 ,</li>
<li>IO复用</li>
</ol>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-exist"><div class="wrap-header h2wrap"><h2 id="c的线程锁你知道几种"><a aria-hidden="true" tabindex="-1" href="#c的线程锁你知道几种"><span class="icon icon-link"></span></a><a href="https://www.cnblogs.com/steamedbun/p/9376458.html">C++的线程锁你知道几种?</a></h2><div class="wrap-body">
</div></div><div class="h2wrap-body"><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="互斥锁mutex"><a aria-hidden="true" tabindex="-1" href="#互斥锁mutex"><span class="icon icon-link"></span></a>互斥锁mutex</h3><div class="wrap-body">
<p>用于控制多线程对他们共享资源互斥访问的一个信号量, 也就是说为了避免多个线程同一个时刻操作一个共同资源;例如线程池中的多个空闲线程核一个任务队列, 任何一个线程都要使用互斥锁互斥访问任务队列, 避免多个线程同时访问任务队列发生错乱, 如果其他线程想要获取互斥锁, 只能阻塞等待</p>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="条件锁"><a aria-hidden="true" tabindex="-1" href="#条件锁"><span class="icon icon-link"></span></a>条件锁</h3><div class="wrap-body">
<p>条件锁就是所谓的条件变量, 某一个线程因为某个条件未满足时, 可以使用条件变量是程序处于阻塞状态, 一旦条件满足以信号量的方式唤醒一个因为该条件而被阻塞的线程</p>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="自旋锁"><a aria-hidden="true" tabindex="-1" href="#自旋锁"><span class="icon icon-link"></span></a>自旋锁</h3><div class="wrap-body">
<p>假设我们有一个两个处理器core1和core2计算机现在在这台计算机上运行的程序中有两个线程T1和T2分别在处理器core1和core2上运行两个线程之间共享着一个资源。</p>
<p>首先我们说明互斥锁的工作原理互斥锁是是一种sleep-waiting的锁。假设线程T1获取互斥锁并且正在core1上运行时此时线程T2也想要获取互斥锁pthread_mutex_lock但是由于T1正在使用互斥锁使得T2被阻塞。当T2处于阻塞状态时T2被放入到等待队列中去处理器core2会去处理其他任务而不必一直等待忙等。也就是说处理器不会因为线程阻塞而空闲着它去处理其他事务去了。</p>
<p>而自旋锁就不同了自旋锁是一种busy-waiting的锁。也就是说如果T1正在使用自旋锁而T2也去申请这个自旋锁此时T2肯定得不到这个自旋锁。与互斥锁相反的是此时运行T2的处理器core2会一直不断地循环检查锁是否可用自旋锁请求直到获取到这个自旋锁为止。</p>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="读写锁"><a aria-hidden="true" tabindex="-1" href="#读写锁"><span class="icon icon-link"></span></a>读写锁</h3><div class="wrap-body">
<p>说到读写锁我们可以借助于“读者-写者”问题进行理解。首先我们简单说下“读者-写者”问题。计算机中某些数据被多个进程共享,对数据库的操作有两种:一种是读操作,就是从数据库中读取数据不会修改数据库中内容;另一种就是写操作,写操作会修改数据库中存放的数据。因此可以得到我们允许在数据库上同时执行多个“读”操作,但是某一时刻只能在数据库上有一个“写”操作来更新数据。这就是一个简单的读者-写者模型。</p>
<p>1 如果一个线程用读锁锁定了临界区,那么其他线程也可以用读锁来进入临界区,这样可以有多个线程并行操作。这个时候如果再用写锁加锁就会发生阻塞。写锁请求阻塞后,后面继续有读锁来请求时,这些后来的读锁都将会被阻塞。这样避免读锁长期占有资源,防止写锁饥饿。</p>
<p>2 如果一个线程用写锁锁住了临界区,那么其他线程无论是读锁还是写锁都会发生阻塞。</p>
</div></div></div></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="什么类不能被继承"><a aria-hidden="true" tabindex="-1" href="#什么类不能被继承"><span class="icon icon-link"></span></a>什么类不能被继承</h2><div class="wrap-body">
<ol>
<li>将自身的构造函数与析构函数放在private作用域</li>
<li>友元类 friend</li>
<li>class FinalClass final { };</li>
</ol>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="结构体和类大小"><a aria-hidden="true" tabindex="-1" href="#结构体和类大小"><span class="icon icon-link"></span></a>结构体和类大小</h2><div class="wrap-body">
<p>空的为1, 内存对齐, int double, char 则4,8,1+3, 后面的char需要对齐</p>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="类的什么方法不能是虚函数"><a aria-hidden="true" tabindex="-1" href="#类的什么方法不能是虚函数"><span class="icon icon-link"></span></a>类的什么方法不能是虚函数</h2><div class="wrap-body">
<p>普通函数, 友元函数, 构造函数, 内联成员, 静态态成员函数</p>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-not-exist"><div class="wrap-header h2wrap"><h2 id="hash扩容"><a aria-hidden="true" tabindex="-1" href="#hash扩容"><span class="icon icon-link"></span></a>hash扩容</h2><div class="wrap-body">
<p>HashMap初始容量大小16扩容因子为0.75扩容倍数为2</p>
<p>底层是数组加链表, 随着数据的增加, hash冲突会增加, 因此设置扩容因子, 当数据数量到达hash容量的扩容因子倍, 就会以二倍扩容, 16*2=32, 然后重新计算每个元素在数组中的位置.</p>
</div></div><div class="h2wrap-body"></div></div><div class="wrap h2body-exist"><div class="wrap-header h2wrap"><h2 id="c派生类的构造函数和析构函数执行顺序及其构造形式"><a aria-hidden="true" tabindex="-1" href="#c派生类的构造函数和析构函数执行顺序及其构造形式"><span class="icon icon-link"></span></a>C++派生类的构造函数和析构函数执行顺序及其构造形式</h2><div class="wrap-body">
</div></div><div class="h2wrap-body"><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="派生类的构造函数和析构函数的执行顺序"><a aria-hidden="true" tabindex="-1" href="#派生类的构造函数和析构函数的执行顺序"><span class="icon icon-link"></span></a>派生类的构造函数和析构函数的执行顺序</h3><div class="wrap-body">
<p><font color="red">先执行基类的构造函数,随后执行派生类的构造函数,当撤销派生类对象时,先执行派生类的析构函数,再执行基类的析构函数。</font></p>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="派生类构造函数和析构函数的构造原则"><a aria-hidden="true" tabindex="-1" href="#派生类构造函数和析构函数的构造原则"><span class="icon icon-link"></span></a>派生类构造函数和析构函数的构造原则</h3><div class="wrap-body">
<p>1派生类不能继承基类中的构造函数和析构函数。
当基类含有带参数的构造函数时,派生类必须定义构造函数,以提供把参数传递给基类构造函数的途径。
2当派生类中还有对象成员时其构造函数的一般形式为</p>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="注意"><a aria-hidden="true" tabindex="-1" href="#注意"><span class="icon icon-link"></span></a>注意</h3><div class="wrap-body">
<ol>
<li>当基类构造函数不带参数时,派生类不一定需要定义构造函数,然而当基类的析构函数哪怕只有一个参数,也要为派生类定义构造函数,甚至所定义的派生类析构函数的函数体可能为空,仅仅起到传递参数的作用</li>
<li>当基类使用缺省构造函数时或不带参数的构造函数时,则在派生类中定义构造函数时,可以省略:基类构造函数名(参数表),此时若派生类不需要构造 函数,则可以不定义构造函数。</li>
<li>如果派生类的基类也是一个派生类,则每个派生类只需负责其直接基类的 构造,依次上溯。</li>
<li>如果析构函数是不带参数的,在派生类中是否要定义析构函数与它所属的 基类无关,故基类的析构函数不会因为派生类没有析构函数而得不到执行,他们各自是独立的</li>
</ol>
</div></div></div></div></div><div class="wrap h2body-exist"><div class="wrap-header h2wrap"><h2 id="虚函数调用的工作原理-基于虚函数多态的机制"><a aria-hidden="true" tabindex="-1" href="#虚函数调用的工作原理-基于虚函数多态的机制"><span class="icon icon-link"></span></a>虚函数调用的工作原理 基于虚函数多态的机制</h2><div class="wrap-body">
</div></div><div class="h2wrap-body"><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="虚函数和纯虚函数"><a aria-hidden="true" tabindex="-1" href="#虚函数和纯虚函数"><span class="icon icon-link"></span></a>虚函数和纯虚函数</h3><div class="wrap-body">
<p>虚函数: C++中用于实现多态的机制, 核心理念是通过基类访问派生类定义的函数, 是C++中多态的一个重要体现; 利用基类指针访问派生类中的虚函数, 这种情况采用的是动态绑定技术;</p>
<p>纯虚函数: 基类声明的虚函数, 基类无定义, 要求任何派生类都需要定义自己的实现方法, 在基类中实现纯虚函数的方法是在函数原型后面加 <code>=0</code> 纯虚函数不能实例化对象;</p>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="抽象类"><a aria-hidden="true" tabindex="-1" href="#抽象类"><span class="icon icon-link"></span></a>抽象类</h3><div class="wrap-body">
<p>特殊类, 为了抽象和设计的目的建立的, 处于继承层次结构的较上层;</p>
<p>定义: 带有纯虚函数的类为抽象类</p>
<p>作用: 将有关操作作为结果接口组织在一个继承层次结构中, 由他来为派生类提供一个公共根, 派生类将具体实现在其积累中作为接口的操作. 所以派生类实际上刻画了一组子类的操作接口的通用语义, 这些语义传给子类, 子类可以具体实现这些语义, 在将这些语义传给自己的子类</p>
<p>注意: 抽象类只能作为基类, 纯虚函数的实现由派生类给出; 如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体的类。</p>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="虚函数表-1"><a aria-hidden="true" tabindex="-1" href="#虚函数表-1"><span class="icon icon-link"></span></a>虚函数表</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token keyword">class</span> <span class="token class-name">B</span> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">virtual</span> <span class="token keyword">int</span> <span class="token function">f1</span> <span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 0</span>
</span><span class="code-line"> <span class="token keyword">virtual</span> <span class="token keyword">void</span> <span class="token function">f2</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 1</span>
</span><span class="code-line"> <span class="token keyword">virtual</span> <span class="token keyword">int</span> <span class="token function">f3</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 2</span>
</span><span class="code-line"><span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token comment">// 虚函数表</span>
</span><span class="code-line">vptr <span class="token operator">-></span> <span class="token punctuation">[</span>B<span class="token double-colon punctuation">::</span>f1<span class="token punctuation">,</span> B<span class="token double-colon punctuation">::</span>f2<span class="token punctuation">,</span> B<span class="token double-colon punctuation">::</span>f3<span class="token punctuation">]</span>
</span><span class="code-line"> <span class="token number">0</span> <span class="token number">1</span> <span class="token number">2</span>
</span></code></pre>
<p>首先对于包含虚函数的类, 编译器会为每个包含虚函数的类生成一张虚函数表,即存放每个虚函数地址的函数指针的数组,简称虚表(vtbl),每个虚函数对应一个虚函数表中的下标。</p>
<p>除了为包含虚函数的类生成虚函数表以外,编译器还会为该类增加一个隐式成员变量,通常在该类实例化对象的起始位置,用于存放虚函数表的首地址,
该变量被称为虚函数表指针,简称虚指针(vptr)。例如:</p>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line">B<span class="token operator">*</span> pb <span class="token operator">=</span> <span class="token keyword">new</span> B<span class="token punctuation">;</span>
</span><span class="code-line">pb<span class="token operator">-></span><span class="token function">f3</span> <span class="token punctuation">(</span><span class="token number">12</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 被编译为</span>
</span><span class="code-line">pb<span class="token operator">-></span>vptr<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pb<span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// B::f3 参数pb是this指针</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token comment">// 注意:虚表是一个类一张,而不是一个对象一张,同一个类的多个对象,通过各自的虚指针,共享同一张虚表。</span>
</span><span class="code-line">vptr<span class="token operator">-></span> <span class="token operator">|</span> vptr1 <span class="token operator">|</span> vptr2 <span class="token operator">|</span> vptr3 <span class="token operator">|</span>
</span></code></pre>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="多态的工作原理底层实现机制-1"><a aria-hidden="true" tabindex="-1" href="#多态的工作原理底层实现机制-1"><span class="icon icon-link"></span></a>多态的工作原理(底层实现机制)</h3><div class="wrap-body">
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token comment">// 继承自B的子类</span>
</span><span class="code-line"><span class="token keyword">class</span> <span class="token class-name">D</span> <span class="token operator">:</span> <span class="token base-clause"><span class="token keyword">public</span> <span class="token class-name">B</span></span> <span class="token punctuation">{</span>
</span><span class="code-line"> <span class="token keyword">int</span> <span class="token function">f1</span> <span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">int</span> <span class="token function">f3</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">virtual</span> <span class="token keyword">void</span> <span class="token function">f4</span> <span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span><span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token comment">// 虚函数表</span>
</span><span class="code-line"><span class="token comment">// 子类覆盖了基类的f1和f3,继承了基类的f2,增加了自己的f4,编译器同样会为子类生成一张专属于它的虚表。</span>
</span><span class="code-line"><span class="token function">vptr</span><span class="token punctuation">(</span>子类<span class="token punctuation">)</span><span class="token operator">-></span> D<span class="token double-colon punctuation">::</span>f1<span class="token punctuation">,</span> B<span class="token double-colon punctuation">::</span>f2<span class="token punctuation">,</span> D<span class="token double-colon punctuation">::</span>f3<span class="token punctuation">,</span> D<span class="token double-colon punctuation">::</span>f4
</span><span class="code-line"> <span class="token number">0</span> <span class="token number">1</span> <span class="token number">2</span> <span class="token number">3</span>
</span></code></pre>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token comment">// 指向子类虚表的虚指针就存放在子类对象的基类子对象中。例如:</span>
</span><span class="code-line">B<span class="token operator">*</span> pb <span class="token operator">=</span> <span class="token keyword">new</span> D<span class="token punctuation">;</span> <span class="token comment">// 父类指向子类, 调用子类的方法</span>
</span><span class="code-line">pb<span class="token operator">-></span><span class="token function">f3</span> <span class="token punctuation">(</span><span class="token number">12</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span><span class="code-line"><span class="token comment">// 被编译为</span>
</span><span class="code-line">pb<span class="token operator">-></span><span class="token function">vptr</span><span class="token punctuation">(</span>子类<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token punctuation">(</span>pb<span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// D::f3</span>
</span></code></pre>
<pre class="language-cpp"><code class="language-cpp code-highlight"><span class="code-line"><span class="token comment">// 示例</span>
</span><span class="code-line"><span class="token keyword">class</span> <span class="token class-name">A</span><span class="token punctuation">{</span>
</span><span class="code-line"><span class="token keyword">public</span><span class="token operator">:</span>
</span><span class="code-line"> <span class="token function">A</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span><span class="token function">m_ch</span><span class="token punctuation">(</span><span class="token char">'A'</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span>
</span><span class="code-line"> <span class="token keyword">virtual</span> <span class="token keyword">void</span> <span class="token function">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> m_ch <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"::foo()"</span> <span class="token operator">&#x3C;&#x3C;</span> endl <span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span>
</span><span class="code-line"> <span class="token keyword">virtual</span> <span class="token keyword">void</span> <span class="token function">bar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> m_ch <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"::bar()"</span> <span class="token operator">&#x3C;&#x3C;</span> endl <span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span>
</span><span class="code-line"><span class="token keyword">private</span><span class="token operator">:</span>
</span><span class="code-line"> <span class="token keyword">char</span> m_ch <span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span> <span class="token punctuation">;</span>
</span><span class="code-line"><span class="token keyword">class</span> <span class="token class-name">B</span><span class="token operator">:</span><span class="token base-clause"><span class="token keyword">public</span> <span class="token class-name">A</span></span><span class="token punctuation">{</span>
</span><span class="code-line"><span class="token keyword">public</span><span class="token operator">:</span>
</span><span class="code-line"> <span class="token function">B</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span><span class="token function">m_ch</span><span class="token punctuation">(</span><span class="token char">'B'</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span>
</span><span class="code-line"> <span class="token keyword">void</span> <span class="token function">foo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"B::foo()"</span> <span class="token operator">&#x3C;&#x3C;</span>endl <span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token punctuation">}</span>
</span><span class="code-line"><span class="token keyword">private</span><span class="token operator">:</span>
</span><span class="code-line"> <span class="token keyword">char</span> m_ch <span class="token punctuation">;</span>
</span><span class="code-line"><span class="token punctuation">}</span> <span class="token punctuation">;</span>
</span><span class="code-line">
</span><span class="code-line"><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
</span><span class="code-line"> A a <span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">void</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token operator">*</span>vptr_a<span class="token punctuation">)</span><span class="token punctuation">(</span>A<span class="token operator">*</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">*</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token operator">*</span><span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">(</span>A<span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">&#x26;</span>a <span class="token punctuation">;</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token punctuation">(</span><span class="token keyword">void</span> <span class="token operator">*</span><span class="token punctuation">)</span>vptr_a <span class="token operator">&#x3C;&#x3C;</span>endl <span class="token punctuation">;</span> <span class="token comment">//0x8048bb0</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"foo():"</span><span class="token operator">&#x3C;&#x3C;</span><span class="token punctuation">(</span><span class="token keyword">void</span> <span class="token operator">*</span><span class="token punctuation">)</span>vptr_a<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">&#x3C;&#x3C;</span>endl <span class="token punctuation">;</span> <span class="token comment">//foo():0x8048992</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"bar():"</span> <span class="token operator">&#x3C;&#x3C;</span><span class="token punctuation">(</span><span class="token keyword">void</span> <span class="token operator">*</span><span class="token punctuation">)</span>vptr_a<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">&#x3C;&#x3C;</span>endl <span class="token punctuation">;</span> <span class="token comment">//bar():0x80489d4</span>
</span><span class="code-line"> vptr_a<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token operator">&#x26;</span>a<span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">//A::foo()</span>
</span><span class="code-line"> vptr_a<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token operator">&#x26;</span>a<span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">//A::bar()</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"-----------------------------------------"</span> <span class="token operator">&#x3C;&#x3C;</span>endl <span class="token punctuation">;</span>
</span><span class="code-line"> B b <span class="token punctuation">;</span>
</span><span class="code-line"> <span class="token keyword">void</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token operator">*</span>vptr_b<span class="token punctuation">)</span><span class="token punctuation">(</span>B<span class="token operator">*</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">*</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token operator">*</span><span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">(</span>B<span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">&#x26;</span>b <span class="token punctuation">;</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token punctuation">(</span><span class="token keyword">void</span> <span class="token operator">*</span><span class="token punctuation">)</span>vptr_b <span class="token operator">&#x3C;&#x3C;</span>endl <span class="token punctuation">;</span> <span class="token comment">//0x8048ba0</span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"foo():"</span><span class="token operator">&#x3C;&#x3C;</span><span class="token punctuation">(</span><span class="token keyword">void</span> <span class="token operator">*</span><span class="token punctuation">)</span>vptr_b<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">&#x3C;&#x3C;</span>endl <span class="token punctuation">;</span> <span class="token comment">//foo():0x8048a3a </span>
</span><span class="code-line"> cout <span class="token operator">&#x3C;&#x3C;</span> <span class="token string">"bar():"</span> <span class="token operator">&#x3C;&#x3C;</span><span class="token punctuation">(</span><span class="token keyword">void</span> <span class="token operator">*</span><span class="token punctuation">)</span>vptr_b<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">&#x3C;&#x3C;</span>endl <span class="token punctuation">;</span> <span class="token comment">//bar():0x80489d4</span>
</span><span class="code-line"> vptr_b<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token operator">&#x26;</span>b<span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">//B::foo()</span>
</span><span class="code-line"> vptr_b<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token operator">&#x26;</span>b<span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">//A::bar()</span>
</span><span class="code-line"><span class="token punctuation">}</span>
</span><span class="code-line">
</span></code></pre>
<p>上述程序说明了虚函数表是真实存在的:</p>
</div></div></div><div class="wrap h3body-not-exist"><div class="wrap-header h3wrap"><h3 id="动态绑定-1"><a aria-hidden="true" tabindex="-1" href="#动态绑定-1"><span class="icon icon-link"></span></a>动态绑定</h3><div class="wrap-body">
<p>当编译器“看到”通过指针或者引用调用基类中的虚函数时,并不急于生成有关函数调用的指令,相反它会用一段代码替代该调用语句,这段代码在运行时被执行,完成如下操作:
1)根据调用指针或引用的目标对象找到其内部的虚表指针;
2)根据虚表指针找到其所指向的虚函数表;
3)根据虚函数名和函数指针在虚函数表中的索引,找到所调用虚函数的入口地址;
4)在完成函数调用的准备工作以后,直接跳转到虚函数入口地址处顺序执行函数体指令序列,直到从函数中返回。
3.动态绑定对性能的影响
1)虚函数表和虚指针的存在势必要增加内存空间的开销。
2)和普通函数调用相比,虚函数调用要多出一个步骤,增加运行时间的开销。
3)动态绑定会妨碍编译器通过内联优化代码,虚函数不能内联。</p>
</div></div></div></div></div></div><script src="https://giscus.app/client.js" data-repo="jaywcjlove/reference" data-repo-id="R_kgDOID2-Mw" data-category="Q&#x26;A" data-category-id="DIC_kwDOID2-M84CS5wo" data-mapping="pathname" data-strict="0" data-reactions-enabled="1" data-emit-metadata="0" data-input-position="bottom" data-theme="dark" data-lang="zh-CN" crossorigin="anonymous" async></script><div class="giscus"></div></div><div class="wrap h1body-not-exist max-container"><header class="wrap-header h1wrap"><h1 id="ref"><svg xmlns="http://www.w3.org/2000/svg" height="1em" width="1em" viewBox="0 0 187 155">
<path fill="currentColor" d="M77.4039102,0.01171875 C104.893578,0.01171875 130.532863,14.8054453 144.312707,38.6186211 L110.875113,57.9682852 C103.978656,46.0481602 91.1520117,38.6428945 77.4039102,38.6428945 C56.1021016,38.6428945 38.7718008,55.9731953 38.7718008,77.2750039 C38.7718008,98.5758789 56.1021016,115.90618 77.4039102,115.90618 C91.1529453,115.90618 103.97959,108.500914 110.87698,96.5789219 L144.314574,115.927652 C130.53473,139.743629 104.895445,154.537355 77.4039102,154.537355 C34.800293,154.537355 0.140625,119.877688 0.140625,77.2750039 C0.140625,34.6713867 34.800293,0.01171875 77.4039102,0.01171875 Z M146.080934,64.3970117 L146.080934,72.9823398 L154.666262,72.9823398 L154.666262,81.5667344 L146.080934,81.5667344 L146.080934,90.1520625 L137.497473,90.1520625 L137.497473,81.5667344 L128.912145,81.5667344 L128.912145,72.9823398 L137.497473,72.9823398 L137.497473,64.3970117 L146.080934,64.3970117 Z M178.274047,64.3970117 L178.274047,72.9823398 L186.859375,72.9823398 L186.859375,81.5667344 L178.274047,81.5667344 L178.274047,90.1520625 L169.690586,90.1520625 L169.690586,81.5667344 L161.105258,81.5667344 L161.105258,72.9823398 L169.690586,72.9823398 L169.690586,64.3970117 L178.274047,64.3970117 Z"></path></svg><a aria-hidden="true" tabindex="-1" href="#ref"><span class="icon icon-link"></span></a>ref</h1><div class="wrap-body">
<p><a href="https://gitee.com/nwu_zjq">nwu_zjq</a></p>
</div></header><div class="menu-tocs"><div class="menu-btn"><svg aria-hidden="true" fill="currentColor" height="1em" width="1em" viewBox="0 0 16 16" version="1.1" data-view-component="true">
<path fill-rule="evenodd" d="M2 4a1 1 0 100-2 1 1 0 000 2zm3.75-1.5a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zm0 5a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zm0 5a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zM3 8a1 1 0 11-2 0 1 1 0 012 0zm-1 6a1 1 0 100-2 1 1 0 000 2z"></path>
</svg></div><div class="menu-modal"><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#入门">入门</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#hellocpp">hello.cpp</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#变量">变量</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#原始数据类型">原始数据类型</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#用户输入">用户输入</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#交换">交换</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#注释">注释</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#if-语句">If 语句</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#循环">循环</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#函数">函数</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#引用">引用</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#命名空间">命名空间</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-数组">C++ 数组</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#定义">定义</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#操控">操控</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#展示">展示</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#多维">多维</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-条件">C++ 条件</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#if-clause">If Clause</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#else-if-语句">Else if 语句</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#运算符">运算符</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#关系运算符">关系运算符</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#赋值运算符">赋值运算符</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#逻辑运算符">逻辑运算符</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#位运算符">位运算符</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#三元运算符">三元运算符</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#switch-语句">switch 语句</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-循环">C++ 循环</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#while">While</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#do-while">Do-while</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#continue-语句">Continue 语句</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#无限循环">无限循环</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#for_each-c11-起">for_each (C++11 起)</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#基于范围-c11-起">基于范围 (C++11 起)</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#中断语句">中断语句</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#several-variations">Several variations</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#auto">auto</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-函数">C++ 函数</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#参数和返回">参数和返回</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#重载">重载</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#内置函数">内置函数</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#lambda-表达式">Lambda 表达式</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c多线程">C++多线程</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#多线程介绍">多线程介绍</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#线程的创建">线程的创建</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#线程的销毁">线程的销毁</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#this_thread">this_thread</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#锁"></a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#锁的基本操作">锁的基本操作</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#更简单的锁--stdlock_guardmutex">更简单的锁 —— std::lock_guard&#x3C;Mutex></a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#unique_lockmutex">unique_lock&#x3C;Mutex></a><a aria-hidden="true" class="leve5 tocs-link" data-num="5" href="#stdadopt_lock">std::adopt_lock</a><a aria-hidden="true" class="leve5 tocs-link" data-num="5" href="#stdtry_to_lock">std::try_to_lock</a><a aria-hidden="true" class="leve5 tocs-link" data-num="5" href="#stddefer_lock">std::defer_lock</a><a aria-hidden="true" class="leve5 tocs-link" data-num="5" href="#stdunique_lockmutexrelease">std::unique_lock&#x3C;Mutex>::release</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#stdcall_once">std::call_once</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#stdcondition_variable">std::condition_variable</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#创建条件变量">创建条件变量</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#等待条件变量被通知">等待条件变量被通知</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#stdcondition_variablenotify_one">std::condition_variable::notify_one</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#stdcondition_variablenotify_all">std::condition_variable::notify_all</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#获取线程的运行结果">获取线程的运行结果</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#创建异步任务">创建异步任务</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#获取异步任务的返回值">获取异步任务的返回值</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#stdasync-的额外参数">std::async 的额外参数</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#返回值的状态">返回值的状态</a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#多个返回值">多个返回值</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c-预处理器">C++ 预处理器</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#预处理器">预处理器</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#includes">Includes</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#defines">Defines</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#if">If</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#error">Error</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#宏"></a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#令牌连接">令牌连接</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#字符串化">字符串化</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#文件和行">文件和行</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#各种各样的">各种各样的</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#转义序列">转义序列</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#关键字">关键字</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#预处理器-1">预处理器</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#另见">另见</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#map和set">map和set</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#string">string</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#指针">指针</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#sstream类处理字符串">sstream类处理字符串</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#技巧">技巧</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c编译流程">C++编译流程</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#说一下-static-关键字的作用">说一下 static 关键字的作用</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#说一下-c和-c-的区别">说一下 C++和 C 的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#指针和引用">指针和引用</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#智能指针-为何使用智能指针">智能指针? 为何使用智能指针</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#解决的问题">解决的问题</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#unique_ptr-shared_ptr-weak_ptr">unique_ptr, shared_ptr, weak_ptr</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#define和const区别">#define和const区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#重载overload覆盖重写override隐藏重定义overwrite这三者之间的区别">重载overload覆盖重写override隐藏重定义overwrite这三者之间的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#多态">多态</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#动态多态和静态多态">动态多态和静态多态</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#动态多台和静态多态的比较">动态多台和静态多态的比较</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#虚函数表">虚函数表</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#多态的工作原理底层实现机制">多态的工作原理(底层实现机制)</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#动态绑定">动态绑定</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#析构函数为何为虚函数">析构函数为何为虚函数:</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#map和set的实现">map和set的实现</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#指针和数组的区别">指针和数组的区别?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#深浅拷贝">深浅拷贝</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#定义字符串的区别">定义字符串的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#类型转换-cast">类型转换? cast</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#const指针">const指针</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#newdelete-与-mallocfree-的区别是什么">new/delete 与 malloc/free 的区别是什么</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#构造函数和析构函数">构造函数和析构函数</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#allocator-内存分配和释放">allocator 内存分配和释放?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#malloc-的原理">malloc 的原理</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#stl迭代器删除元素">STL迭代器删除元素:</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#vector和list-的区别">vector和list 的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#stl迭代器的作用-为何不用指针而用迭代器">STL迭代器的作用, 为何不用指针而用迭代器?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c中类成员的访问权限">C++中类成员的访问权限</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#struct和class的区别">struct和class的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c源文从文本到可执行文件经历过程">C++源文从文本到可执行文件经历过程</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#include--和include-的区别">include "" 和include &#x3C;>的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#forkwaitexec-函数">fork,wait,exec 函数</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#stl-里-resize-和-reserve-的区别">STL 里 resize 和 reserve 的区别</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#bss端等六段-c的内存管理">BSS端等六段: C++的内存管理?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#内存泄漏">内存泄漏</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#判断内存泄漏">判断内存泄漏:</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#如何采用单线程的方式处理高并发">如何采用单线程的方式处理高并发?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#大端小端">大端小端?</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#设计一个server-实现多个客户端请求">设计一个server, 实现多个客户端请求</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c的线程锁你知道几种">C++的线程锁你知道几种?</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#互斥锁mutex">互斥锁mutex</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#条件锁">条件锁</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#自旋锁">自旋锁</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#读写锁">读写锁</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#什么类不能被继承">什么类不能被继承</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#结构体和类大小">结构体和类大小</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#类的什么方法不能是虚函数">类的什么方法不能是虚函数</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#hash扩容">hash扩容</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#c派生类的构造函数和析构函数执行顺序及其构造形式">C++派生类的构造函数和析构函数执行顺序及其构造形式</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#派生类的构造函数和析构函数的执行顺序">派生类的构造函数和析构函数的执行顺序</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#派生类构造函数和析构函数的构造原则">派生类构造函数和析构函数的构造原则</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#注意">注意</a><a aria-hidden="true" class="leve2 tocs-link" data-num="2" href="#虚函数调用的工作原理-基于虚函数多态的机制">虚函数调用的工作原理 基于虚函数多态的机制</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#虚函数和纯虚函数">虚函数和纯虚函数</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#抽象类">抽象类</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#虚函数表-1">虚函数表</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#多态的工作原理底层实现机制-1">多态的工作原理(底层实现机制)</a><a aria-hidden="true" class="leve3 tocs-link" data-num="3" href="#动态绑定-1">动态绑定</a></div></div><div class="h1wrap-body"></div><script src="https://giscus.app/client.js" data-repo="jaywcjlove/reference" data-repo-id="R_kgDOID2-Mw" data-category="Q&#x26;A" data-category-id="DIC_kwDOID2-M84CS5wo" data-mapping="pathname" data-strict="0" data-reactions-enabled="1" data-emit-metadata="0" data-input-position="bottom" data-theme="dark" data-lang="zh-CN" crossorigin="anonymous" async></script><div class="giscus"></div></div><footer class="footer-wrap"><footer class="max-container">© 2022 <a href="https://wangchujiang.com/#/app" target="_blank">Kenny Wang</a>.</footer></footer><script src="../data.js?v=1.5.3" defer></script><script src="../js/fuse.min.js?v=1.5.3" defer></script><script src="../js/main.js?v=1.5.3" defer></script><div id="mysearch"><div class="mysearch-box"><div class="mysearch-input"><div><svg xmlns="http://www.w3.org/2000/svg" height="1em" width="1em" viewBox="0 0 18 18">
<path fill="currentColor" d="M17.71,16.29 L14.31,12.9 C15.4069846,11.5024547 16.0022094,9.77665502 16,8 C16,3.581722 12.418278,0 8,0 C3.581722,0 0,3.581722 0,8 C0,12.418278 3.581722,16 8,16 C9.77665502,16.0022094 11.5024547,15.4069846 12.9,14.31 L16.29,17.71 C16.4777666,17.8993127 16.7333625,18.0057983 17,18.0057983 C17.2666375,18.0057983 17.5222334,17.8993127 17.71,17.71 C17.8993127,17.5222334 18.0057983,17.2666375 18.0057983,17 C18.0057983,16.7333625 17.8993127,16.4777666 17.71,16.29 Z M2,8 C2,4.6862915 4.6862915,2 8,2 C11.3137085,2 14,4.6862915 14,8 C14,11.3137085 11.3137085,14 8,14 C4.6862915,14 2,11.3137085 2,8 Z"></path>
</svg><input id="mysearch-input" type="search" placeholder="搜索" autocomplete="off"><div class="mysearch-clear"></div></div><button id="mysearch-close" type="button">搜索</button></div><div class="mysearch-result"><div id="mysearch-menu"></div><div id="mysearch-content"></div></div></div></div></body>
</html>