MST

星途 面试题库

面试题:C++中不允许重载某些运算符的原因及示例

请简要阐述C++不允许重载哪些运算符,并说明其设计初衷。同时,给出至少一个不允许重载运算符在实际编程场景中的体现示例,比如为什么不允许重载.运算符在特定代码结构下的合理性。
21.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 不允许重载的运算符
    • . 成员访问运算符
    • .* 成员指针访问运算符
    • :: 作用域解析运算符
    • ?: 条件运算符
    • sizeof 求类型大小运算符
  2. 设计初衷
    • 保证运算符基本语义:这些运算符对于语言的核心结构和基本语义至关重要,重载它们可能会导致代码的语义模糊不清,破坏程序的可读性和可维护性。例如 . 运算符用于访问对象的成员,若重载它,会使对象成员访问的基本概念变得混乱。
    • 保持语言的一致性和稳定性:语言需要有一些不可改变的基本规则,若这些运算符可重载,会使语言的行为过于灵活,增加编程错误的可能性,也不利于编译器的实现和优化。
  3. 示例 - 不允许重载 . 运算符的合理性: 假设我们有如下代码:
    class MyClass {
    public:
        int data;
    };
    int main() {
        MyClass obj;
        obj.data = 10;
        return 0;
    }
    
    在这个代码中,使用 . 运算符清晰地访问了 obj 对象的 data 成员。如果 . 运算符可以重载,那么可能会出现这样的情况:
    class MyClass {
    public:
        int data;
        // 假设可以重载.运算符,这里只是假设的错误情况
        int operator.(const char* memberName) {
            if (strcmp(memberName, "data") == 0) {
                return data;
            }
            return -1;
        }
    };
    int main() {
        MyClass obj;
        // 这里的语义就变得模糊不清了
        int value = obj."data";
        return 0;
    }
    
    这种重载会让原本清晰的对象成员访问变得复杂且难以理解,破坏了代码的直观性和可维护性,这就是不允许重载 . 运算符的合理性体现。