MST

星途 面试题库

面试题:C++不允许重载运算符与程序设计

假设你正在开发一个图形库,在设计类体系时,考虑到C++中不允许重载的五个运算符,如何合理地设计类的接口和行为,避免因试图重载不允许的运算符而带来的问题?以实现一个简单的二维点类和二维向量类为例进行阐述,并说明在类的运算操作设计上如何规避使用不允许重载的运算符。
29.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. C++中不允许重载的五个运算符

    • . 成员访问运算符:用于访问类的成员,其语义非常明确且基础,重载会破坏其在访问类成员时的直观性和确定性。
    • .* 成员指针访问运算符:与 . 类似,用于通过成员指针访问类成员,重载会混淆其原本清晰的语义。
    • :: 作用域解析运算符:用于指定标识符所属的命名空间或类作用域,重载会改变其在程序结构和命名空间管理中的重要功能。
    • ?: 条件运算符:它是一个三元运算符,具有独特的语法和语义,重载会破坏其简洁高效的条件判断逻辑。
    • sizeof 运算符:用于获取类型或变量的大小,其结果依赖于编译时的类型信息,重载会违背其基于类型系统的固定行为。
  2. 二维点类设计

    • 定义类
class Point2D {
private:
    double x;
    double y;
public:
    Point2D(double xVal = 0.0, double yVal = 0.0) : x(xVal), y(yVal) {}

    // 获取x坐标
    double getX() const {
        return x;
    }

    // 获取y坐标
    double getY() const {
        return y;
    }

    // 移动点
    void move(double newX, double newY) {
        x = newX;
        y = newY;
    }
};
  • 避免重载不允许的运算符
    • 因为不能重载 . 运算符,所以对于成员访问采用常规的成员函数来获取和修改数据成员。例如,通过 getX()getY() 函数获取坐标值,通过 move() 函数修改坐标值,而不是试图重载 . 来实现这些操作。
  1. 二维向量类设计
    • 定义类
class Vector2D {
private:
    double x;
    double y;
public:
    Vector2D(double xVal = 0.0, double yVal = 0.0) : x(xVal), y(yVal) {}

    // 获取x分量
    double getX() const {
        return x;
    }

    // 获取y分量
    double getY() const {
        return y;
    }

    // 向量加法
    Vector2D operator+(const Vector2D& other) const {
        return Vector2D(x + other.x, y + other.y);
    }

    // 向量数乘
    Vector2D operator*(double scalar) const {
        return Vector2D(x * scalar, y * scalar);
    }
};
  • 避免重载不允许的运算符
    • 在向量的运算操作设计上,例如向量加法 operator+ 和向量数乘 operator*,使用允许重载的运算符来实现常见的向量运算。避免使用不允许重载的运算符,比如不会试图通过重载 . 来直接操作向量的分量,而是通过成员函数 getX()getY() 来访问分量,并且通过合理重载 +* 来实现向量的基本运算,而不是使用 ?: 等不允许重载的运算符来构建运算逻辑。同时,也不会去尝试重载 sizeof 来改变向量类大小获取的行为,向量类大小由其数据成员自然决定。