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