官网建设建站,最方便建立网站,cms网站建设的实训总结,企业注册邮箱的步骤本文主要讲解运算符重载#xff0c;由于白鳯大佬没有具体讲解#xff0c;所以本文自行补充了运算符重载的相关知识 目录 文章目录 前言 运算符重载 加号运算符重载 左移运算符重载 递增运算符重载 总结 前言
本文主要对于运算符重载进行探讨#xff0c;分别对于成员函数重… 本文主要讲解运算符重载由于白鳯大佬没有具体讲解所以本文自行补充了运算符重载的相关知识 目录 文章目录 前言 运算符重载 加号运算符重载 左移运算符重载 递增运算符重载 总结 前言
本文主要对于运算符重载进行探讨分别对于成员函数重载和全局函数重载友元函数重载进行讨论。 运算符重载
运算符重载是C中的一项强大功能它允许您为自定义的类或结构体定义特定的行为以响应与内置类型相似的操作符。通过重载运算符您可以实现自定义类型之间的数学运算、比较、位操作等。
运算符重载使用operator关键字后跟要重载的运算符来实现。例如表示加法运算符-表示减法运算符等。
运算符重载一般分为成员函数重载和全局函数重载
以下是一些常见的需要进行运算符重载的情况 算术运算符例如 , -, *, /, %比较运算符例如 , !, , , , 赋值运算符例如 , , -, *, /位操作运算符例如 , |, ^下标操作符[]函数调用操作符() 对于每个需要进行重载的运算符您可以根据需求定义适当的成员函数或非成员函数。成员函数形式在对象本身上调用该操作而非成员函数形式将两个对象作为参数传递。
请注意在进行运算符重载时请遵循一些最佳实践和规则
不要改变原始对象的状态如果不是必要的。避免创建歧义或混乱的重载操作。考虑使用友元函数来实现某些运算符重载以便访问私有成员。
运算符重载是C语言中的一项强大功能可以提高代码的可读性和表达能力。
加号运算符重载
加号运算符可以在C中进行重载使其适用于自定义类型的对象。要重载加号运算符您可以使用成员函数或非成员函数的形式。
成员函数形式本质为 p3 p1.operator(p2)
class MyClass {
public:MyClass operator(MyClass other) {// 在这里实现加法操作并返回结果}
};#include iostreamclass Complex {
private:double real;double imag;public:Complex(double r 0.0, double i 0.0) : real(r), imag(i) {}Complex operator(const Complex other) const {return Complex(real other.real, imag other.imag);}void display() const {std::cout ( real imag i) std::endl;}
};int main() {Complex c1(2.5, 3.7);Complex c2(1.8, -2.9);Complex sum c1 c2; // 使用重载的加号运算符sum.display(); // 输出(4.3 0.8i)return 0;
}全局函数形式友元函数访问私有成员本质为 p3 operator(p1,p2)
class MyClass {
public:};MyClass operator(const MyClass obj1, const MyClass obj2) {// 在这里实现加法操作并返回结果}
#include iostreamclass Complex {
private:double real;double imag;public:Complex(double r 0.0, double i 0.0) : real(r), imag(i) {}// 声明友元函数以便访问私有成员friend Complex operator(const Complex c1, const Complex c2);void display() const {std::cout ( real imag i) std::endl;}
};Complex operator(const Complex c1, const Complex c2) {return Complex(c1.real c2.real, c1.imag c2.imag);
}int main() {Complex c1(2.5, 3.7);Complex c2(1.8, -2.9);Complex sum c1 c2; // 使用重载的加号运算符sum.display(); // 输出(4.3 0.8i)return 0;
}俩个代码实现内容一样主要一个是成员函数一个全局函数全局函数需要成为友元函数来访问类的私有数据成员。
同时运算符重载也可以发生函数重载
左移运算符重载
如果我们有一个person类建立一个对象p,当我们想直接使用coutpendl;来输出对象p中的内容似乎并不能直接实现C并不认识这个类也不知道如何输出。
这里我们就可以使用左移运算符重载了与上面的加号运算符一样左移运算符同样是以operato形式实现的这里我们仍然可以分为成员函数重载和全局函数重载来分别实现一下。
当我们按照成员函数来写时就会发现一个问题首先你不能给自己传入p即p.operator(p),然后我们再使用p.operator(cout),而这样简化的版本就是pcout,与我们想要的coutp相反了所以我们不使用成员函数来实现左移运算符而使用全局函数。
void operator(cout)
{
//简化完事 p cout
} 如果用全局函数首先要知道的事cout是输出流对象即ostream对象
使用operator(ostream cout,person p)进行函数重载简化完事coutp
至于为什么不用void空值而是ostream 是因为当你主函数使用函数重载输出后如果返回的事空值就不能继续追加输出例如endl;补上换行因为cout后面一直能连续使用是链式编程需要返回的还是cout即返回ostream输出流。
class preson
{
private:
string p_name;
int p_age;
public:
friend ostream operator(ostream cout,person p);
}
ostream operator(ostream cout,person p)
{coutp_namep.p_namep_agep._ageendl;
}
递增运算符重载
递增运算符重载即要对进行运算符重载
跟C中的a,a一样递增运算符重载也要分为前置递增和后置递增的重载
解决下述代码中几个重点问题
1、函数重载的返回类型就是自己建立的Integer类型是因为如果有个对象num,当你想要实现对num或者num直接输出类似于a1;coutaendl;的操作时你需要返回Integer类型否则返回空值是没有输出的
2、为什么前置递增返回值类型引用了而后置递增返回值类型没有引用。
后置传递如果使用引用那么值就错了要返回递增前的值 这个主要是了解运算符实现的本质 a1; cout(a)endl; 这个是对的说明前置运算符计算本质是引用对一个数修改 cout(a)endl; 这个是错的说明后置运算符计算本质是值传递无法二次修改 3、下述代码偷懒了应该演示一下numnum的输出而不是使用成员函数getValue来实现其实只要将左移运算符重载一下就可以了按照已讲过的方法实现即可
#include iostream
using namespace std;class Integer {
private:int value;
public:Integer(int val) : value(val) {}// 前置递增运算符重载Integer operator() {value;return *this;}// 后置递增运算符重载Integer operator(int) {Integer temp(value);value;return temp;}int getValue() const {return value;}
};int main() {Integer num1(5);cout 初始值: num1.getValue() endl;// 前置递增num1;cout 前置递增后的值: num1.getValue() endl;// 后置递增Integer num2 num1;cout 后置递增后的值: num2.getValue() endl;cout num1当前的值: num1.getValue() endl;return 0;
}总结
本文主要对运算符重载进行了探讨主要讲述了运算符重载分为成员函数重载和全局函数重载友元函数重载这样的操作并举例加号左移以及递增运算符的重载方法和一些注意事项。
通过上述的讲解可以实现更多的运算法重载的方法当然还有很多运算符重载值得我们探讨本文讲述的内容也比较有限。
推荐学习博客 https://xxetb.xetslk.com/s/4GgGz6