首先,阅读之前要先搞清楚什么是运算符、函数重载。函数重载就是在一个范围内为一个函数声明多个实现方式,函数名必须一致。
那么C++运算符是否可以重载呢?可以!先弄清什么时候需要进行运算符重载: 假设,你有一个类或者结构体,想通过 +、-、*、/ 这种最基本的运算符直接进行计算,又或者想用 ==、|| 直接进行比较。 这时候运算符重载的作用就来了。
C++运算符重载的核心是:operator 关键字C++当中的运算符重载是通过 operator 关键字来实现的,当你定义了类或结构体后,编译器肯定无法智能地对类本身进行运算及比较。因此,需要根据实际需要进行运算符的重载。 下面一段代码是在一个类中对 = 进行了一个最简单的重载: void operator=(const DataPack &in) { this->name = in.name; this->value = in.value; }; 可以看到,运算符重载也是一个简单的函数,它也有返回值类型、参数。只不过它的函数名被强制要求为了【operator 关键字 + 要重载的运算符】。 运算符重载的目的,就是为了实现自定义数据类型对运算符作用的支持。
既然重载了运算符,那么返回值与参数必须与运算符本意相匹配,否则编译器会报错: 【正确】 bool operator==(const DataPack &in) { return this->value == in.value; }; 【错误】 void operator>=(const DataPack &in) { return this->value >= in.value; };
重载运算符的函数体,就是对运算符作用的自定义实现: DataPack operator+(const DataPack &in) { DataPack out; out.name = this->name; out.value = this->value + in.value; return out; };
那么有哪些运算符可以重载呢?(节选自菜鸟教程)
不可重载的运算符:
部分可重载的运算符演示: class DataPack { public: DataPack() {}; DataPack(const string &n, int v) : name(n), value(v) {}; /* --- 算术运算符重载 --- */ DataPack operator+(const DataPack &in) { DataPack out; out.name = this->name; out.value = this->value + in.value; return out; }; DataPack operator*(const DataPack& in) { DataPack out; out.name = this->name; out.value = this->value * in.value; return out; }; /* --- 赋值运算符重载 --- */ void operator=(const DataPack &in) { this->name = in.name; this->value = in.value; }; void operator+=(const DataPack &in) { this->value += in.value; }; /* --- 关系运算符重载 --- */ bool operator==(const DataPack &in) { return this->value == in.value; }; bool operator>=(const DataPack &in) { return this->value >= in.value; }; /* --- 逻辑运算符重载 --- */ bool operator&&(const DataPack& in) { return this->value == in.value; }; bool operator!() { return this->value <= 0; }; /* --- 自增减运算符重载 --- */ void operator++() { this->value += 1; }; void operator--() { this->value -= 1; }; /* ---位运算符重载--- */ bool operator&(const DataPack& in) { return this->value = in.value; } /* ---输入输出运算符重载--- */ friend std::istream& operator>>(std::istream& in, DataPack& th) { in >> th.name >> th.value; return in; } friend std::ostream& operator<<(std::ostream& out, const DataPack& th) { out << th.name << th.value; return out; } private: string name; int value = 0; };
运算符全局重载:除此之外,可以将运算符重载声明到类外部作为全局函数,便可以进行全局重载: class DataPack { public: DataPack() {}; DataPack(const string &n, int v) : name(n), value(v) {}; public: string name; int value = 0; }; DataPack operator+(const DataPack& a, const DataPack& b) { DataPack out; out.name = a.name; out.value = a.value + b.value; return out; };
但请注意,以下运算符只能作为成员函数进行重载:
|
/1
|手机版|免责声明|本站介绍|工控课堂
( 沪ICP备20008691号-1 )
GMT+8, 2025-12-23 07:43 , Processed in 0.079484 second(s), 23 queries .
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.