学而时习之:C++语言基础了解

C++ 简介

C++ 是一种通用编程语言,由 Bjarne Stroustrup 在 C 语言基础上改进而来,旨在引入面向对象编程范式。C++ 的主要特点如下:

  1. 简洁:程序可拆分为逻辑单元与模块,配套丰富的标准库和多样的数据类型。
  2. 机器无关:只要有合适的编译器,同一份 C++ 代码可在任意机器上运行。
  3. 底层访问:可直接操作系统资源,非常适合系统级编程与高效代码编写。
  4. 执行速度快:几乎没有额外运行时开销,是运行最快的高级语言之一。
  5. 面向对象:相对 C 的最大优势,支持封装、继承、多态,使程序更易维护、扩展,适合构建大型应用。

C++ 程序结构

基本结构规定了代码的书写顺序,否则会导致编译错误。一个标准 C++ 程序通常包含:

C++ 的历史

C++ 是一种面向对象的中间层编程语言,由 Bjarne Stroustrup 于 1979 年在贝尔实验室开发。最初命名为 "C with Classes",1983 年更名为 C++。它在 C 语言的基础上扩展了类、继承和类型检查等特性,以支持面向对象编程。随着时间推移,C++ 经历了多个标准版本的演进,包括 C++98(c++03)、C++11、C++17、C++20,以及最新的 C++23,不断引入现代特性以提升性能与安全性。如今,C++ 仍广泛应用于系统软件、游戏引擎、竞赛编程和高性能应用程序中。

C++ 变量类型

C++ 变量声明 与 初始化

变量的内存管理

当我们"创建"或"声明 "一个变量时,编译器会替它划出一块固定大小的内存,但这块内存的初始内容通常是"垃圾值"(随机数据)。
初始化 (使用赋值号 = 或其它方式)才会把有意义的数据写进这块空间。

变量名本质上就是这块内存的"人话入口",我们通过名字去读写对应地址里的数据。

c++ 复制代码
int num;  //声明 或 创建
num = 3;  //初始化变量

float fnum = 6.57; //一步到位,声明+初始化

C++ 关键字的分类

下面给出一张"一体化速查表"------把 C++98/03 → C++23 出现的所有保留关键字,按「功能类别→出现标准」两级分组,并在同一格内给出「作用一句话」。

(空白格表示该关键字在该标准尚未出现;● 表示首次出现;○ 表示已存在。)

功能类别 关键字 C++98 C++11 C++14 C++17 C++20 C++23
基础类型 void 无类型/无返回值 ○ ○ ○ ○ ○
bool 布尔类型,取 true/false ○ ○ ○ ○ ○
char 单字节字符 ○ ○ ○ ○ ○
wchar_t 宽字符 ○ ○ ○ ○ ○
char16_t UTF-16 字符 ● ○ ○ ○ ○
char8_t UTF-8 字符 ● ○
char32_t UTF-32 字符 ● ○ ○ ○ ○
short 短整型 ○ ○ ○ ○ ○
int 整型 ○ ○ ○ ○ ○
long 长整型 ○ ○ ○ ○ ○
signed 有符号修饰 ○ ○ ○ ○ ○
unsigned 无符号修饰 ○ ○ ○ ○ ○
float 单精度浮点 ○ ○ ○ ○ ○
double 双精度浮点 ○ ○ ○ ○ ○
类型推导/别名 auto 让编译器推导类型(C++11 起彻底改变语义) ● ○ ○ ○ ○
decltype 取表达式类型 ● ○ ○ ○ ○
typedef 给类型起"旧式"别名 ○ ○ ○ ○ ○
using 起别名/引入命名空间 ○ ○ ○ ○ ○
常量/编译期 const 只读常量 ○ ○ ○ ○ ○
constexpr 编译期可计算 ● ○ ○ ○ ○
consteval 必为编译期求值的"立即函数" ● ○
constinit 强制"静态初始化"用常量表达式 ● ○
nullptr 类型安全的空指针字面量 ● ○ ○ ○ ○
true/false 布尔字面量 ○ ○ ○ ○ ○
存储期/链接 static 静态存储/内部链接 ○ ○ ○ ○ ○
extern 外部链接声明 ○ ○ ○ ○ ○
register 建议放寄存器(已废弃语义) ○ ○ ○ ○ ○
thread_local 每线程一份独立存储 ● ○ ○ ○ ○
volatile 禁止优化,每次真正读写内存 ○ ○ ○ ○ ○
对齐/大小 alignas 指定对齐要求 ● ○ ○ ○ ○
alignof 查询对齐值 ● ○ ○ ○ ○
sizeof 查询字节大小 ○ ○ ○ ○ ○
控制流 if/else 条件分支 ○ ○ ○ ○ ○
switch/case/default 多路分支 ○ ○ ○ ○ ○
for/while/do 循环 ○ ○ ○ ○ ○
break/continue 跳出/下次循环 ○ ○ ○ ○ ○
goto 无条件跳转 ○ ○ ○ ○ ○
编译期 if if constexpr 编译期条件丢弃分支 ● ○ ○
返回/跳转 return 函数返回 ○ ○ ○ ○ ○
协程 co_await 挂起协程等待可等待对象 ● ○
co_yield 协程"生成"一个值并挂起 ● ○
co_return 协程返回并终止 ● ○
异常 try/catch/throw 捕获/抛出异常 ○ ○ ○ ○ ○
noexcept 标记函数是否可能抛异常 ● ○ ○ ○ ○
转换/RTTI static_cast 编译期安全转换 ○ ○ ○ ○ ○
dynamic_cast 运行时多态转换 ○ ○ ○ ○ ○
const_cast 增删 const 限定 ○ ○ ○ ○ ○
reinterpret_cast 低级别重解释转换 ○ ○ ○ ○ ○
typeid 获取运行时类型信息 ○ ○ ○ ○ ○
内存管理 new/delete 动态分配/释放 ○ ○ ○ ○ ○
类/结构/联合 class 定义类(默认私有) ○ ○ ○ ○ ○
struct 定义结构体(默认公有) ○ ○ ○ ○ ○
union 定义联合(成员重叠存储) ○ ○ ○ ○ ○
enum 定义枚举 ○ ○ ○ ○ ○
访问限定 public/protected/private 访问级别 ○ ○ ○ ○ ○
友元 friend 授权外部函数/类访问私有成员 ○ ○ ○ ○ ○
this this 指向当前对象的指针 ○ ○ ○ ○ ○
虚函数/多态 virtual 声明虚函数 ○ ○ ○ ○ ○
override 显式标记"重写"虚函数 ● ○ ○ ○
final 禁止派生或进一步重写 ● ○ ○ ○
函数修饰 inline 建议内联展开;C++17 起允许多定义 ○ ○ ● ○ ○
explicit 禁止单参构造函数隐式转换 ○ ○ ○ ○ ○
运算符重载 operator 重载运算符函数名 ○ ○ ○ ○ ○
模板/泛型 template 定义函数/类模板 ○ ○ ○ ○ ○
typename 模板中声明类型参数 ○ ○ ○ ○ ○
概念 concept 具名模板约束 ● ○
requires 匿名/局部约束表达式 ● ○
断言 static_assert 编译期断言 ● ○ ○ ○ ○
命名空间 namespace 定义/打开命名空间 ○ ○ ○ ○ ○
模块 module 声明当前翻译单元为模块 ●
import 导入模块或模块分区 ●
反射 reflexpr 编译期获取程序元素元数据(TS 实验) ●
同步 sync 暂定关键字,用于并发同步语义(尚未最终定案) (保留位)
内联汇编 asm 直接插入汇编指令 ○ ○ ○ ○ ○
位运算符拼写 and/or/not/bitand/bitor/xor... 可读性替代 && ` ! & ^` 等 ○ ○ ○ ○ ○

C++ 基本输入/输出

在 C++ 中,数据的读写通过"流"(stream)完成,流就是字节序列。

  • 输入流:数据从设备(如键盘)流向计算机内存。
  • 输出流:数据从内存流向输出设备(如cmd控制台,打印机,手机屏幕,电脑屏幕等)。

这些流由头文件 <iostream> 提供。

最常用的流对象:

  • cin:用于输入
  • cout:用于输出

标准输出流 - cout

cout 是 ostream 类的实例,负责把结果显示到屏幕。

数据通过"插入运算符" << 送给 cout。

示例代码:

cpp 复制代码
#include <iostream>
using namespace std;

int main(){
    // 用 cout 打印指定文本
    cout << "GeeksforGeeks";
    
    return 0;
}

运行结果:

复制代码
GeeksforGeeks

标准输入流 - cin

cin 是 istream 类的实例,用于从键盘读取输入。

通过提取运算符 >> 把数据从输入流读进变量。

示例代码:

cpp 复制代码
#include <iostream>
using namespace std;

int main()
{
    int age;

    // 从用户获取输入并保存到变量
    cin >> age;

    // 输出刚才输入的年龄
    cout << "Your age is: " << age;

    return 0;
}

运行结果(用户键入 18 后按回车):

csharp 复制代码
18
Your age is: 18

无缓冲标准错误流 --- cerr

cerr 是用于输出错误信息的标准错误流,也是 ostream 类的实例。

它会立即 把消息显示出来,不等待缓冲区刷新 (即无缓冲输出 )。

适合把错误或警告与正常程序输出(cout)分开展示。

与 cout 的区别:

  • cout 可能会因缓冲而延迟显示;
  • cerr 保证错误信息瞬间可见;
  • 如果把程序输出重定向到文件,cerr 的内容不会进入该文件,而是直接打印到屏幕------这就是"无缓冲"的含义。

示例代码:

cpp 复制代码
#include <iostream>
using namespace std;

int main()
{
    cerr << "An error occurred";
    return 0;
}

运行结果(立即出现在屏幕):

go 复制代码
An error occurred

带缓冲的标准错误流 --- clog

clog 是用于记录日志信息的标准日志流,同样属于 ostream 类。

与 cerr 不同,clog 先把消息存进缓冲区 ,等到缓冲区满或手动 flush() 时才真正输出------这就是**"带缓冲"的含义。
适合用来记录运行日志,这些信息
不需要立刻**出现在屏幕上。

与 cerr 对比:

  • cerr 无缓冲,立即可见;
  • clog 有缓冲,可能延迟显示,性能略好。

示例代码:

cpp 复制代码
#include <iostream>
using namespace std;

int main()
{
    clog << "An error occurred";
    return 0;
}

运行结果(可能稍后才出现或需手动刷新):

go 复制代码
An error occurred
相关推荐
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
weilx12342 天前
C++笔记-文件IO-<fcntl.h>
c++
Smileyqp沛沛3 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
吞下星星的少年·-·3 天前
C++ 萌新语法入门篇
c++·算法比赛
霍霍的袁3 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
another heaven3 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
程序猿编码3 天前
告别改源码适配模型:纯 C++ 可配置 LLM 推理引擎,全格式全结构兼容
c++·大模型·llm·推理引擎
此生决int3 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++