MST

星途 面试题库

面试题:C++头文件中类模板声明的复杂应用

假设你要在头文件中声明一个类模板,该模板用于实现一个通用的智能指针类。需要考虑内存管理、引用计数、复制构造函数、赋值运算符重载等功能。请写出该类模板声明的关键代码片段,并解释每个部分的作用。
34.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
template <typename T>
class SmartPtr {
private:
    T* ptr; // 指向实际对象的指针
    int* refCount; // 引用计数

public:
    // 构造函数
    SmartPtr(T* p = nullptr) : ptr(p) {
        if (ptr) {
            refCount = new int(1);
        } else {
            refCount = new int(0);
        }
    }

    // 复制构造函数
    SmartPtr(const SmartPtr& other) : ptr(other.ptr), refCount(other.refCount) {
        if (ptr) {
            (*refCount)++;
        }
    }

    // 赋值运算符重载
    SmartPtr& operator=(const SmartPtr& other) {
        if (this == &other) {
            return *this;
        }
        if (ptr && --(*refCount) == 0) {
            delete ptr;
            delete refCount;
        }
        ptr = other.ptr;
        refCount = other.refCount;
        if (ptr) {
            (*refCount)++;
        }
        return *this;
    }

    // 析构函数
    ~SmartPtr() {
        if (ptr && --(*refCount) == 0) {
            delete ptr;
            delete refCount;
        }
    }

    // 获取指向对象的指针
    T* get() const {
        return ptr;
    }

    // 解引用操作符重载
    T& operator*() const {
        return *ptr;
    }

    // 箭头操作符重载
    T* operator->() const {
        return ptr;
    }
};
  1. 模板参数template <typename T> 定义了一个模板参数 T,表示智能指针指向的对象类型。
  2. 私有成员
    • T* ptr:指向实际对象的指针。
    • int* refCount:指向引用计数的指针,用于记录有多少个智能指针指向同一个对象。
  3. 构造函数
    • SmartPtr(T* p = nullptr):初始化智能指针,若传入指针 p,则分配一个新的引用计数并初始化为1;否则初始化为0。
  4. 复制构造函数
    • SmartPtr(const SmartPtr& other):复制另一个智能指针,同时增加引用计数。
  5. 赋值运算符重载
    • SmartPtr& operator=(const SmartPtr& other):首先检查自赋值,然后减少当前对象的引用计数并处理内存释放,再复制另一个智能指针并增加引用计数。
  6. 析构函数
    • ~SmartPtr():减少引用计数,当引用计数为0时,释放指向的对象和引用计数本身。
  7. 辅助函数
    • T* get() const:返回指向对象的指针。
    • T& operator*() const:重载解引用操作符,返回指向对象的值。
    • T* operator->() const:重载箭头操作符,用于访问对象的成员。