【初阶C++】入门基础

前言

C++ 作为一门兼具面向对象特性底层高性能的经典编程语言,至今仍是工业界核心开发语言之一,深耕游戏引擎、音视频、嵌入式、服务器、操作系统等高端技术领域。很多初学者觉得 C++ 晦涩难学、学习曲线陡峭,其实只要理清发展脉络、找准学习方向、吃透基础语法,就能稳步入门。

本文基于 C++ 入门基础学习资料,系统梳理 C++ 发展历史、标准版本迭代、行业地位、就业应用、学习规划 ,并详解命名空间、IO 流、缺省参数、函数重载、引用、内联函数、nullptr 等入门核心知识点,适合零基础小白收藏学习。

一、C++ 整体架构与学习体量

整套 C++ 学习内容分为三大核心板块:

  1. C++ 基础语法:兼容 C 语言并扩展面向对象新语法,是入门基石;
  2. STL 标准模板库:封装好的容器、算法、迭代器,开发必备利器;
  3. 高阶数据结构:在基础数据结构之上,适配工程级复杂业务场景。

二、C++ 发展历史溯源

1. 诞生背景

1979 年,本贾尼・斯特劳斯特卢普(Bjarne Stroustrup) 在贝尔实验室开展研发工作,在模拟系统、操作系统开发场景中,发现 C 语言在表达能力、可维护性、可扩展性上存在明显短板,于是萌生了改造 C 语言的想法。

2. 正式诞生

1983 年,在 C 语言基础上新增类、封装、继承 等面向对象核心特性,语言雏形落地,同年正式命名为 C++

3. 标准化历程

  1. 1989 年:启动 C++ 标准化工作,成立 ANSI/ISO 联合标准化委员会;
  2. 1994 年:发布首个标准化草案,同时惠普实验室开发的 STL 被提议纳入 C++ 标准,也因此延缓了标准化进程;
  3. 1997 年:标准最终草案通过;
  4. 1998 年:C++98 正式成为 ANSI/ISO 国际标准,也是 C++ 第一个官方正式版本。

4. 趣味小知识:C++23 网络库跳票

C++ 长期被诟病缺少官方网络库,原本网络库 Networking 计划纳入 C++23 标准。但标准化过程中因技术路线分歧(Asio 方案与 senders/receivers 方案博弈),最终网络库推迟到 C++26 版本,被网友戏称堪比宫斗剧的标准制定过程。目前开发中仍可使用 Asio 第三方网络库替代。

三、C++ 标准版本迭代大全

C++ 从 1998 年正式标准化后,保持每 3 年左右一次版本更新,每次迭代都带来大量实用新特性:

表格

版本 发布时间 核心亮点
C++98 1998 首个官方标准,引入 STL 标准模板库,以模板重构标准库
C++03 2003 漏洞修复、稳定性优化,新增 TR1 扩展库
C++11 2011 革命性大更新:lambda 表达式、范围 for、右值引用、移动语义、智能指针、标准线程库
C++14 2014 C++11 补丁版:泛型 lambda、返回值类型推导、二进制字面常量
C++17 2017 新增 if constexpr、折叠表达式、结构化绑定、文件系统库、string_view
C++20 2020 里程碑更新:协程、概念 Concepts、模块化 Modules、范围库
C++23 2023 小版本完善:if consteval、flat_map、标准库模块化导入
C++26 制定中 待定,将落地延迟的网络库等特性

四、C++ 行业地位与就业应用

1. 编程语言排行榜

以 2024 年 6 月 TIOBE 榜单为例:

  • Python 稳居第一,C++ 位列第二,占有率 10.03%;
  • 远超 Java、C#、Go、Rust 等语言,常年稳居主流编程语言第一梯队;
  • TIOBE 榜单反映语言市场热门程度,侧面体现企业招聘需求体量。

2. 核心就业应用领域

C++ 主打高性能、底层可控、跨平台,核心应用场景覆盖:

  1. 大型系统开发:操作系统、编译器、数据库、浏览器内核;
  2. 音视频开发:FFmpeg、WebRTC、直播 / 点播 SDK 底层均基于 C++;
  3. PC 客户端开发:基于 Qt 开发桌面软件(如 WPS、会议客户端);
  4. 高性能服务端:游戏服务器、流媒体服务、量化高频交易系统;
  5. 游戏引擎开发:UE4、Cocos2d-x 等主流游戏引擎底层均为 C++;
  6. 嵌入式开发:智能硬件、车载系统、扫地机器人、门禁、摄像头等;
  7. 机器学习底层:AI 算法底层由 C++ 实现,Python 仅做上层封装;
  8. 测试开发 / 基础架构:底层测试工具、性能分析、编译器优化岗位。

3. 招聘岗位特点

企业 C++ 岗位普遍要求:熟练 C/C++、掌握数据结构与算法、熟悉 Linux、网络协议,有 Qt / 音视频 / 嵌入式 / 游戏引擎经验优先,薪资集中在 18-30K 校招起步,高端架构岗薪资天花板极高。

五、C++ 学习难度与学习规划

1. 学习难度认知

C++ 是难学难精 的语言,学习曲线陡峭,原因在于:历史语法包袱重、兼容 C 语言、面向对象 + 泛型编程多重范式、版本迭代特性繁多。网上流传趣味梗:21 天自学精通 C++ 纯属玩笑,真正精通需要长期项目沉淀,跟着系统课程循序渐进是最高效方式。

2. 实用学习建议

  1. 必练示例代码,吃透知识点;
  2. 重点章节整理笔记 / 博客,梳理知识体系;
  3. 先掌握基础语法,再攻克 STL、数据结构,最后学习 C++11 及后续新特性。

3. 经典书籍推荐

  1. 《C++ Primer》:语法圣经,前期预习、中后期当做语法字典常备;
  2. 《STL 源码剖析》(侯捷):剖析 STL 底层实现,理解泛型与容器原理;
  3. 《Effective C++》:55 条 C++ 高效编程准则,进阶必看,工作后重读仍有新收获。

4. 官方参考文档

  1. 入门友好版:https://legacy.cplusplus.com/reference/(更新至 C++11,头文件形式易读);
  2. 中文官方文档:https://zh.cppreference.com/w/cpp
  3. 英文最新文档:https://en.cppreference.com/w/

六、C++ 入门核心语法详解

1. 第一个 C++ 程序

C++ 兼容 C 语言语法,文件后缀为 .cpp,Linux 使用 g++ 编译,Windows VS 自动调用 C++ 编译器。

兼容 C 语言写法

cpp

运行

复制代码
#include<stdio.h>
int main()
{
    printf("hello world\n");
    return 0;
}
C++ 标准 IO 写法

cpp

运行

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

int main()
{
    cout << "hello world\n" << endl;
    return 0;
}

2. 命名空间 namespace

作用

解决全局命名冲突、名字污染问题,将变量、函数、类隔离在独立作用域中。C 语言无命名空间,极易出现同名标识符编译报错。

核心特性
  1. 只能定义在全局,支持嵌套定义;
  2. 多文件中同名 namespace 会自动合并;
  3. C++ 标准库所有接口都在 std 命名空间中。
三种使用方式
  1. 指定访问(项目推荐) :csx::rand
  2. 单个成员展开using csx::rand;
  3. 全局展开(练习可用,项目不推荐)using namespace std;
cpp 复制代码
namespace csx
{
	// 命名空间中可以定义变量/函数/类型
	int rand = 10;
	int Add(int left, int right)
	{
		return left + right;
	}
	struct Node
	{
		struct Node* next;
		int val;
	};
}
int main()
{
	// 这⾥默认是访问的是全局的rand函数指针
	printf("%p\n", rand);
	// 这⾥指定csx命名空间中的rand
	printf("%d\n", csx::rand);
	return 0;
}

3. C++ 输入输出 cin/cout

  1. 头文件 <iostream> 为标准输入输出流库;
  2. cout 标准输出、cin 标准输入、endl 换行并刷新缓冲区;
  3. 优势:自动识别变量类型,无需像 printf/scanf 手动指定格式;
  4. 竞赛高速 IO 优化:

cpp

运行

复制代码
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);

4. 缺省参数(默认参数)

定义函数时给形参设置默认值,无实参调用时使用默认值。

  1. 全缺省:所有参数都有默认值;
  2. 半缺省 :部分参数有默认值,必须从右往左连续设置,不能间隔;
  3. 规则:缺省参数只能在函数声明中设置,声明和定义不能同时给;调用时必须从左往右传参。

cpp

运行

复制代码
// 半缺省
void Func2(int a, int b = 10, int c = 20);

5. 函数重载

同一作用域下同名函数,参数列表必须不同,满足以下任一即可:

  • 参数个数不同;
  • 参数类型不同;
  • 参数类型顺序不同。

⚠️ 注意:返回值不同不能作为重载依据,编译器无法区分调用;缺省参数和重载混用容易产生调用歧义。

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

// 1、参数类型不同
int Add(int left, int right)
{
cout << "int Add(int left, int right)" << endl;

return left + right;
 }

 double Add(double left, double right)
 {
 cout << "double Add(double left, double right)" << endl;

 return left + right;
 }

 // 2、参数个数不同
 void f()
 {
 cout << "f()" << endl;
 }

 void f(int a)
 {
 cout << "f(int a)" << endl;
 }

 // 3、参数类型顺序不同
 void f(int a, char b)
 {
 cout << "f(int a,char b)" << endl;
 }

 void f(char b, int a)
 {
 cout << "f(char b, int a)" << endl;
 }

 // 返回值不同不能作为重载条件,因为调⽤时也⽆法区分
 //void fxx()
 //{}
 //
 //int fxx()
 //{
 // return 0;
 //}

 // 下⾯两个函数构成重载
 // f()但是调⽤时,会报错,存在歧义,编译器不知道调⽤谁
 void f1()
 {
 cout << "f()" << endl;
 }

 void f1(int a = 10)
 {
 cout << "f(int a)" << endl;
 }

 int main()
 {
 Add(10, 20);
 Add(10.1, 20.2);

 f();
 f(10);

 f(10, 'a');
 f('a', 10);

 return 0;
 }

6. 引用

概念

引用是已存在变量的别名 ,不开辟新内存,和原变量共用同一块空间,符号 & 复用取地址符。

cpp 复制代码
//类型& 引⽤别名 = 引⽤对象
int main()
{
	int a = 0;
	// 引⽤:b和c是a的别名
	int& b = a;
	int& c = a;
	// 也可以给别名b取别名,d相当于还是a的别名
	int& d = b;

	++d;
	cout << &a << endl;
	cout << &b << endl;
	cout << &c << endl;
	cout << &d << endl;

	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
	cout << d << endl;
	return 0; 
}
核心特性
  1. 定义时必须初始化;
  2. 一个变量可拥有多个引用;
  3. 引用一旦绑定实体,不能更改指向
cpp 复制代码
#include<iostream>
using namespace std;
int main()
{
	int a = 10;
	// 编译报错:"ra": 必须初始化引⽤
	//int& ra;
	int& b = a;
	int c = 20;
	// 这⾥并⾮让b引⽤c,因为C++引⽤不能改变指向,
	// 这⾥是⼀个赋值
	b = c;
	cout << &a << endl;
	cout << &b << endl;
	cout << &c << endl;
	return 0;
}
核心用途
  1. 引用传参:替代二级指针,减少拷贝、简化代码;
  2. 引用做返回值:可修改返回值对应的原变量;
  3. const 引用:保护常量对象,适配临时对象引用(临时对象具有常性,只能用 const 引用接收)。
cpp 复制代码
#include <iostream>
int main()
{
	//const引用本身的时候权限可以缩小,但是不能放大
	const int a = 10;
	//int& ra = a;  //权限放大error
	const int& ra = a;

	int b = 20;
	//引用rb为只读属性
	const int& rb = b;
	b++;
	//rb++  //权限放大error

	//const可以给常量取别名
	const int& rc = 30;

	//引用临时对象
	const int& rd = (a+b);

	//隐式类型转换
	double d = 12.34;
	double& d1 = d;
	int i = d;//简单的赋值
	//int& i = d;//error
	const int& i1 = d;//引用临时对象,具有常性

	//间接空引用
	int* ptr = NULL;
	int& rp = *ptr;
	//rp++;//error
	
	const int& rk = a + 2;
	return 0;
}
引用 vs 指针

表格

特性 引用 指针
内存占用 不开辟空间 占用地址字节(32 位 4 字节 / 64 位 8 字节)
初始化 必须初始化 可暂不初始化
指向修改 不可改绑定 可随意改变指向
安全系数 无空引用、野引用 易出现空指针、野指针

7. 内联函数 inline

  1. 作用:编译时在调用处直接展开代码,不建立函数栈帧,提升执行效率;
  2. 定位:替代 C 语言宏函数,支持调试、类型安全;
  3. 限制:只是给编译器的建议,递归、代码冗长的函数会被忽略;
  4. 注意:内联函数不要声明和定义分离,否则会链接报错。

cpp 复制代码
#include<iostream>
using namespace std;
inline int Add(int x, int y)
{
	int ret = x + y;
	ret += 1;
	ret += 1;
	ret += 1;
	return ret;
}
int main()
{
	// 可以通过汇编观察程序是否展开
	// 有call Add语句就是没有展开,没有就是展开了
	int ret = Add(1, 2);
	cout << Add(1, 2) * 5 << endl;
	return 0;
}

#include<iostream>
using namespace std;

// 实现⼀个ADD宏函数的常⻅问题
//#define ADD(int a, int b) return a + b;
//#define ADD(a, b) a + b;
//#define ADD(a, b) (a + b)

// 正确的宏实现
 #define ADD(a, b) ((a)+(b))
 // 为什么不能加分号?
 // 为什么要加外⾯的括号?
 // 为什么要加⾥⾯的括号?

 int main()
 {
	17 int ret = ADD(1, 2);
	18
		19 cout << ADD(1, 2) << endl;
	20
		21 cout << ADD(1, 2) * 5 << endl;
	22
		23 int x = 1, y = 2;
	24 ADD(x & y, x | y); // -> (x&y+x|y)
	25
		26 return 0;
	27 }
// F.h
#include <iostream>
using namespace std;

inline void f(int i);

// F.cpp
#include "F.h"
void f(int i)
 {
1 cout << i << endl;
2 }

 // main.cpp
 #include "F.h"
 int main()
 {
	// 链接错误:⽆法解析的外部符号 "void __cdecl f(int)" (?f@@YAXH@Z)
	f(10);
	return 0;
}

总结:需要频繁调用并且空间比较小的函数,建议使用inline内敛函数。

8. nullptr 空指针

  1. C 语言 NULL 本质是宏,可能被定义为 0 或 (void*)0,函数重载时容易出现调用歧义;
  2. C++11 引入 nullptr 关键字,专门表示空指针;
  3. 特性:只能隐式转换为各类指针类型,不能转为整型,彻底解决 NULL 类型歧义问题。
cpp 复制代码
#include <iostream>
using namespace std;
void f(int x)
{
	cout << "f(int x)" << endl;
}
void f(int* x)
{
	cout << "f(int* ptr)" << endl;
}
int main()
{
	f(0);
	// 本想通过f(NULL)调⽤指针版本的f(int*)函数,但是由于NULL被定义成0,调⽤了f(intx),因此与程序的初衷相悖。
	f(NULL);
	f((int*)NULL);

	// 编译报错:error C2665: "f": 2 个重载中没有⼀个可以转换所有参数类型
    // f((void*)NULL);
	f(nullptr);
	return 0;
}

七、总结

C++ 历经四十余年发展,从贝尔实验室诞生到如今 C++23/26 持续迭代,始终牢牢占据高性能底层开发核心地位。它虽然入门门槛高于 Python、Java,但就业薪资、技术天花板、职业生命周期都极具优势。

入门阶段无需急于啃高深特性,先吃透命名空间、IO 流、缺省参数、函数重载、引用、inline、nullptr 七大基础语法,再循序渐进学习面向对象、STL、数据结构,就能平稳迈入 C++ 开发大门。后续深耕游戏、音视频、嵌入式、服务端任一赛道,都能成为稀缺高端技术人才。

相关推荐
程序leo源11 小时前
Qt界面优化详解
linux·c语言·开发语言·c++·qt·c#
沙糖桔4511 小时前
多端协同系统中共享资源分配的状态一致性设计
java·开发语言
csbysj202011 小时前
SQLite 删除表
开发语言
咔咔库奇11 小时前
js-执行上下文
开发语言·前端·javascript
一只QAQ11 小时前
c++小巧思
c++·笔记·学习
Land032911 小时前
RPA替代方案:离线部署与Python扩展实战
开发语言·python·rpa
郝学胜-神的一滴11 小时前
Qt 高级开发 017:中文乱码
开发语言·c++·qt·程序人生·用户界面
周杰伦fans12 小时前
C# LINQ 排序详解 —— OrderBy / OrderByDescending / ThenBy / ThenByDescending
开发语言·c#·linq
晚风予卿云月12 小时前
【模拟】多项式输出 & 蛇形方阵 & 字符串展开
c++·算法·模拟算法·随笔·竞赛练习