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;
}
在这个示例中使用了三个类型为”class B”的变量:”b1″,”b2″和”b3″。我们试图使用”+”运算符来合并两个用户定义类型或者”type class B”的对象”b1″和”b2″,但是这是不允许的,因为默认情况下”+”运算符只能用于内置数据类型。然而,由于”class 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被重载,没有语法来捕获作用域解析的操作数,因为它们不是具有数据类型的操作。因此,从语法的角度来看,重载这个操作符是不合逻辑的。
关于操作符重载的重要信息
- 为了使操作符重载起作用,至少有一个操作数必须是用户定义的类对象。
- 赋值运算符:每个类都有一个编译器自动生成的默认赋值运算符。大多数时候,默认赋值运算符已经足够了,因为它把所有右侧的成员赋值给左侧(这个行为与拷贝构造函数相同)。
- 任何接受单个参数并作为转换构造函数使用的构造函数都可以用于对正在创建的类进行间接转换。