C++入门基础

作者:全球便秘冠军保持者日期:2026/3/16

C++的第一个程序

1#include<stdio.h>
2int main()
3{
4	printf("Hello World!\n");
5	return 0;
6}

这是我们使用的c++的编译器写的c语言的“Hello World!”,说明c++的编译器可以兼容c语言的语法

那我们来看一下用c++写的“Hello World!”

1#include <iostream>
2using namespace std;
3int main() {
4    cout << "Hello World!" << endl;
5    return 0;
6}
7

iostream是什么?

iostream 是 C++ 标准库中的一个**头文件,**它的全称是 Input/Output Stream(输入/输出流)

在 C++ 中,数据的输入和输出被抽象为“流”的概念:

  • 输入流 (Input Stream):数据从外部设)流向内存
  • 输出流 (Output Stream):数据从内存流向外部设备

C++ 语言本身并不包含处理输入输出的关键字。如果没有 iostream,你的程序将是一个“黑盒”:它能计算,但无法告诉你结果,也无法接收你的指令,通过引入这个头文件,编译器才知道如何调用底层的系统接口来显示字符或读取

std是什么?

std 是英文单词 Standard(标准)的缩写。它是 C++ 标准库(Standard Library)专属的命名空间

C++ 官方委员会定义的所有功能(比如打印文字的 cout、读取输入的 cin、生成随机数的 rand 等)都被统一打包放在这个名为 std 的“大箱子”里

namespace命名空间

想象一下,如果你所在的学校有两个学生都叫“小明”,当老师在走廊大喊“小明”时,两个学生都会回头,这就产生了命名冲突

1#include <iostream>
2using namespace std;
3int rand = 10;
4int main()
5{
6	cout << rand << endl;
7	return 0;
8}

在编译器中的“cout << rand << endl;”里面的rand是有红色波浪线的,rand在cpp中是**生成一个伪随机整数,**但是现在我用rand的定义了一个整型的变量就会产生冲突编译器就不知道rant的具体作用是什么?但是如果我们加上命名空间去定义rand的效果就不一样

1#include <iostream>
2using namespace std;
3namespace space   //命名空间的名称可以自定义,我这里是space
4{
5	int rand = 10;
6}
7int main()
8{
9	cout << rand << endl;
10	return 0;
11}

现在我们就已经能正确的编译我们的代码但是输出的结果好像不是我们定义的数据,是一块内存地址,这是因为在代码开头写了 using namespace std;这相当于把 std 空间里的所有东西都释放到了全局范围,包括标准库里的 **rand 函数,**这样会打印rand函数在内存中的地址,那我们在命名空间中已经定义了rand,那我们怎么才能把rand的数据输出呢?

"::"(域作用限定符)访问域中的成员

编译查找一个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找,我们只需要在输出的内容前面加上域名和“::”就可以了

1#include <iostream>
2using namespace std;
3namespace space
4{
5	int rand = 10;
6}
7int main()
8{
9	cout << space::rand << endl;
10	return 0;
11}

由于如果单纯访问一个变量只会在局部或者全局中查找,如果没有则访问失败,而 namespace 这个域又是不同与这两个域的另一种域,这样的话我们如果想要访问到 namespace 里面的成员,就需要借助 :: 了

1#include<stdio.h>
2namespace A
3{
4	int rand = 10;
5}
6
7int rand = 20;
8
9int main()
10{
11	int rand = 30;
12	printf("%d\n", rand);
13	printf("%d\n", ::rand);
14	printf("%d\n", A::rand);
15	return 0;
16}

1.局部变量:int rand = 30;

  • 位置:在 main 函数内部。
  • 特性:这是离 printf 最近的变量。在 C++ 中,遵循就近原则(Local scope takes precedence)。
  • 访问方式:直接写 rand
  • 结果:第一个 printf 输出 30

2. 全局变量:int rand = 20;

  • 位置:在所有函数和命名空间之外。
  • 特性:它属于全局作用域
  • 访问方式:使用作用域解析运算符 ::(前面不加任何名字)。这个符号告诉编译器:“跳出当前函数,去全局最外层找”。
  • 结果:第二个 printf输出 20

3. 命名空间变量:A::rand = 10;

  • 位置:被包裹在 namespace A 这个特定的“抽屉”里。
  • 特性:它被物理隔离了,不会和外面的人打架。
  • 访问方式:必须指名道姓,写成 A::rand
  • 结果:第三个 printf 输出 10

为什么这次没有输出“内存地址”?

你可能注意到了,这次我用了 #include <stdio.h>

  • 在之前的例子中,我用了 using namespace std; 并且包含了 <iostream>,这导致了标准库的 rand 函数进入了我的视线
  • 而在这段代码里,我没有引用 std 命名空间,且 printf 强制要求格式化输出,在 <stdio.h> 中没有 rand 函数
  • 更重要的是,我在全局和局部都显式定义int rand,根据 C++ 的规则,局部定义的变量会“屏蔽”掉同名的全局函数或变量

命名空间的嵌套

1#include <iostream>
2using namespace std;
3namespace space
4{
5	int rand = 10;
6	namespace box
7	{
8		int boxing = 20;
9	}
10}
11int main()
12{
13	cout << space::rand << endl;
14	cout << space::box::boxing << endl;
15	return 0;
16}

C++输入输出

在 C++ 中,所有的输入输出都是通过“流”来完成的。我们需要包含 <iostream> 头文件,并使用 std 命名空间

数据的“流入”与“流出”

C++ 使用两个非常形象的运算符:

  • 提取符 (>>):从输入流中“提取”数据存入变量
  • 插入符 (<<):将数据“插入”到输出流中打印出来
1#include <iostream>
2using namespace std;
3int main() 
4{
5    int age;
6    cin >> age;
7    cout << age;
8    return 0;
9}

“cin”就表示提取到“流”,“cout”就是输出“流”,那如果我们多输入几个会怎么样?

1#include <iostream>
2using namespace std;
3int main() 
4{
5    int age1,age2,age3;
6    cin >> age1>>age2>>age3;
7    cout << age1<<","<<age2<<","<<age3;
8    return 0;
9}

那如果我们不想打开“std”的话,怎么输出?

1#include <iostream>
2int main() 
3{
4    int age1,age2,age3;
5    std::cin >> age1>>age2>>age3;
6    std::cout << age1 << "," << age2 << "," << age3 << std::endl;
7    return 0;
8}

我们就可以在输入输出前面加“std::”

那“endl”是什么意思?

endl 的双重身份

1. 换行 (\n)

这是大家最熟悉的,它会将光标移到下一行的开头。

2. 刷新缓冲区 (flush)这才是重点

这是 endl 与普通换行符 \n 最大的区别

  • 什么是缓冲区? 为了提高性能,C++ 不会你每输出一个字符就往屏幕(或磁盘)上写一个字符。相反,它会先在一个内存区域(缓冲区)里攒着,等到攒够了一定数量,再一次性“倒”出来。
  • flush 的作用: 执行 flush 就相当于下达了命令:“别等了,现在立刻马上把缓冲区里的所有东西都吐出来
  • 这里大家就暂时想成换行符


C++入门基础》 是转载文章,点击查看原文


相关推荐


拒绝写重复代码,试试这套开源的 SpringBoot 组件,效率翻倍~
皮皮林5512026/3/7

目录 1 简介 2 快速入门 2.1 Spring Boot 接口开发现状 2.2 快速入门 1 简介 Graceful Response 是一个 Spring Boot 技术栈下的优雅响应处理器,提供一站式统一返回值封装、全局异常处理、自定义异常错误码 等功能,使用 Graceful Response 进行 web 接口开发不仅可以节省大量的时间,还可以提高代码质量,使代码逻辑更清晰。 强烈推荐你花 3 分钟学会它! 本项目案例工程代码:https://github.com/fe


程序员的明天:AI 时代下的行业观察与个人思考
勇哥Java实战2026/2/27

这篇文章分享了我对 AI 时代下,软件行业发展以及程序员命运走向的 5 点思考,供大家参考。 1 匠人时代落幕 Redis 之父 antirez,最近写了一篇文章 《 Don't fall into the anti-AI hype 》,读完之后,我深有感触。 文章的观点非常明确: AI 不仅改变了编码方式,更重塑了软件行业的价值结构和职业路径,程序员需要从“手动编码”转向“设计系统与与 AI 协作” 。 过去的软件行业,其实有一种很典型的“匠人红利”。谁代码写得更优雅,谁框架更熟,谁对某个


QT & QML 总结备查
瞰百2026/2/19

QT & QML 总结备查 首要注意,在桌面端开发QT可免费商用,而嵌入式端QT商用则收费。 各种 UI 库的总结和对比: Cpp-Learning/C-C++实用库备查.md at main · Staok/Cpp-Learning。 文章所在 Github 仓库 Staok/QT-QML-Learning: QT & QML 总结备查文章 会保持最新,其它地方的不会跟进。 常看常新 QT 安装:网搜 Qt Creator 下载和安装即可。 编译器:对于 Win 上


英语语法笔记:英语不应该成为开发工程师的发展瓶颈
修己xj2026/2/11

前几天,是公司成立二十周年的年会。老板作了一场题为《穿越寒冬,求实存善》的演讲。那一刻我在想:当寒意渐浓,作为领航者,他思考的是如何带领公司扛过这场冬天;那作为程序员的我们,又该如何穿越自己的寒冬呢? Vue 作者尤雨溪曾坦言:“不仅英语差会成为瓶颈,英语好还能成为优势,因为学习效率会比别人高。像我这样半路出家自学的人,只能靠英语了……”确实,无论是阅读技术文档、参与开源社区、在 Stack Overflow 寻找答案,还是追踪最新技术资讯、争取一份远程机会,英语早已不是可选项,而是必修课——是


AI - 通过 Docker 来安装与访问 OpenClaw
LinXunFeng2026/2/2

欢迎关注微信公众号:FSA全栈行动 👋 一、简介 这是我在 Mac 上通过 Docker 来安装和配置 OpenClaw 的一份记录,随着文章从上到下一步步做就可以了。 二、docker 拉取 Ubuntu 镜像 docker pull ubuntu:latest 创建容器 创建容器,并映射 18789 端口 docker run -it -p 18789:18789 --name openclaw ubuntu 搭配 Docker 容器的分离快捷键,先按 Ctrl+P,再按 Ctrl+


🚀 纯前端离线局域网P2P大文件断点传输:别让你的照片墙崩了
子兮曰2026/1/23

前言:小明和他的照片墙危机 想象一下,你是小明,一个热爱摄影的程序员。周末去爬山拍了一堆4K高清照片,总共3GB,准备发给老婆分享。微信传?算了,压缩后画质渣得像像素风。网盘?离线状态下连不上。蓝牙?慢得像蜗牛在跑步。你急得团团转,突然灵机一动:用电脑直接传啊!可是怎么在浏览器里实现局域网P2P大文件传输,还得支持断点续传?别急,今天咱们就聊聊这个技术方案。 技术背景:P2P不是什么新鲜玩意儿 P2P(点对点)传输在局域网里其实挺常见的,BT下载就是经典案例。但咱们今天聊的是纯前端实现,意思是完


【云计算】利用 LVS 构建集群实现负载均衡 | 集群的概念 | 单服务器性能瓶颈验证例子 | LVS 基础 | LVS 构建负载均衡集群实操步骤
王平渊2026/1/15

利用 LVS 构建集群实现负载均衡 LVS 是构建高性能、高可靠负载均衡集群的利器,其内核态转发机制和丰富的调度算法,使其成为大规模集群场景的首选方案。在实际应用中,需根据业务场景选择合适的工作模式(DR 模式为最优选择),并结合 Keepalived 实现高可用,最终解决单服务器的性能瓶颈问题。 Ⅰ. 集群(Cluster)基础 0x00 集群的概念 集群(Cluster),是一组相互独立且相互依赖、通过高速网络互联的计算机组成的计算机组,以单一模式加以管理,为用户提供统一服务。 从用户视角


Excel/WPS 表格数据合并操作指南
GalenZhang8882026/1/6

Excel/WPS 表格数据合并操作指南 场景一:同一个文件,不同工作表(Sheet) 适用情况:数据都在同一个 Excel 文件里,比如在 Sheet1 和 Sheet2,都有共同的 A列 作为关联。 1. 推荐公式:XLOOKUP 公式示例: =XLOOKUP(A2, Sheet2!A:A, Sheet2!D:D) 2. 参数详细说明 A2(查找值): 当前表格(Sheet1)中你要拿去匹配的那个单元格(通常是 ID、姓名等)。Sheet2!A:A(查找数组): 去哪里找这个 ID?即 S


MySQL 版本演进全景图:从 5.6 到 8.4 的技术变革与行业实践
刘一说2025/12/29

文章目录 一、版本演进时间线概览二、核心功能迭代:从基础架构到现代数据库1. 数据类型与存储引擎革新2. 查询语言与计算能力3. 事务与一致性 三、架构与性能优化:从单机到云原生1. 复制与高可用2. 性能调优 四、安全与兼容性:从传统认证到现代密钥管理1. 认证机制演变2. 加密与审计 五、典型场景适配建议六、未来趋势与行业挑战结语 一、版本演进时间线概览 版本发布时间核心突破行业定位5.62013年在线 DDL、性能优化传统 OLTP 基础架构5.7201


前端原生能力速查笔记(HTML + 浏览器 API 实战篇)
遇见~未来2025/12/20

本笔记用于整理前端开发中不依赖框架即可实现的高频实用功能,涵盖文件下载、打印、HTML 原生属性以及浏览器内置 JS API。 适合作为:日常开发速查 / 基础能力沉淀 / 新人教学笔记 一、a 标签文件下载功能 1. 核心原理 利用 HTML5 的 download 属性, 让浏览器在点击链接时触发下载行为,而不是直接预览资源。 2. 基础用法 <!-- 直接下载(使用原文件名) --> <a href="files/demo.pdf" download>下载 PDF</a> <

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客