赋值运算符函数
什么是运算符重载?
简单讲,比如说:
- 加号的本意是 1+1 = 2 在这里是 累加 的功能
- 在类似于Java、Python这类高级语言中,当 + 加号 出现在字符串之间比如 “Hello” + “World !”,那么这里的加号就会被用来实现 连接两个字符串 的功能。
- 加号不干 累加 的功能,而是实现了 连接两个字符串 的功能,这就叫做 加法运算符的重载。
- 运算符重载中有一点要求需要特别注意:重载运算符的参数至少应有一个是类对象(或类对象的引用)
也就是说,参数不能全部是C++的基本类型,以防止用户修改用于基本类型数据成员的运算符的性质,如下面这样是不对的:
int operator + (int a,int b)
{
return(a-b);
}
原来运算符+的作用是对两个数相加,现在企图通过重载使它的作用改为两个数相减。
如果允许这样重载的话,那么表达式4+3,它的结果是7还是1呢?显然,这是绝对要禁止的。
定义
- C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。
- 运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,惟一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。
运算符函数定义的格式一般如下
<返回类型说明符> operator <运算符符号>(<参数表>)
{
<函数体>
}
运算符重载时要遵循以下规则:
(1) 除了类属关系运算符"."、成员指针运算符".*"、作用域运算符"::"、sizeof运算符和三目运算符"?:"以外,C++中的所有运算符都可以重载。
(2) 重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符。
(3) 运算符重载实质上是函数重载,因此编译程序对运算符重载的选择,遵循函数重载的选择原则。
(4) 重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构。
(5) 运算符重载不能改变该运算符用于内部类型对象的含义。它只能和用户自定义类型的对象一起使用,或者用于用户自定义类型的对象和内部类型的对象混合使用时。
(6) 运算符重载是针对新类型数据的实际需要对原有运算符进行的适当的改造,重载的功能应当与原有功能相类似,避免没有目的地使用重载运算符。
(7)重载运算符的函数不能有默认的参数,否则就改变了运算符的参数个数,与前面第3点相矛盾了;
(8)重载的运算符只能是用户自定义类型,否则就不是重载而是改变了现有的C++标准数据类型的运算符的规则了,会引会天下大乱的;
(9)用户自定义类的运算符一般都必须重载后方可使用,但两个例外,运算符“=”和“&”不必用户重载;
(10)运算符重载可以通过成员函数的形式,也可是通过友元函数,非成员非友元的普通函数。
Java八大基本数据类型:
byte short int long
float double boolean char
基本数据类型是没有String的,String的本质是一个用户类。所以说当加号出现在两个字符串之间的时候,实现连接两个字符串这个功能是加法运算符的重载。
但是,但是,但是,Java语言没有运算符重载:
Java不支持用户自定义操作符重载。
首选的方法是在类中定义一个方法来实现这个功能,比如说通过 a.add(b) 来实现 a+b 的功能。
Java唯一接近“自定义”运算符重载的方面是 + 用于字符串的处理,
这里的加法会造成在编译期或执行期使用StringBuilder/StringBuffer。
没有Java相关,此题PASS。