
1月6日,2025冬季 InfiniTensor 大模型与人工智能系统训练营编程基础课第三课开讲,课程主题为《C++实践3》。
本节课引入动态容量(capacity)概念,支持变长数组、实现动态内存分配(new/delete)、封装为Vector类、引入RAII(资源获取即初始化)、介绍运算符重载与模板类(Template)。
动态容量与变长数组
1. 问题引入
- 固定大小的数组局限性(如
size=3无法存储更多元素) - 变长数组(VLA)在
C++中的不支持性
2. 解决方案:动态内存分配
- 使用
new/new[]动态分配堆内存:
data = new double[capacity]; // 动态分配capacity大小的数组
- 初始化时设置初始容量(如
capacity=16),size=0
3. 关键操作:push_back
- 功能:向数组末尾添加元素
void push_back(double elem) {
if (size < capacity) {
data[size] = elem;
size++;
}
}
内存管理与RAII
1. 内存分区概念
- 栈(Stack):局部变量存储,自动管理,大小有限
- 堆(Heap):动态内存分配,手动管理,空间较大
2. 动态内存的释放
- 问题:未释放
new[]分配的内存导致泄漏 - 解决方案:在析构函数中
delete[] data
3. RAII设计模式
- 构造函数(Constructor):初始化资源(分配内存)
- 析构函数(Destructor):释放资源(释放内存)
class Vector {
private:
double* data;
size_t size;
size_t capacity;
public:
Vector() : capacity(16), size(0) {
data = new double[capacity];
}
~Vector() { delete[] data; }
};
3. 访问控制:public与private
- private:内部实现细节,外部不可访问
- public:对外接口,外部可访问
运算符重载与封装
1. 下标运算符重载
operator[]实现数组式访问:
double operator[](size_t index) const {
return data[index];
}
2. 常量成员函数
- 标记不修改对象状态的函数为
const(如operator[]):
double operator[](size_t index) const; // 声明为const函数
3. 方法封装
- 提供
size()和capacity()方法替代直接访问成员变量:
size_t size() const { return size; }
size_t get_capacity() const { return capacity; }
模块化与头文件分离
1. 头文件(.h)与源文件(.cpp)
- 头文件声明类与接口:
// Vector.h
class Vector {
public:
Vector();
~Vector();
void push_back(double elem);
double operator[](size_t index) const;
size_t size() const;
private:
double* data;
size_t size;
size_t capacity;
};
- 源文件实现细节:
// Vector.cpp
#include "Vector.h"
Vector::Vector() { /* ... */ }
Vector::~Vector() { /* ... */ }
2. 编译与链接
- 编译多文件项目:
g++ main.cpp Vector.cpp -o main
模板类(Template)
1. 泛型编程需求
- 问题:当前Vector仅支持double类型
- 目标:支持任意类型(如int、string)
2. 模板类实现
- 定义模板参数T:
template <typename T>
class Vector {
private:
T* data;
size_t size;
size_t capacity;
public:
Vector() : capacity(16), size(0) {
data = new T[capacity];
}
void push_back(T elem) { /* ... */ }
T operator[](size_t index) const { /* ... */ }
};
3. 使用模板类
实例化模板类:
Vector<int> int_vec; // 存储int类型
Vector<string> str_vec; // 存储string类型
总结与展望
本节主要讲解了动态内存分配与RAII设计模式,运算符重载与访问控制,模块化编程与模板类。后续课程将继续深入讲解C++高级特性,并引入更多实际案例。

📚 训练营报名持续进行中
扫码报名与加入群聊,或点击 「阅读原文」 直达官网报名
