在C++中,有一些运算符是不能被重载的,有一些只能重载为成员函数,还有一些只能重载为友元函数。下面我会分别列举出来,并解释原因:
不能被重载的运算符:
只能重载为成员函数的运算符:
只能重载为友元函数的运算符:
原因: 不能被重载的运算符通常是因为其行为在语言层面已经有了明确定义,重载可能会导致混乱和歧义。成员访问、成员指针访问和作用域运算符等属于语言的重要组成部分,重载这些运算符可能会破坏类成员访问和作用域等语言特性的一致性。
赋值运算符、下标运算符、函数调用运算符等只能重载为成员函数的运算符,是因为它们通常涉及到对对象的状态进行改变或直接访问对象的私有成员,因此更适合作为成员函数来重载。
流插入运算符<<和流提取运算符>>只能重载为友元函数的原因在于,它们通常需要访问流对象的私有成员,但是又不属于流类的成员函数,因此将其重载为友元函数可以在不破坏封装性的前提下实现对流对象的操作。
总的来说,这些限制和规定是为了保证C++的语言特性的一致性和安全性。
运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。也就是说,运算符重载是通过定义函数实现的。运算符重载实质上是函数的重载。重载运算符的函数一般格式如下:
函数类型 operator 运算符名称
(形参表列)
{
对运算符的重载处理
}
重载为类成员函数时参数个数=原操作数个数-1(后置++、--除外)
重载为友元函数时
参数个数=原操作数个数,且至少应该有一个自定义类型的形参
运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。也就是说,运算符重载是通过定义函数实现的。运算符重载实质上是函数的重载。重载运算符的函数一般格式如下:
函数类型 operator 运算符名称 (形参表列)
{
对运算符的重载处理
}
重载为类成员函数时参数个数=原操作数个数-1(后置++、--除外)
重载为友元函数时 参数个数=原操作数个数,且至少应该有一个自定义类型的形参
(3) 对于复合的赋值运算符如+=、-=、*=、/=、&=、!=、~=、%=、>>=、<<=建议重载为成员函数。
(4) 对于其它运算符,建议重载为友元函数。
运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。也就是说,运算符重载是通过定义函数实现的。运算符重载实质上是函数的重载。重载运算符的函数一般格式如下:
函数类型 operator 运算符名称 (形参表列)
{
对运算符的重载处理
}
重载为类成员函数时参数个数=原操作数个数-1(后置++、--除外)
重载为友元函数时 参数个数=原操作数个数,且至少应该有一个自定义类型的形参