C++超详细讲解操作符的重载
一、需要解决的问题下面的复数解决方案是否可行下面看一下复数的加法操作123456789101112131415161718192021222324252627282930313233343536#include stdio.hclassComplex{inta;intb;public:Complex(inta 0,intb 0){this-a a;this-b b;}intgetA(){returna;}intgetB(){returnb;}friendComplex Add(constComplex p1,constComplex p2);};Complex Add(constComplex p1,constComplex p2){Complex ret;ret.a p1.a p2.a;ret.b p1.b p2.b;returnret;}intmain(){Complex c1(1, 2);Complex c2(3, 4);Complex c3 Add(c1, c2);// c1 c2printf(c3.a %d, c3.b %d\n, c3.getA(), c3.getB());return0;}输出结果如下思考Add 函数可以解决 Complex 对象相加的问题但是 Complex 是现实世界中确实存在的复数并且复数在数学中的地位和普通的实数相同。为什么不能让操作符也支持复数相加呢这个就涉及到操作符的重载。二、操作符重载C 中的重载能够扩展操作符的功能操作符的重载以函数的方式进行本质用特殊形式的函数扩展操作符的功能通过 operator 关键字可以定义特殊的函数operator 的本质是通过函数重载操作符语法下面来初探一下操作符重载123456789101112131415161718192021222324252627282930313233343536#include stdio.hclassComplex{inta;intb;public:Complex(inta 0,intb 0){this-a a;this-b b;}intgetA(){returna;}intgetB(){returnb;}friendComplex operator (constComplex p1,constComplex p2);};Complex operator (constComplex p1,constComplex p2){Complex ret;ret.a p1.a p2.a;ret.b p1.b p2.b;returnret;}intmain(){Complex c1(1, 2);Complex c2(3, 4);Complex c3 c1 c2;// operator (c1, c2)printf(c3.a %d, c3.b %d\n, c3.getA(), c3.getB());return0;}输出结果如下可以将操作符重载函数定义为类的成员函数比全局操作符重载函数少—个参数左操作数)不需要依赖友元就可以完成操作符重载编译器优先在成员函数中寻找操作符重载函数下面来实现在成员函数中重载操作符123456789101112131415161718192021222324252627282930313233343536373839404142434445#include stdio.hclassComplex{inta;intb;public:Complex(inta 0,intb 0){this-a a;this-b b;}intgetA(){returna;}intgetB(){returnb;}Complex operator (constComplex p){Complex ret;printf(Complex operator (const Complex p)\n);ret.a this-a p.a;ret.b this-b p.b;returnret;}friendComplex operator (constComplex p1,constComplex p2);};Complex operator (constComplex p1,constComplex p2){Complex ret;printf(Complex operator (const Complex p1, const Complex p2)\n);ret.a p1.a p2.a;ret.b p1.b p2.b;returnret;}intmain(){Complex c1(1, 2);Complex c2(3, 4);Complex c3 c1 c2;// c1.operator (c2)printf(c3.a %d, c3.b %d\n, c3.getA(), c3.getB());return0;}输出结果如下这个说明编译器优先在成员函数中寻找操作符重载函数故上述代码可以直接写成1234567891011121314151617181920212223242526272829303132333435#include stdio.hclassComplex{inta;intb;public:Complex(inta 0,intb 0){this-a a;this-b b;}intgetA(){returna;}intgetB(){returnb;}Complex operator (constComplex p){Complex ret;ret.a this-a p.a;ret.b this-b p.b;returnret;}};intmain(){Complex c1(1, 2);Complex c2(3, 4);Complex c3 c1 c2;// c1.operator (c2)printf(c3.a %d, c3.b %d\n, c3.getA(), c3.getB());return0;}三、小结操作符重载是 C 的强大特性之一操作符重载的本质是通过函数扩展操作符的功能operator 关键字是实现操作符重载的关键操作符重载遵循相同的函数重载规则全局函数和成员函数都可以实现对操作符的重载
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2559535.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!