面试题答案
一键面试- 不允许重载的运算符:
.
成员访问运算符.*
成员指针访问运算符::
作用域解析运算符?:
条件运算符sizeof
求类型大小运算符
- 设计初衷:
- 保证运算符基本语义:这些运算符对于语言的核心结构和基本语义至关重要,重载它们可能会导致代码的语义模糊不清,破坏程序的可读性和可维护性。例如
.
运算符用于访问对象的成员,若重载它,会使对象成员访问的基本概念变得混乱。 - 保持语言的一致性和稳定性:语言需要有一些不可改变的基本规则,若这些运算符可重载,会使语言的行为过于灵活,增加编程错误的可能性,也不利于编译器的实现和优化。
- 保证运算符基本语义:这些运算符对于语言的核心结构和基本语义至关重要,重载它们可能会导致代码的语义模糊不清,破坏程序的可读性和可维护性。例如
- 示例 - 不允许重载
.
运算符的合理性: 假设我们有如下代码:
在这个代码中,使用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; }
.
运算符的合理性体现。