> 技术文档 > C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇

C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇


C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇

  • 什 么 是 C++
    • 定 义
    • C++ 的 发 展 史
  • 关 键 字
  • 命 名 空 间
    • 定 义
    • 格 式
    • 形 式
    • 命 名 空 间 的 访 问
      • 域 作 用 限 定 符
      • 命 名 空 间 的 展 开
  • C++ 输 入 输 出
    • cout
    • cin
    • endl
    • 设 置 输 出 流 中 的 浮 点 数 精 度
  • 缺 省 参 数
    • 定 义
    • 基 本 语 法
    • 分 类
    • 规 则
  • 总 结

💻作 者 简 介:曾 与 你 一 样 迷 茫,现 以 经 验 助 你 入 门 数据 结 构。
💡个 人 主 页:@笑口常开xpr 的 个 人 主 页
📚系 列 专 栏:硬 核 数 据 结 构 与 算 法
✨代 码 趣 语:缺 省 参 数 就 像 带 了 备 用 钥 匙 的 函 数,你 忘 带 了,它 早 有 准 备,默 默 递 上 默 认 值,让 调 用 之 路 畅 通 无 阻。
💪代 码 千 行,始 于 坚 持,每 日 敲 码,进 阶 编 程 之 路。
📦gitee 链 接:gitee

在这里插入图片描述

         C++ 作 为 一 门 从 C 语 言 演 化 而 来 的 编 程 语 言,既 继 承 了 C 语 言 的 过 程 化 编 程 特 性,又 引 入 了 面 向 对 象 编 程、泛 型 编 程 等 现 代 编 程 范 式。本 文 将 从 C++ 的 定 义 与 发 展 历 程 说 起,深 入 解 析 其 核 心 特 性 - - - 包 括 关 键 字、命 名 空 间、输 入 输 出 机 制、浮 点 数 精 度 控 制 以 及 缺 省 参 数 等,帮 助 读 者 系 统 掌 握 C++ 的 基 础 语 法 与 核 心 概 念,为 后 续 深 入 学 习 打 下 坚 实 基 础。


什 么 是 C++

C++ 官 网

定 义

         C++ 是 基 于 C 语 言 而 产 生 的,它 既 可 以 进 行 C 语 言 的 过 程 化 程 序 设 计,又 可 以 进 行 以 抽 象 数 据 类 型 为 特 点 的 基 于 对 象 的 程 序 设 计,还 可 以 进 行 面 向 对 象 的 程 序 设 计。

C++ 的 发 展 史

诞 生:在 C 语 言 的 土 壤 中 萌 芽(20 世 纪 70 年 代 中 期 - - - 1983)
         20 世 纪 70 年 代 中 期,贝 尔 实 验 室 的 本 贾 尼・斯 特 劳 斯 特 鲁 普 在 从 事 大 型 系 统 开 发 时,发 现 C 语 言 缺 乏 对 大 型 程 序 的 有 效 管 理 机 制,而 Simula 语 言 的 面 向 对 象 特 性 虽 先 进 却 性 能 不 足。于 是 他 开 始 着 手 开 发 一 种 “带 类 的 C 语 言”,这 便 是 C++ 的 雏 形。
         1979 年,本 贾 尼 · 斯 特 劳 斯 特 卢 普 到 了 AT & T 贝 尔 实 验 室,开 始 从 事 将 C 改 良 为 带 类 的 C 的 工 作。
         1983 年,随 着 运 算 符 重 载、引 用 等 特 性 的 加 入,这 门 语 言 正 式 更 名 为 C++。


标 准 化:奠 定 语 言 根 基(1989-1998)
         1989 年,ANSI(美 国 国 家 标 准 协 会)成 立 了 C++ 标 准 化 委 员 会,正 式 启 动 标 准 化 工 作。
         1998 年 C++98 标 准(ISO/IEC 14882:1998)终 于 发 布,这 是 C++ 的 第 一 个 国 际 标 准,该 标 准 确 立 了 C++ 的 核 心 语 法 体 系。


现 代 化 转 型:应 对 新 时 代 挑 战(2003 - - - 2011)
         2003 年 发 布 的 C++03 标 准 主 要 是 对 C++98 的 技 术 修 正,并 未 引 入 重 大 特 性。
         2011 年 发 布 的 C++11 标 准 成 为 语 言 发 展 史 上 的 转 折 点, 被 称 为 “几 乎 是 一 门 新 语 言”。这 次 增 加 了 许 多 特 性,使 得 C++ 更 像 一 种 新 语 言。


持 续 迭 代:完 善 生 态 体 系(2014 - - - 2020)
C++14(2014):在 C++11 基 础 上 进 行 轻 量 化 改 进,完 善 了 泛 型 Lambda、返 回 类 型 推 导 等 特 性,进 一 步 提 升 开 发 便 捷 性。​
C++17(2017):聚 焦 实 用 功 能 增 强,引 入 结 构 化 绑 定 、if constexpr 编 译 期 条 件 判 断、并 行 算 法 库 等,强 化 了 对 现 代 硬 件 的 利 用 能 力。​
C++20(2020):引 入 模 块 解 决 头 文 件 依 赖 问 题,协 程 支 持 异 步 编 程,概 念 完 善 模 板 约 束 机 制,是 自 C++11 以 来 最 具 野 心 的 更 新。​


关 键 字

关 键 字
         C++ 总 计 63 个 关 键 字,这 些 关 键 字 在 后 面 的 文 章 后 会 依 次 介 绍,这 里 不 做 讲 解。
C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇


命 名 空 间

         在 讲 解 命 名 空 间 之 前 ,首 先 看 下 面 的 代 码:

#include <stdio.h>#include <stdlib.h>int rand = 0;//rand重定义和库里面的函数名冲突int main(){printf(\"%d\\n\", rand);return 0;}

C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇

         在 C 语 言 中 我 们 给 变 量 命 名 的 时 候 可 能 会 和 库 函 数 的 变 量 名 一 样,这 时 只 能 更 换 变 量 名。而 在 C++ 中 可 以 使 用 命 名 空 间 来 避 免 这 一 问 题。


定 义

         命 名 空 间 的 作 用 是 建 立 起 一 个 新 的 作 用 域,把 其 中 的 标 识 符(像 类、函 数、变 量 等)隔 离 开 来,这 样 就 能 避 免 不 同 代 码 模 块 之 间 出 现 命 名 冲 突 的 情 况。


格 式

namespace 变量名{//命名空间中可以定义变量/函数/结构体}

形 式

命 名 空 间 可 以 嵌 套 使 用

namespace N1{int a;int b;int Add(int left, int right){return left + right;}namespace N2{int c;int d;int Sub(int left, int right){return left - right;}}}

命 名 空 间 的 访 问

域 作 用 限 定 符

         在 C++ 中 :: 为 域 作 用 限 定 符,可 以 用 来 访 问 命 名 空 间。
         在 C 语 言 中,只 有 全 局 和 局 部 两 个 作 用 域,而 在 C++ 中,有全 局、局 部 和 命 名 空 间 3 个 作 用 域。
C

#include <stdio.h>#include <stdlib.h>int a = 20;int main(){int a = 10;printf(\"%d\\n\", a);return 0;}

C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇
         如 果 全 局 变 量 和 局 部 变 量 同 时 存 在,如 果 要 访 问 全 局 变 量,只 能 注 释 或 者 删 除 局 部 变 量。
C++

#include <stdio.h>#include <stdlib.h>int a = 20;namespace N1{int a = 30;}int main(){int a = 10;printf(\"%d\\n\", a);printf(\"%d\\n\", ::a);printf(\"%d\\n\", N1::a);return 0;}

C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇
         C++ 可 以 使 用 域 作 用 限 定 符 来 访 问 不 同 作 用 域 的 变 量。
1. 不 加 域 作 用 限 定 符,默 认 访 问 局 部 变 量。
2. 添 加 域 作 用 限 定 符 不 加 命 名 空 间 名 字 会 访 问 全 局 变 量。
3. 命 名 空 间 名 字 + 域 作 用 限 定 符 访 问 命 名 空 间 中 的 变 量。

命 名 空 间 的 展 开

全 部 展 开
使 用 关 键 字 using。

#include<stdio.h>namespace N1{int x = 10;int y = 10;}using namespace N1;int main(){printf(\"%d\\n\", x);printf(\"%d\\n\", y);return 0;}

指 定 展 开
使 用 using 将 命 名 空 间 中 某 个 成 员 引 入。

#include<stdio.h>namespace N1{int x = 10;int y = 10;}using N1::x;int main(){printf(\"%d\\n\", x);printf(\"%d\\n\", y);return 0;}

C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇
         指 定 展 开 可 以 展 开 命 名 空 间 中 指 定 的 变 量 或 者 函 数,展 开 的 函 数 或 者 变 量 可 以 运 行,没 有 展 开 的 变 量 不 能 运 行。
         在 日 常 写 代 码 过 程 中 建 议 使 用 全 部 展 开,如 果 是 在 大 型 项 目 中,则 建 议 使 用 部 分 展 开。
注 意
         命 名 空 间 全 部 展 开 之 后 相 当 于 全 局 变 量,如 果 全 局 变 量 和 命 名 空 间 中 的 变 量 名 相 同,则 代 码 会 报 错。

#include<stdio.h>int x = 30;namespace N1{int x = 20;}using namespace N1;int main(){printf(\"%d\\n\", x);return 0;}

C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇
         如 果 添 加 局 部 变 量,代 码 则 输 出 10 这 是 因 为 局 部 变 量 的 优 先 级 大 于 全 局 变 量 和 命 名 空 间。

#include<stdio.h>int x = 30;namespace N1{int x = 20;}using namespace N1;int main(){int x = 10;printf(\"%d\\n\", x);return 0;}

C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇
同 一 个 工 程 中 允 许 存 在 多 个 相 同 名 称 的 命 名 空 间,编 译 器 最 后 会 合 成 同 一 个 命 名 空 间 中。
Stack.h

#pragma once#include<stdio.h>namespace N1{int x = 10;}

Queue.h

#pragma oncenamespace N1{int y = 10;}

test.cpp

#include\"Queue.h\"#include\"Stack.h\"int main(){printf(\"%d\\n\", N1::x);printf(\"%d\\n\", N1::y);return 0;}

C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇
C++ 的 文 件 名 后 缀 是 .cpp。
注 意
如 果 多 个 .cpp 文 件 中 同 时 包 含 同 一 个 头 文 件,头 文 件 中 有 命 名 空 间,链 接 不 能 通 过。例 如 如 下 的 代 码:
Stack.h

#pragma once#include<stdio.h>#include<stdlib.h>#include<iostream>using namespace std;namespace N1{int x = 10;}

stack.cpp

#include \"Stack.h\"

test.cpp

#include \"Stack.h\"

C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇

C++ 输 入 输 出

cout

         cout 是 标 准 输 出 流,其 作 用 是 向 控 制 台 输 出 数 据。要 使 用 它,得 搭 配 <<(流 插 入 运 算 符)。要 使 用 cout,就 需 要 包 含 头 文 件。cout 位 于 std 命 名 空 间 中,为 了 避 免 每 次 都 写 std::,可 以 使 用 using namespace std;。

#include <iostream>using namespace std;int main() { cout << \"Hello, World!\"; //输出字符串 int age = 25; cout << \"My age is \" << age; //输出变量 return 0;}

C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇

cin

         cin 是 标 准 输 入 流,用 于 从 键 盘 读 取 数 据。使 用 时 要 结 合 >>(流 提 取 运 算 符)。和 cout 类 似,使 用 cin 时 要 包 含 头 文 件 和 命 名 空 间 中 的 std。

#include <iostream>using namespace std;int main() { int num; cout << \"请输入一个整数: \"; cin >> num; //从键盘读取整数并存入num中 cout << \"你输入的整数是: \" << num; return 0;}

C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇

endl

         endl 的 功 能 是 结 束 当 前 行,并 且 刷 新 输 出 缓 冲 区。相 当 于 C 语 言 中 的 “\\n”,endl 在 换 行 的 同 时 会 刷 新 缓 冲 区 ,而 \\n 仅 仅 是 换 行。在 性 能 方 面,\\n 的 效 率 更 高。 endl 一 般 和 cout 一 起 使 用,和 cout 类 似,使 用 endl 时 要 包 含 头 文 件 和 命 名 空 间 中 的 std。

#include <iostream>using namespace std;int main() { cout << \"First\" << endl; //输出后换行 cout << \"Second\"; return 0;}

C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇


设 置 输 出 流 中 的 浮 点 数 精 度

方 法 1
         可 以 借 助 头 文 件 中 的 setprecision 来 设 定 有 效 数 字 的 位 数,还 能 通 过 fixed 与 setprecision 配 合,精 确 控 制 小 数 点 后 的 位 数。
setprecision - - - 设 定 有 效 数 字 位 数
C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇


fixed - - - 精 准 控 制 小 数 点 后 的 位 数
C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇

#include <iostream>#include <iomanip> //必须包含这个头文件using namespace std;int main() { double num = 3.1415926; //示例1:设置有效数字位数 cout << setprecision(4) << num << endl; //输出:3.142(四舍五入到4位有效数字) //示例2:设置小数点后的位数 cout << fixed << setprecision(3) << num << endl; //输出:3.142(保留3位小数) //示例3:混合使用 cout << setprecision(5) << 123.45678 << endl; // 输出:123.46(保留5位有效数字) cout << fixed << setprecision(2) << 123.45678 << endl; //输出:123.46(保留2位小数) //取消fixed(恢复默认的有效数字设置) cout.unsetf(ios::fixed); cout << setprecision(6) << num << endl; //输出:3.14159(默认的6位有效数字) return 0;}

C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇


方 法 2
         因 为 C++ 兼 容 C 语 言,可 以 使 用 printf 来 控 制 小 数 位 数。

#include <iostream>#include <iomanip> using namespace std;int main() { double num = 3.1415926; printf(\"%.2f\\n\", num); return 0;}

C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇

缺 省 参 数

定 义

         缺 省 参 数 允 许 函 数 在 调 用 时 省 略 某 些 参 数,此 时 这 些 参 数 会 自 动 使 用 预 先 定 义 的 值。


基 本 语 法

返回类型 函数名(参数1类型 参数1, 参数2类型 参数2 = 默认值2, ...) { //函数体}

代 码 示 例

#include <iostream>using namespace std;void Fun(int a = 0){cout << a << endl;}int main(){Fun(); //没有传参时,使用参数的默认值Fun(10); //传参时,使用指定的实参return 0;}

C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇


分 类

全 缺 省 参 数
         函 数 的 所 有 参 数 都 提 供 了 默 认 值。调 用 该 函 数 时 可 以 不 传 递 任 何 参 数,所 有 参 数 都 会 使 用 默 认 值。

#include <iostream>using namespace std;void Func(int a = 10, int b = 20, int c = 30){cout << \"a = \" << a << endl;cout << \"b = \" << b << endl;cout << \"c = \" << c << endl << endl;}int main(){Func();Func(1);Func(1, 2);Func(1, 2, 3);return 0;}

C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇


半 缺 省 参 数
         函 数 的 部 分 参 数 提 供 了 默 认 值,且 默 认 值 必 须 从 右 向 左 连 续 设 置。调 用 时 必 须 显 式 传 递 没 有 默 认 值 的 参 数,但 可 以 省 略 右 侧 有 默 认 值 的 参 数。

#include <iostream>using namespace std;void Func(int a, int b = 10, int c = 20){cout << \"a = \" << a << endl;cout << \"b = \" << b << endl;cout << \"c = \" << c << endl << endl;}int main(){//Func();//如果函数有一个参数没给值,这里必须传至少一个值Func(1);Func(1, 2);Func(1, 2, 3);return 0;}

C++ 神 级 入 门 指 南:命 名 空 间 + IO 流 + 缺 省 参 数,面 试 通 关 就 靠 这 篇
注 意
         在 半 缺 省 参 数 中,如 果 函 数 第 一 个 参 数 没 有 默 认 值,函 数 在 传 参 时 必 须 传 值,否 则 代 码 会 报 错。


规 则

  1. 默 认 值 只 能 在 函 数 声 明 或 定 义 中 出 现 一 次。
    如 果 函 数 在 头 文 件 中 声 明,默 认 值 应 放 在 声 明 处,定 义 时 不 再 重复。
    如 果 没 有 声 明,直 接 在 定 义 中 指 定 默 认 值。
  2. 缺 省 参 数 必 须 从 右 向 左 连 续 定 义。若 某 个 参 数 有 默 认 值,其 右 侧 所 有 参 数 都 必 须 有 默 认 值。
  3. 函 数 调 用 时,省 略 的 参 数 从 右 向 左 连 续 省 略。不 能 跳 过 某 个 参 数 使 用 默 认 值。

在这里插入图片描述


总 结

         C++ 通 过 命 名 空 间 解 决 了 命 名 冲 突 问 题,借 助 cout、cin 实 现 了 便 捷 的 输 入 输 出,通 过 setprecision 等 工 具 精 细 控 制 浮 点 数 输 出 精 度,而 缺 省 参 数 则 进 一 步 提 升 了 函 数 调 用 的 灵 活 性。从 早 期 的 “带 类 的 C” 到 如 今 不 断 迭 代 的 C++20 及 以 后 标 准,C++ 始 终 在 兼 容 历 史 的 同 时 拥 抱 创 新。掌 握 这 些 基 础 特 性,不 仅 能 帮 助 开 发 者 写 出 更 简 洁、高 效 的 代 码,更 能 理 解 C++ 设 计 的 核 心 理 念 - - - 在 性 能 与 抽 象 之 间 找 到 平 衡。