什么是C++中的操作符重载
用户定义的类的操作符可以在C++中被做成函数。这表明,C++的运算符重载功能允许它为数据类型赋予特殊的含义。举个例子,我们可以在 “String “这样的类中重载操作符 “+”,这样我们就可以用简单的字母 “+”来追加两个字符串。大整数、复数和小数等类是其他一些可以重载的数学运算符。
编译时多态性包括运算符重载。它的概念是为现有的C++运算符提供额外的含义,同时保持其原始含义。
例子 。
int x;
float y, sum;
sum=x+y;
本例中的变量 “x “和 “y “是内置数据类型 “int “和 “float”。因此,”x “和 “y “的内容可以简单地使用加法运算符 “+”来添加。因为只有内置数据类型的变量被预定义为可以通过加法运算符 “+”来添加,所以情况就是这样。
现在,考虑另一个例子
class B
{
};
int main()
{
B b1,b2,b3;
b3= b1 + b2;
return 0;
}
本例中使用了三个 “B类 “的变量。”b1″、”b2 “和 “b3″。使用 “+”运算符,我们试图结合两个对象,”b1 “和 “b2″,它们属于用户定义的类型,或 “B类 “类型。这是被禁止的,因为加法运算符 “+”在默认情况下只能对内置数据类型进行操作。然而,由于 “B类 “是一个用户定义的类型,在这种情况下,编译器会产生一个错误。在这种情况下,”操作符重载 “的概念是相关的。
现在必须重新定义 “+”运算符,这样,如果用户希望它增加两个类对象,它就会产生两个类对象。利用 “运算符重载 “的思想,就可以实现这一目标。因此,”操作符重载 “的主要原则是将C++操作符与类变量或类对象一起使用。操作符的原始含义并没有因为重新定义它们而真正改变;相反,它们在以前的含义之外又被赋予了新的含义。
#include
using namespace std;
class Count {
private:
int value;
public:
Count() : value(5) {}
void operator ++ () {
++value;
}
void display() {
cout << "Count: " << value << endl;
}
};
int main() {
Count count1;
++count1;
count1.display();
return 0;
}
输出 。
Count: 6
运算符函数与普通函数的区别是什么
运算符函数和普通函数适用同样的规则。主要的区别是,运算符函数的名称总是由以运算符符号为首的运算符关键字组成,而且只要使用相关的运算符就会调用运算符函数。
为什么下面的运算符不被重载
1) typeid – 这使CPP应用程序能够检索指针或引用所指向的对象的真正派生类型。这个操作符的唯一目的是以一种独特的方式来识别一个类型。多态性可以用来使一个用户定义的类型 “看起来 “像另一个类型,但至关重要的是,typeid操作符的含义不能被改变,否则可能导致严重的问题。
2) sizeof – 这给出了操作数(输入的对象或数据类型)的大小。编译器会对此进行评估;它不能在运行时进行评估。sizeof操作隐含地用于对象数组中适当的指针递增。通过重载来改变其含义,语言的一个基础方面将被破坏。
3) 范围解析(::)– 通过提供一个命名空间,帮助定位和定义一个标识符所对应的区域。它对名字而不是值进行操作,并且完全在运行时进行评估。如果CPP被重载,就没有语法来捕获范围解析的操作数,因为它们不是数据类型的操作。因此,从语法的角度来看,重载这个操作符是不合逻辑的。
关于操作符重载的重要信息
- 至少有一个操作数必须是用户定义的类对象,这样才能使操作符重载发挥作用。
- 赋值运算符。每个类都有一个由编译器创建的自动默认赋值运算符。大多数时候,默认的赋值运算符就足够了,因为它确实将所有右边的成员赋值到左边(这种行为与复制构造函数相同)。
- 任何接受单一参数并作为转换构造函数的构造函数都可以用来对被创建的类进行间接转换。