1 C++ 简介
1.1 起源
C++ 诞生于贝尔实验室 ,1979 年开始研发,最初被称为带类的 C,1983 年正式更名为 C++,是在 C 语言基础上扩展面向对象特性的编程语言。
1.2 应用范围
C++ 是高性能通用编程语言,应用场景覆盖:
- 桌面软件:文字处理、电子表格
- 底层开发:编译器、操作系统内核
- 娱乐领域:大型 3D 游戏、游戏引擎
- 工业 / 嵌入式:工控软件、嵌入式系统
1.3 C++ 与 C 的区别
- C 语言:面向过程,结构化、模块化设计,专注流程实现
- C++:兼容 C 所有特性 ,新增面向对象机制(类、继承、多态等),兼顾过程式与面向对象编程
2 常用 C++ 开发工具
根据学习阶段和场景选择,新手推荐轻量化工具,进阶用专业 IDE:
| 工具 | 特点 | 适用场景 |
|---|---|---|
| 记事本 / Notepad++ + 命令行 | 极简、无依赖 | 理解编译链接原理 |
| Visual C++ 6.0 | 经典老工具 | 兼容旧项目,新系统有兼容性问题 |
| Visual Studio 2015+ | 功能强大、生态完整 | 企业级开发、大型项目 |
| Code::Blocks | 开源免费、轻量 | 专业开发者、新手入门 |
| 其他 | Dev-C++、CLion、Xcode、C4droid | 跨平台 / 移动端开发 |
3 C++ 基本语法
3.1 核心概念
- 对象:类的实例,拥有状态和行为
- 类:对象的模板,定义对象的属性(状态)和方法(行为)
- 方法:类的行为实现,一个类可包含多个方法
- 变量:存储数据的标识符
3.2 注释
C++ 支持两种注释,用于代码说明:
// 单行注释:双斜杠开头,注释一行内容
/*
多行注释:斜杠星号开头,星号斜杠结尾
可注释多行内容
*/
3.3 关键字
C++ 保留关键字共 63 个,不能用作标识符 ,常用关键字如下: asm else new this auto enum operator throw bool explicit private true break export protected try case extern public typedef 等。
3.4 标识符
标识符用于命名变量、函数、类等,命名规则:
- 开头:字母(A-Z/a-z)、下划线
_ - 后续:字母、下划线、数字(0-9)
- 禁止:标点符号(@、&、%)
- 区分大小写:
Name和name是两个不同标识符
4 数据类型
4.1 基本数据类型
C++ 有7 种基本数据类型 ,搭配类型修饰符(signed/unsigned/short/long)扩展:
表格
| 类型 | 占用字节(64 位 Win10+VS2015) | 数值范围 |
|---|---|---|
| bool | 1 | true/false |
| char | 1 | -128~127 |
| short | 2 | -32768~32767 |
| int | 4 | -2147483648~2147483647 |
| long | 4 | 同 int |
| long long | 8 | -9e18~9e18 |
| float | 4 | -3.4e38~3.4e38 |
| double | 8 | -1.7e308~1.7e308 |
| unsigned char | 1 | 0~255 |
| unsigned int | 4 | 0~4294967295 |
测试代码:查看数据类型大小
#include namespace std;
int main() {
cout << sizeof(bool) <
cout <) << " " <(short) < << sizeof(int) <;
cout <(float) << " " << sizeof(double) <
system("pause");
return 0;
}
4.2 类型大小与系统的关系
数据类型占用字节受机器、操作系统、编译器影响:
- 16 位系统:int 占 2 字节
- 32 位系统:int 占 4 字节
- 64 位系统:VS 中 long 占 4 字节,GCC 中 long 占 8 字节
4.3 typedef 声明
为已有类型取别名,简化代码:
// 语法:typedef 原类型 新名称
typedef int feet;
feet distance; // 等价于 int distance;
4.4 枚举类型
用户定义的整型派生类型,用于限定变量取值范围:
// 定义枚举
enum course {math, chinese, english=1, physics, chemistry};
// 默认:math=0, chinese=1, english=1, physics=2, chemistry=3
int main() {
enum course c = english;
cout << c << endl; // 输出1
return 0;
}
5 变量
变量是程序可操作的存储区名称,类型决定存储大小和取值范围。
5.1 变量的声明与定义
-
声明 :告诉编译器变量存在,不分配内存 ,用
extern关键字 -
定义 :分配内存,可多次声明,只能定义一次
// 变量声明
extern int a, b;
int main() {
// 变量定义
int a, b;
a = 23;
b = 25;
return 0;
}
错误赋值:int x = y = z = 66; 正确赋值:int x=3, y=3, z=3; 或 x = y = z;
5.2 变量作用域
-
局部变量 :函数 / 代码块内部,仅内部可访问,不自动初始化
-
全局变量 :函数外部,整个程序生命周期有效,系统自动初始化(int=0,char='\0',指针 = NULL)
int i = 66; // 全局变量
int main() {
int i = 88; // 局部变量,覆盖全局变量
cout << i <; // 输出88
return 0;
}
6 运算符
C++ 运算符分为 6 大类,优先级决定运算顺序(结合性:从左到右 / 从右到左):
6.1 运算符分类
- 算术运算符 :
+-*/%++-- - 关系运算符 :
==!=<=>= - 逻辑运算符 :
&&||! - 位运算符 :
&|^~`< - 赋值运算符 :
=+=-=*=/=等 - 杂项运算符 :
sizeof?:,.->强制转换、指针&/*
6.2 运算符优先级(从高到低)
后缀运算符 → 一元运算符 → 乘除 → 加减 → 移位 → 关系 → 相等 → 位运算 → 逻辑运算 → 条件 → 赋值 → 逗号
7 流程控制语法
7.1 循环结构
while 循环
while(条件) { // 0为false,非0为true
循环体;
}
for 循环(C++11 增强 for)
// 普通for
for(初始化; 条件; 增量) { 循环体; }
// C++11范围for
int array[5] = {11,22,33,44,55};
for(int x : array) { cout < <(auto x : array) { cout << x < } // auto自动推导类型
7.2 判断结构
if-else 判断
if(条件1) { 语句1; }
else if(条件2) { 语句2; }
else { 语句3; }
switch 判断
switch(表达式) {
case 常量1: 语句1; break;
case 常量2: 语句2; break;
default: 默认语句;
}
注意:case无break会穿透执行 ,多个case可共用语句。
7.3 三元运算符
// 条件?真执行:假执行
int a = 10, b = 20;
int max = a > b ? a : b; // max=20
7.4 预处理命令
编译前执行的命令,包括宏定义、文件包含、条件编译:
// 宏定义
#define PI 3.14
// 文件包含
#include 条件编译
#ifdef DEBUG
cout <模式" <#else
cout <发布模式" <
#endif
8 数组
数组是相同类型数据的集合,用下标访问(下标从 0 开始)。
8.1 一维数组
// 定义+初始化
int arr1[4] = {1,2,3,4};
int arr2[4] = {1,2}; // 未赋值元素默认为0
int arr3[] = {1,2,3}; // 自动推导长度
// 访问:arr[下标]
cout <1[0]; // 输出1
8.2 二维数组
// 定义+初始化
int arr[2][3] = {{1,2,3},{4,5,6}};
int arr2[][3] = {1,2,3,4,5,6}; // 可省略第一维长度
// 访问:arr[行下标][列下标]
cout << arr[0][1]; // 输出2
8.3 字符数组(C 风格字符串)
以\0结尾的 char 数组,是 C++ 字符串的基础:
char str[] = "hello"; // 等价于 {'h','e','l','l','o','\0'}
cout < 输出hello
8.4 动态数组(new/delete)
// 一维动态数组
int* arr = new int[3]{1,2,3};
delete[] arr; // 释放内存
// 二维动态数组
int m=2, n=3;
int** arr2 = new int*[m];
for(int i=0; i<m; i++) arr2[i] = new int[n];
8.5 数组与函数
数组传参本质是传首地址:
// 一维数组传参
void fun(int arr[], int len) {}
// 二维数组传参(必须指定第二维长度)
void fun2(int arr[][3], int len) {}
8.6 获取数组大小
int arr[5];
// 方法1
int len = sizeof(arr)/sizeof(arr[0]);
// 方法2
int len2 = end(arr) - begin(arr);
9 函数
函数是模块化编程的核心 ,C++ 程序有且仅有一个main主函数。
9.1 函数声明与定义
-
声明:告诉编译器函数存在,参数名可省略
-
定义:实现函数功能
// 函数声明
int max(int a, int b);
// 函数定义
int max(int a, int b) {
return a > b ? a : b;
}
9.2 参数传递方式
-
传值:形参修改不影响实参
-
传指针:形参修改影响实参
-
传引用:形参修改影响实参(C++ 特色)
// 传引用
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
9.3 函数特性
- 默认参数 :
int sum(int a, int b=2) {return a+b;} - 嵌套调用:函数内调用其他函数
- 递归调用:函数调用自身(需有终止条件)
- 函数重载 :同名函数,参数类型 / 个数不同
- 内联函数 :
inline关键字,编译时嵌入主函数,减少调用开销
10 字符串(string)
C++ 支持C 风格字符数组 和STL string 类,推荐用 string 更安全便捷。
10.1 C 风格字符串
基于 char 数组,依赖\0结束,需用<cstring>库函数操作:
char str1[10] = "abc";
strcat(str1, "def"); // 拼接
strcpy(str1, "hello"); // 复制
strcmp(str1, "hello"); // 比较
strlen(str1); // 长度(不含\0)
10.2 C++ string 类
`,支持直接赋值、拼接、比较:
#include string str1 = "Hello";
string str2 = "C++";
string str3 = str1 + " " + str2; // 拼接
cout << str3.size(); // 获取长度
cout <.substr(0,5); // 截取子串
11 指针和引用
11.1 指针
指针是存储变量地址的变量 ,*表示指针,&表示取地址:
int a = 10;
int* p = &a; // p存储a的地址
cout <解引用,输出a的值10
// 指针运算:p+1 移动sizeof(类型)字节
指针与数组
数组名是首地址常量:
int arr[3] = {1,2,3};
int* p = arr;
cout <1); // 等价于arr[1],输出2
new/delete 动态内存
int* p = new int(10); // 分配单个变量
delete p;
int* arr = new int[3]; // 分配数组
delete[] arr;
11.2 引用
引用是变量的别名,不占内存,定义时必须初始化:
int a = 10;
int& b = a; // b是a的引用
b = 20; // 修改b等价于修改a
cout <输出20
引用作为函数返回值时,不能返回局部变量引用。
12 自定义数据类型
12.1 结构体(struct)
可包含不同类型成员的自定义类型:
struct Person {
string name;
int age;
};
// 定义+初始化
Person p = {"张三", 20};
cout <访问成员
12.2 字节对齐
结构体占用空间按字节对齐规则分配,提升内存访问效率。
13 面向对象(核心)
C++ 是面向对象编程语言 ,三大特性:封装、继承、多态。
13.1 类与对象
-
类:抽象模板,定义属性和方法
-
对象:类的实例
class Student {
private: // 私有成员,仅类内访问
string name;
int age;
public: // 公有成员,外部可访问
// 构造函数
Student(string n, int a) {
name = n;
age = a;
}
// 成员函数
void show() {
cout << name << " " <;
}
};
// 创建对象
Student s("李四", 18);
s.show();
13.2 继承
派生类继承基类成员,减少代码冗余:
// 基类
class Animal {
public:
void eat() { cout <" <};
// 派生类:公有继承
class Dog : public Animal {
public:
void bark() { cout <" <};
// 使用
Dog d;
d.eat(); // 继承基类方法
d.bark();
13.3 多继承与虚基类
-
多继承:一个类继承多个基类
-
虚基类:
virtual继承,解决多继承二义性,仅保留一份基类成员class A { /* ... / };
class B : virtual public A { / ... / };
class C : virtual public A { / ... / };
class D : public B, public C { / ... */ };
14 多态和虚函数
14.1 向上转型
派生类对象 / 指针 / 引用赋值给基类,仅能访问基类成员。
14.2 虚函数
用virtual声明,实现动态多态,运行时确定调用函数:
class Base {
public:
virtual void show() { cout < <
class Derive : public Base {
public:
void show() { cout << "派生类" << endl; }
};
int main() {
Base* p = new Derive();
p->show(); // 输出派生类(多态)
delete p;
return 0;
}
14.3 纯虚函数与抽象类
- 纯虚函数:
virtual void show() = 0; - 抽象类:包含纯虚函数,不能创建对象,仅作为基类使用
15 运算符重载
赋予运算符自定义功能,本质是函数重载:
class Vector {
public:
int x, y;
Vector(int x=0, int y=0) : x(x), y(y) {}
// 重载+运算符
Vector operator+(const Vector& v) {
return Vector(x+v.x, y+v.y);
}
};
int main() {
Vector v1(1,2), v2(3,4);
Vector v3 = v1 + v2;
cout < << " " <.y; // 输出4 6
return 0;
}
不能重载的运算符:. .* :: sizeof ?:
16 IO 流与文件操作
16.1 标准 IO 流
-
cin:标准输入(键盘) -
cout:标准输出(屏幕) -
cerr/clog:错误输出#include std;
int main() {
int a;
cin >> a; // 输入
cout < << a < 输出
return 0;
}
16.2 文件操作
C++ 用fstream库操作文件,支持文本文件 和二进制文件:
#include // 写入文件
ofstream out("test.txt");
out <++";
out.close();
// 读取文件
ifstream in("test.txt");
string str;
in >> str;
cout <();
17 泛型与模板
模板是泛型编程 的核心,实现代码复用,支持函数模板和类模板。
17.1 函数模板
template<class T> // T为泛型类型
T max(T a, T b) {
return a > b ? a : b;
}
int main() {
cout << max(1,2); // int类型
cout <,2.2); // double类型
return 0;
}
17.2 类模板
template
class Box {
private:
T data;
public:
Box(T d) : data(d) {}
T getData() { return data; }
};
int main() {
Box b(10);
cout <
return 0;
}
18 命名空间与异常处理
18.1 命名空间
解决命名冲突 ,C++ 标准库都在std命名空间:
namespace MySpace {
int a = 10;
void fun() { cout <自定义空间" < }
}
// 使用
using namespace MySpace; // 引入整个空间
cout <
### 18.2 异常处理
`try`检查异常,`throw`抛出异常,`catch`捕获异常:
```cpp
try {
throw 10; // 抛出int类型异常
} catch(int e) {
cout <捕获异常:" <;
} catch(...) { // 捕获所有异常
cout <异常";
}
19 STL 标准模板库
STL 是 C++通用数据结构与算法集合,核心三大组件:
19.1 容器
- 顺序容器:
vector(动态数组)、deque、list - 关联容器:
set、map、multimap - 容器适配器:
stack、queue、priority_queue
19.2 迭代器
遍历容器的指针 - like工具:
vector = {1,2,3};
vectoriterator it;
for(it = v.begin(); it != v.end(); it++) {
cout < <```
### 19.3 算法
STL提供70+通用算法(`#include <algorithm>`):
```cpp
#include
vector {3,1,2};
sort(v.begin(), v.end()); // 排序
find(v.begin(), v.end(), 2); // 查找
总结
本文覆盖 C++入门到进阶所有核心知识点,从基础语法到面向对象、模板、STL,搭配可直接运行的代码示例,适合新手系统学习。
C++ 学习建议:
- 先掌握语法和基础数据类型,多写简单程序
- 深入理解指针、引用、面向对象三大特性
- 熟练使用 STL 容器和算法,提升开发效率
- 结合项目实践,巩固知识点