学习资料
InfiniTensor冬季训练营实践编程基础课第三课《C++实践3》
发表于:

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++高级特性,并引入更多实际案例。

📚 训练营报名持续进行中

扫码报名与加入群聊,或点击 「阅读原文」 直达官网报名