MST

星途 面试题库

面试题:C++中不允许重载的运算符相关基础应用

请简要描述C++中不允许重载的五个运算符是什么,并说明为什么其中的 '.' 运算符不允许重载。同时,给出一个简单代码示例,展示其他可重载运算符(如 '+') 的重载用法。
35.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. C++ 中不允许重载的五个运算符
    • .(成员访问运算符):它用于访问对象的成员,重载会破坏对象成员访问的语义和直观性,使得代码逻辑变得混乱。
    • .*(成员指针访问运算符):用于通过指向成员的指针访问对象成员,重载会干扰这种特定的指针 - 成员访问机制。
    • ::(作用域解析运算符):用于限定命名空间或类的作用域,重载会破坏作用域解析的基本规则和意义。
    • ?:(条件运算符):它是一个三元运算符,有独特的语法和语义,重载会使语言的逻辑和优先级规则变得复杂且难以理解。
    • sizeof(获取对象大小运算符):它的结果在编译时就确定了,重载它没有实际意义,因为对象大小是由类型决定的,在编译期就已经明确。
  2. ‘.’ 运算符不允许重载的原因
    • 语义破坏:“.”运算符在C++ 中用于访问对象的成员,其语义是非常明确和基础的。如果重载它,会导致原本直观的对象成员访问变得不直观,例如 obj.member 这样清晰的访问形式可能会因为重载而改变含义,使得代码难以理解和维护。
    • 安全性问题:重载可能会破坏对象成员访问的安全性,因为C++ 通过“.”运算符保证对对象成员的直接访问遵循一定的访问控制规则(如 publicprivateprotected),重载可能绕过这些规则。
  3. ‘+’ 运算符重载示例代码
#include <iostream>

class Point {
public:
    int x;
    int y;

    Point(int a = 0, int b = 0) : x(a), y(b) {}

    // 重载 '+' 运算符
    Point operator+(const Point& other) {
        return Point(x + other.x, y + other.y);
    }
};

int main() {
    Point p1(1, 2);
    Point p2(3, 4);
    Point result = p1 + p2;
    std::cout << "Result x: " << result.x << ", Result y: " << result.y << std::endl;
    return 0;
}

在上述代码中,定义了 Point 类,并在类中重载了 + 运算符,使得 Point 对象可以像普通数值类型一样进行加法运算。