面试题答案
一键面试-
C++中不允许重载的五个运算符
.
成员访问运算符:用于访问类的成员,其语义非常明确且基础,重载会破坏其在访问类成员时的直观性和确定性。.*
成员指针访问运算符:与.
类似,用于通过成员指针访问类成员,重载会混淆其原本清晰的语义。::
作用域解析运算符:用于指定标识符所属的命名空间或类作用域,重载会改变其在程序结构和命名空间管理中的重要功能。?:
条件运算符:它是一个三元运算符,具有独特的语法和语义,重载会破坏其简洁高效的条件判断逻辑。sizeof
运算符:用于获取类型或变量的大小,其结果依赖于编译时的类型信息,重载会违背其基于类型系统的固定行为。
-
二维点类设计
- 定义类
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()
函数修改坐标值,而不是试图重载.
来实现这些操作。
- 因为不能重载
- 二维向量类设计
- 定义类
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
来改变向量类大小获取的行为,向量类大小由其数据成员自然决定。
- 在向量的运算操作设计上,例如向量加法