C++基础面试题 | 什么是C++中的运算符重载?
koi li 2024-10-25 17:05:02 阅读 82
文章目录
回答重点:示例:
运算符重载的基本规则和注意事项:
回答重点:
C++的运算符重载是指可以为自定义类型(如类或结构体)定义运算符的行为,使其像内置类型一样使用运算符。通过重载运算符,开发者可以对类对象使用常见的运算符(如<code>+, -
, *
, ==
, []
等),并为它们赋予特定的操作逻辑。
重载的运算符仍然遵守其原有的优先级和结合性。重载必须是通过类成员函数或友元函数实现。不能重载的运算符:::
、.*
、.:
、sizeof
、typeid
、const_cast
等。
示例:
class Complex {
public:
int real, imag;
Complex(int r = 0, int i = 0) : real(r), imag(i) { }
// 重载 + 运算符
Complex operator + (const Complex &obj) {
return Complex(real + obj.real, imag + obj.imag);
}
};
重载+后,以下代码就可以正常工作:
Complex a(1.0, 2.0);
Complex b(3.0, 4.0);
Complex c = a + b; // 使用重载的+运算符
运算符重载的基本规则和注意事项:
只能重载已有的运算符,不能创建新的运算符。
比如 +
运算符可以重载,但不能创建一个新的运算符。
不能改变运算符的优先级、结合性和内在语义。
重载只改变运算符的操作对象和行为,但在表达式中的优先级和结合性是固定的,也不能改变其在基本类型上的预期行为。例如,不能让 +
运算符变成减法。
有些运算符不能被重载。
比如 .
(成员访问运算符)、?:
(三元条件运算符)等不能被重载。但是大多数运算符符合相应的规定都可以重载。
运算符重载可以作为成员函数或全局函数。
作为成员函数时,第一个参数隐含为 this
指针。如果需要对两个不同类型的对象进行操作,通常会使用全局函数形式重载,同时全局函数形式需要使用友元声明访问类的私有成员。
class Complex {
public:
Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) { }
// 声明为友元函数,使其访问私有成员
friend Complex operator+ (const Complex& lhs, const Complex& rhs);
private:
double real;
double imag;
};
// 作为全局函数重载 + 运算符
Complex operator+ (const Complex& lhs, const Complex& rhs) {
return Complex(lhs.real + rhs.real, lhs.imag + rhs.imag);
}
运算符重载要确保符合逻辑和直观,以免造成困惑。例如,==
运算符通常用于比较对象是否相等,那么它的返回值应该是一个布尔值。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。