mirror of
https://github.com/jaywcjlove/reference.git
synced 2025-06-17 20:51:21 +08:00
2359 lines
394 KiB
HTML
2359 lines
394 KiB
HTML
<!doctype html>
|
||
<html lang="en" data-color-mode="dark">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<title>C++ 备忘清单
|
||
& cpp cheatsheet & 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<Mutex></a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#unique_lockmutex">unique_lock<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<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 <>的区别</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"><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"><<</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"><<</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"><<</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"><<</span> <span class="token string">"You entered "</span> <span class="token operator"><<</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"><<</span> <span class="token string">"a="</span> <span class="token operator"><<</span> a <span class="token operator"><<</span> <span class="token string">", b="</span> <span class="token operator"><<</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"><</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"><<</span> i <span class="token operator"><<</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"><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"><<</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">&</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"><<</span> <span class="token string">"i="</span> <span class="token operator"><<</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"><<</span> <span class="token string">"ri="</span> <span class="token operator"><<</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"><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"><<</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"><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"><<</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"><</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"><</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"><</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"><<</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"><</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"><<</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">&</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"><<</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"><</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"><<</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"><</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"><</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"><<</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"><<</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"><<</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"><<</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"><<</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"><<</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"><<</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"><<</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"><<</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"><<</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 < 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 <= 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 && 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 & 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 << 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"><<</span> max <span class="token operator"><<</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"><<</span> max <span class="token operator"><<</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"><<</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"><<</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"><<</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"><<</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"><<</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"><</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"><<</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"><<</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"><=</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"><</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"><<</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"><<</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"><<</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"><<</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"><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"><<</span> num <span class="token operator"><<</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"><</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"><<</span> n <span class="token operator"><<</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"><<</span> c <span class="token operator"><<</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"><<</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"><<</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"><</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"><<</span> <span class="token string">"i="</span> <span class="token operator"><<</span> i <span class="token operator"><<</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"><<</span> <span class="token string">"j="</span> <span class="token operator"><<</span> j <span class="token operator"><<</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"><<</span> c <span class="token operator"><<</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"><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"><<</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"><<</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"><<</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"><<</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"><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"><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"><<</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>&</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">&</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">&</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">&</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">&</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"><</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">&</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"><<</span> ele
|
||
</span><span class="code-line"> <span class="token operator"><<</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 <thread></code>:C++多线程库</li>
|
||
<li><code>#include <mutex></code>:C++互斥量库</li>
|
||
<li><code>#include <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">&</span>Entry<span class="token double-colon punctuation">::</span>entry_function<span class="token punctuation">,</span> <span class="token operator">&</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 <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<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"><</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"><</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<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"><</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"><</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<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"><</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"><</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<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"><</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 <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"><</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<T>::get()</code>或者<code>std::future<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"><</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"><</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&action=edit&redlink=1">import</a></li>
|
||
<li><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/keyword/module&action=edit&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"><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&action=edit&redlink=1">import</a></li>
|
||
<li><a href="https://zh.cppreference.com/mwiki/index.php?title=cpp/keyword/module&action=edit&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 & 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&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<Mutex></a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#unique_lockmutex">unique_lock<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<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 <>的区别</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"><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"><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"><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"><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"><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<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"><</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<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"><</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"><</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"><</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"><</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"><</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"><<</span> <span class="token string">"遍历"</span> <span class="token operator"><<</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 &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">&</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"><<</span> i<span class="token punctuation">.</span>second <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
|
||
</span><span class="code-line"> cout <span class="token operator"><<</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"><</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"><<</span> iter<span class="token operator">++</span><span class="token operator">-></span>second <span class="token operator"><<</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"><<</span> <span class="token string">"查找"</span> <span class="token operator"><<</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"><<</span> it<span class="token operator">-></span>second <span class="token operator"><<</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"><<</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"><<</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"><<</span> <span class="token string">"删除"</span> <span class="token operator"><<</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"><<</span> <span class="token string">"delete success"</span> <span class="token operator"><<</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">&</span>i <span class="token operator">:</span> test<span class="token punctuation">)</span>
|
||
</span><span class="code-line"> cout <span class="token operator"><<</span> i<span class="token punctuation">.</span>second <span class="token operator"><<</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"><</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"><</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"><</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"><</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">&</span>i <span class="token operator">:</span> myMap<span class="token punctuation">)</span> cout <span class="token operator"><<</span>i<span class="token punctuation">.</span>first <span class="token operator"><<</span><span class="token string">"value="</span><span class="token operator"><<</span> i<span class="token punctuation">.</span>second<span class="token operator"><<</span><span class="token string">"; "</span><span class="token punctuation">;</span> cout<span class="token operator"><<</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"><</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"><<</span><span class="token string">"最后一个值是"</span><span class="token operator"><<</span>iter<span class="token operator">-></span>first <span class="token operator"><<</span> <span class="token string">"-"</span> <span class="token operator"><<</span> iter<span class="token operator">-></span>second <span class="token operator"><<</span>endl<span class="token punctuation">;</span>
|
||
</span><span class="code-line"> <span class="token comment">// cout<<"最后一个值是"<<myMap.end()->first << "-" << myMap.end()->second <<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"><</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"><<</span> iter1<span class="token operator">++</span><span class="token operator">-></span>second <span class="token operator"><<</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"><<</span>it<span class="token operator">-></span>first <span class="token operator"><<</span> <span class="token string">"-"</span><span class="token operator"><<</span>it<span class="token operator">-></span>second <span class="token operator"><<</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"><<</span> <span class="token string">"3有"</span> <span class="token operator"><<</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"><<</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"><</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"><<</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"><<</span>endl<span class="token punctuation">;</span> <span class="token comment">// 最简单的查找</span>
|
||
</span><span class="code-line"> <span class="token comment">// cout<<map1.at(5)<<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"><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"><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"><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"><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"><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"><<</span><span class="token string">"str="</span><span class="token operator"><<</span>str<span class="token operator"><<</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"><<</span><span class="token string">"字符串长度等于: "</span><span class="token operator"><<</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>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"><<</span><span class="token string">"字符串最后一位"</span><span class="token operator"><<</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"><<</span>endl<span class="token punctuation">;</span>
|
||
</span><span class="code-line"> cout<span class="token operator"><<</span><span class="token string">"字符串最后一位"</span><span class="token operator"><<</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"><<</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"><<</span><span class="token string">"切片"</span><span class="token operator"><<</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"><<</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"><<</span> <span class="token string">"strName is: "</span> <span class="token operator"><<</span> strName <span class="token operator"><<</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"><<</span> <span class="token string">"strCamp is: "</span> <span class="token operator"><<</span> strCamp <span class="token operator"><<</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& 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"><<</span><span class="token string">"找到子串str2, 在str位置是: "</span><span class="token operator"><<</span>son_location<span class="token operator"><<</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"><<</span>str<span class="token operator"><<</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">//注意这里导入头文件<sstream></span>
|
||
</span><span class="code-line"> str3 <span class="token operator"><<</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"><<</span><span class="token string">"将int类型转化为string类型: "</span><span class="token operator"><<</span>str4<span class="token operator"><<</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"><<</span>str5<span class="token operator"><<</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"><<</span> <span class="token string">"str6 is: "</span> <span class="token operator"><<</span> str6 <span class="token operator"><<</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"><<</span>str<span class="token operator"><<</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"><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"><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"><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"><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">&</span>c<span class="token punctuation">)</span><span class="token punctuation">{</span>
|
||
</span><span class="code-line"> cout<span class="token operator"><<</span><span class="token string">"函数参数输入是: *a="</span><span class="token operator"><<</span><span class="token operator">*</span>a<span class="token operator"><<</span><span class="token string">" b="</span><span class="token operator"><<</span>b<span class="token operator"><<</span><span class="token string">" c="</span><span class="token operator"><<</span>c<span class="token operator"><<</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"><<</span><span class="token string">"函数参数修改后的结果是: *a="</span><span class="token operator"><<</span><span class="token operator">*</span>a<span class="token operator"><<</span><span class="token string">" b="</span><span class="token operator"><<</span>b<span class="token operator"><<</span><span class="token string">" c="</span><span class="token operator"><<</span>c<span class="token operator"><<</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">&</span>z<span class="token punctuation">;</span> <span class="token comment">//指向z地址的指针z1</span>
|
||
</span><span class="code-line"> cout<span class="token operator"><<</span><span class="token string">"原始数据值是: *z1="</span><span class="token operator"><<</span><span class="token operator">*</span>z1<span class="token operator"><<</span><span class="token string">" x="</span><span class="token operator"><<</span>x<span class="token operator"><<</span><span class="token string">" y="</span><span class="token operator"><<</span>y<span class="token operator"><<</span><span class="token string">" z="</span><span class="token operator"><<</span>z<span class="token operator"><<</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"><<</span><span class="token string">"经过函数洗礼后的结果是: *z1="</span><span class="token operator"><<</span><span class="token operator">*</span>z1<span class="token operator"><<</span><span class="token string">" x="</span><span class="token operator"><<</span>x<span class="token operator"><<</span><span class="token string">" y="</span><span class="token operator"><<</span>y<span class="token operator"><<</span><span class="token string">" z="</span><span class="token operator"><<</span>z<span class="token operator"><<</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"> 总结: 引用&跟指针的原理都是一样, 就是传递的是指针,所以当函数参数使用&时,该参数的改变就会影响到调用的值
|
||
</span></span><span class="code-line"><span class="token comment">
|
||
</span></span><span class="code-line"><span class="token comment"> *z1和y的引用: 根据结果可以看出来, 其实指针*跟引用&有着异曲同工之妙呀, \
|
||
</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 = &c; //sum 指向c这块地址</span>
|
||
</span><span class="code-line"> <span class="token comment">// cout<<"sum="<<*sum<<" 地址是:"<<sum<<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"><<</span><span class="token string">"返回来的值和地址是:"</span><span class="token operator"><<</span> <span class="token operator">*</span>p<span class="token operator"><<</span><span class="token string">" 地址:"</span><span class="token operator"><<</span> p <span class="token operator"><<</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">&</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">&</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">&</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">&</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"><<</span><span class="token string">"结果是:"</span><span class="token operator"><<</span>n<span class="token operator"><<</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"><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"><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"><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"><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"><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"><<</span>i<span class="token operator"><<</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"><<</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"><<</span>c<span class="token operator"><<</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"><<</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"><<</span>s<span class="token operator"><<</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"><<</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"><</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"><<</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">&</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"><<</span>count<span class="token punctuation">.</span>first<span class="token operator"><<</span><span class="token string">":"</span><span class="token operator"><<</span>count<span class="token punctuation">.</span>second<span class="token operator"><<</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">// 能使用&进行参数传递, 尽可能使用&, 提高内存使用效率</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"><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"><<</span>str<span class="token operator"><<</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&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<Mutex></a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#unique_lockmutex">unique_lock<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<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 <>的区别</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"><<</span> a <span class="token operator"><<</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"><<</span> b <span class="token operator"><<</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"><<</span> b <span class="token operator"><<</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"><<</span> m_ch <span class="token operator"><<</span> <span class="token string">"::foo()"</span> <span class="token operator"><<</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"><<</span> m_ch <span class="token operator"><<</span> <span class="token string">"::bar()"</span> <span class="token operator"><<</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"><<</span> <span class="token string">"B::foo()"</span> <span class="token operator"><<</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">&</span>a <span class="token punctuation">;</span>
|
||
</span><span class="code-line"> cout <span class="token operator"><<</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"><<</span>endl <span class="token punctuation">;</span> <span class="token comment">//0x8048bb0</span>
|
||
</span><span class="code-line"> cout <span class="token operator"><<</span> <span class="token string">"foo():"</span><span class="token operator"><<</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"><<</span>endl <span class="token punctuation">;</span> <span class="token comment">//foo():0x8048992</span>
|
||
</span><span class="code-line"> cout <span class="token operator"><<</span> <span class="token string">"bar():"</span> <span class="token operator"><<</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"><<</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">&</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">&</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"><<</span> <span class="token string">"-----------------------------------------"</span> <span class="token operator"><<</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">&</span>b <span class="token punctuation">;</span>
|
||
</span><span class="code-line"> cout <span class="token operator"><<</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"><<</span>endl <span class="token punctuation">;</span> <span class="token comment">//0x8048ba0</span>
|
||
</span><span class="code-line"> cout <span class="token operator"><<</span> <span class="token string">"foo():"</span><span class="token operator"><<</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"><<</span>endl <span class="token punctuation">;</span> <span class="token comment">//foo():0x8048a3a </span>
|
||
</span><span class="code-line"> cout <span class="token operator"><<</span> <span class="token string">"bar():"</span> <span class="token operator"><<</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"><<</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">&</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">&</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>))&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">&</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"><<</span>arr<span class="token operator"><<</span><span class="token string">" "</span><span class="token operator"><<</span> p1 <span class="token operator"><<</span> <span class="token string">" "</span><span class="token operator"><<</span>p2<span class="token operator"><<</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"><</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<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"><</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">&</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"><</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"><</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">&</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 &a : arr){}</span>
|
||
</span><span class="code-line">p<span class="token operator">=</span><span class="token operator">&</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">&</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">&</span>a<span class="token punctuation">;</span> <span class="token comment">// 指针常量, 对象不可变, 值可变</span>
|
||
</span><span class="code-line"><span class="token comment">// p1=&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">&</span>b<span class="token punctuation">;</span> <span class="token comment">// 常量指针常量值, </span>
|
||
</span><span class="code-line"><span class="token comment">// p2=&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& 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 <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 <>的区别</h2><div class="wrap-body">
|
||
<ol>
|
||
<li>编译器预处理阶段查找头文件的路径不一样</li>
|
||
<li>双引号查找路径: 当前头文件目录, 编译器设置的头文件路径, 系统变量路径path指定的路径</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="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环境下的内存泄漏检测工具, 也可以在写代码时添加内存申请和释放统计功能, 统计申请和释放是否一致, 以此判断内存泄漏
|
||
varglind,mtrace 检测</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"><<</span> m_ch <span class="token operator"><<</span> <span class="token string">"::foo()"</span> <span class="token operator"><<</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"><<</span> m_ch <span class="token operator"><<</span> <span class="token string">"::bar()"</span> <span class="token operator"><<</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"><<</span> <span class="token string">"B::foo()"</span> <span class="token operator"><<</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">&</span>a <span class="token punctuation">;</span>
|
||
</span><span class="code-line"> cout <span class="token operator"><<</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"><<</span>endl <span class="token punctuation">;</span> <span class="token comment">//0x8048bb0</span>
|
||
</span><span class="code-line"> cout <span class="token operator"><<</span> <span class="token string">"foo():"</span><span class="token operator"><<</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"><<</span>endl <span class="token punctuation">;</span> <span class="token comment">//foo():0x8048992</span>
|
||
</span><span class="code-line"> cout <span class="token operator"><<</span> <span class="token string">"bar():"</span> <span class="token operator"><<</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"><<</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">&</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">&</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"><<</span> <span class="token string">"-----------------------------------------"</span> <span class="token operator"><<</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">&</span>b <span class="token punctuation">;</span>
|
||
</span><span class="code-line"> cout <span class="token operator"><<</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"><<</span>endl <span class="token punctuation">;</span> <span class="token comment">//0x8048ba0</span>
|
||
</span><span class="code-line"> cout <span class="token operator"><<</span> <span class="token string">"foo():"</span><span class="token operator"><<</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"><<</span>endl <span class="token punctuation">;</span> <span class="token comment">//foo():0x8048a3a </span>
|
||
</span><span class="code-line"> cout <span class="token operator"><<</span> <span class="token string">"bar():"</span> <span class="token operator"><<</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"><<</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">&</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">&</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&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<Mutex></a><a aria-hidden="true" class="leve4 tocs-link" data-num="4" href="#unique_lockmutex">unique_lock<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<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 <>的区别</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&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>
|