MST

星途 面试题库

面试题:C++运算符重载在模板类中的综合应用

设计一个模板类Vector,用于表示N维向量。使用运算符重载实现向量的加法、减法以及向量与标量的乘法。要求使用成员函数、友元函数两种方式分别实现部分运算符重载,并且考虑不同数据类型(如整数、浮点数等)在运算过程中的类型转换和精度问题,最后编写测试代码验证重载运算符的正确性。
28.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <type_traits>

// 模板类Vector
template <typename T, size_t N>
class Vector {
private:
    T data[N];

public:
    // 构造函数
    Vector() {
        for (size_t i = 0; i < N; ++i) {
            data[i] = T();
        }
    }

    // 带参数的构造函数
    template <typename... Args>
    Vector(T first, Args... args) : data{first, args...} {}

    // 成员函数实现向量加法
    Vector<T, N> operator+(const Vector<T, N>& other) const {
        Vector<T, N> result;
        for (size_t i = 0; i < N; ++i) {
            result.data[i] = data[i] + other.data[i];
        }
        return result;
    }

    // 成员函数实现向量减法
    Vector<T, N> operator-(const Vector<T, N>& other) const {
        Vector<T, N> result;
        for (size_t i = 0; i < N; ++i) {
            result.data[i] = data[i] - other.data[i];
        }
        return result;
    }

    // 友元函数实现向量与标量的乘法
    template <typename U>
    friend Vector<typename std::common_type<T, U>::type, N> operator*(const Vector<T, N>& vec, U scalar);

    // 友元函数实现向量与标量的乘法
    template <typename U>
    friend Vector<typename std::common_type<T, U>::type, N> operator*(U scalar, const Vector<T, N>& vec);

    // 获取向量元素
    T operator[](size_t index) const {
        return data[index];
    }

    // 设置向量元素
    T& operator[](size_t index) {
        return data[index];
    }
};

// 友元函数实现向量与标量的乘法
template <typename T, size_t N>
template <typename U>
Vector<typename std::common_type<T, U>::type, N> operator*(const Vector<T, N>& vec, U scalar) {
    using result_type = typename std::common_type<T, U>::type;
    Vector<result_type, N> result;
    for (size_t i = 0; i < N; ++i) {
        result[i] = static_cast<result_type>(vec[i]) * scalar;
    }
    return result;
}

// 友元函数实现向量与标量的乘法
template <typename T, size_t N>
template <typename U>
Vector<typename std::common_type<T, U>::type, N> operator*(U scalar, const Vector<T, N>& vec) {
    return vec * scalar;
}

// 测试代码
int main() {
    Vector<int, 3> v1(1, 2, 3);
    Vector<int, 3> v2(4, 5, 6);
    Vector<int, 3> v_add = v1 + v2;
    Vector<int, 3> v_sub = v1 - v2;
    Vector<double, 3> v_mul1 = v1 * 2.5;
    Vector<double, 3> v_mul2 = 2.5 * v1;

    std::cout << "向量加法结果: ";
    for (size_t i = 0; i < 3; ++i) {
        std::cout << v_add[i] << " ";
    }
    std::cout << std::endl;

    std::cout << "向量减法结果: ";
    for (size_t i = 0; i < 3; ++i) {
        std::cout << v_sub[i] << " ";
    }
    std::cout << std::endl;

    std::cout << "向量与标量乘法结果1: ";
    for (size_t i = 0; i < 3; ++i) {
        std::cout << v_mul1[i] << " ";
    }
    std::cout << std::endl;

    std::cout << "向量与标量乘法结果2: ";
    for (size_t i = 0; i < 3; ++i) {
        std::cout << v_mul2[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}
  1. 模板类定义template <typename T, size_t N> 定义了一个模板类 Vector,其中 T 表示向量元素的数据类型,N 表示向量的维度。
  2. 成员函数实现向量加法和减法operator+operator- 分别实现了向量的加法和减法,返回一个新的向量。
  3. 友元函数实现向量与标量的乘法operator* 友元函数实现了向量与标量的乘法,考虑了类型转换,返回一个新的向量。
  4. 测试代码:在 main 函数中,创建了几个向量,并对其进行加法、减法和乘法运算,验证重载运算符的正确性。