MST

星途 面试题库

面试题:C++运算符重载三种方式在多态和模板编程中的综合应用

在C++的多态和模板编程环境下,假设有一个模板类Container,它可以存储不同类型的数据,并且需要重载一些运算符,如 '+=' 用于合并两个Container对象。要求结合运算符重载的三种方式,考虑如何在保证类型安全和多态特性的前提下,高效地实现这些运算符重载,详细说明设计思路并给出关键代码片段。
34.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 成员函数重载:在Container模板类内部定义operator +=成员函数。这种方式直接操作类的成员变量,对于类型安全和多态特性的保证依赖于模板参数的一致性,即两个Container对象的模板参数类型必须相同。
  2. 友元函数重载:定义一个友元函数来重载operator +=。友元函数可以访问类的私有成员,在类型安全方面同样依赖模板参数的一致性,并且可以通过模板参数实现多态。
  3. 普通非成员函数重载:在类外部定义非成员函数来重载operator +=。这种方式同样依赖模板参数保证类型安全,并且能通过模板和虚函数机制实现多态。

关键代码片段

// 模板类定义
template <typename T>
class Container {
private:
    // 假设这里有存储数据的成员变量,例如std::vector<T> data;
    std::vector<T> data;
public:
    // 成员函数重载operator +=
    Container<T>& operator+=(const Container<T>& other) {
        for (const auto& element : other.data) {
            data.push_back(element);
        }
        return *this;
    }

    // 友元函数声明
    template <typename U>
    friend Container<U>& operator+=(Container<U>& lhs, const Container<U>& rhs);
};

// 友元函数定义
template <typename T>
Container<T>& operator+=(Container<T>& lhs, const Container<T>& rhs) {
    for (const auto& element : rhs.data) {
        lhs.data.push_back(element);
    }
    return lhs;
}

// 普通非成员函数重载
template <typename T>
Container<T>& operator+=(Container<T>& lhs, const Container<T>& rhs) {
    for (const auto& element : rhs.data) {
        lhs.data.push_back(element);
    }
    return lhs;
}