标题:重载运算符示例
只看楼主
hmsabc
Rank: 2
来 自:贵州省兴义市
等 级:论坛游民
帖 子:97
专家分:19
注 册:2010-8-2
结帖率:100%
已结贴  问题点数:20 回复次数:6 
重载运算符示例
程序代码:
/*
运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。也就是说,

运算符重载是通过定义函数实现的。运算符重载实质上是函数的重载。重载运算符的一般格式:
                 
                  函数类型 operator 运算符名称( 形参表列)
                  
                   { 对运算符的重载处理}

注意:函数名是由 operator 和 运算符组成。例如: operator+ 就是函数名。*/

//重载运算符 例10_2(谭浩强《C++程序设计》第一版 P316页)

#include <iostream>

using namespace std;

class Complex                                                      //定义 Complex

{ public:

    Complex( ){ real = 0; imag =0;}                                //定义无参构造函数,并初始化

    Complex( double r, double i){ real = r; imag = i;}             //构造函数重载,定义并初始化

    Complex  operator + ( Complex &c2);                            //声明重载运算符的 “ + ”函数

    void display( );                                               //声明输出函数

    private:

        double real;                                               //实部

        double imag;                                               //虚部

};

Complex Complex::operator + ( Complex &c2)                         //定义重载运算符 “ + ”的函数

{ Complex c;

c.real = real + c2.real;                                           //两个复数的实部相加

c.imag = imag + c2.imag;                                           //两个复数的虚部相加

return c;}


void Complex::display( )                                           //定义输出函数

{ cout << "(" << real << "," << imag << "i)" << endl;}



int main( )
{
    Complex c1( 3,4),c2( 5,-10),c3;                          //定义三个复数对象,建立对象时自动调用有参构造函数并赋值

    c3 = c1 + c2;                                            //运算符 “ + ”用于复数运算
   
    cout << "c1 =";c1.display( );                            //输出 c1 的值

    cout << "c2 =";c2.display( );                            //输出 c2 的值

    cout << "c1 + c2 =";c3.display( );                       //输出 c3 的值

    system("pause");
   
    return 0;
}
/*运算符重载对 C++ 程序设计有重要意义,把运算符重载和类结合起来,可以在 C++ 程序中定义出很有实用意义而使用方便的新数据
类型。运算符重载使 C++ 具有更加大的功能、更好的可扩充性和适应性,这是 C++ 最吸引人的特点之一。*/

搜索更多相关主题的帖子: 算符 示例 载运 
2010-08-13 10:08
jjg
Rank: 2
等 级:论坛游民
帖 子:67
专家分:42
注 册:2009-8-19
得分:4 
顶一下啊,发现论坛上的人都相当沉默
2010-08-13 12:12
towhee
Rank: 2
来 自:石家庄火车站
等 级:论坛游民
威 望:1
帖 子:48
专家分:69
注 册:2010-8-8
得分:4 
主函数中的
    c3 = c1 + c2;                                            //运算符 “ + ”用于复数运算

就是用了operator+的函数?
貌似有点明白了。。。

最穷无非讨饭,不死终会出头
2010-08-13 12:30
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:4 
其实这个程序还有好多可以改进的地方哟~

对于一个成员函数来说,如果它对该实例来说,不做任何改动,那么声明成 const 的成员函数更合适,否则在一些场合就会失效。
比如楼主所示的 main 函数里,如果改成下面这样:
程序代码:
int main( )
{
    const Complex c1(3, 4), c2(5, -10);

    Complex c3;
    c3 = c1 + c2;

 
    cout << "c1 =";c1.display( );
    cout << "c2 =";c2.display( );
    cout << "c1 + c2 =";c3.display( );

 
    return 0;
}

貌似很合理,但再编译就会发现出了很多错误。

其实你的类的很多函数的声明都可以改一改,改成下面这样会有更好的效果,不只是語法上的,编译器在编译过程中所做代码优化也可能会更好。

比如
void display( ) const;
实现也改成:
void display( ) const
{
    ......
}

那个 operator+ 除了可以加 const 之处,还有更简洁高效的写法,像下面这样:
Complex Complex::operator+ (const Complex &c2) const
{ return Complex(real+c2.real, imag+c2.imag); }

当然类里的声明也要跟着改一改。
收到的鲜花
  • mxs8102010-08-13 14:37 送鲜花  5朵   附言:值得学习~~
2010-08-13 13:34
hmsabc
Rank: 2
来 自:贵州省兴义市
等 级:论坛游民
帖 子:97
专家分:19
注 册:2010-8-2
得分:0 
回复 4楼 pangding
我现在对运算符重载,仍然不甚理解,所以用抄写的学习方法,希望能强行记住这个示例,然后再找一些资料学习,慢慢的来理解和消化。
2010-08-13 14:01
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:4 
抄写也很重要。背别人写好的代码,时间长了之后自己自然就理解了。
而且有的东西是定势,就算有自己的理解,事实上写的时候也应该用“标准”一点的写法。毕竟别人都是这么写的,除了这种写法本身被实践证明是好的以外,你这么写别人会看的很快。如果你的写法和标准写法有出入,会引起注意,人们也许会猜测你这么做是不是有特别的用意。比如传参的时候,为了效率常常写的都是 void f(const T &p),只要不用更改参数,const 就带着。如果没有,人就会开始注意,是不是那个引用是传出参数之一。
还有好多语法,用的时候可能都是混杂在一起的。书上讲的时候,会尽力不涉及得太广,免得初学时混乱。慢慢理解和消化是必要的~
2010-08-13 22:29
towhee
Rank: 2
来 自:石家庄火车站
等 级:论坛游民
威 望:1
帖 子:48
专家分:69
注 册:2010-8-8
得分:4 
北京贵宾许多经验之谈。。。膜拜中。。。

最穷无非讨饭,不死终会出头
2010-08-14 15:15



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-315572-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.304882 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved