面面俱到

发布时间: 2007-05-21 09:44    作者: 未知    来源: 未知    浏览:    评论

面面俱到

                          ----重载

作者:HolyFire

面面俱到说的是一件事考虑到了很多方面。有的时候我们的一句话适用于很多方面,而这些方面有些类似。比方说加法,加法可以用于,整数和有理数。在C++里可以用两个函数来实现这个目的。

int intadd( int v1 , int v2 )

{

    return  v1+v2;

}

float floatadd( float v1 , float v2 )

{

    return  v1+v2;

}

使用的方式是这样的

int ia = 1 , ib = 2 , iab = 0;

float fa = 1.0 , fb = 2.0 , fab = 0.0;

iab = intadd( ia ,ib );

fab = floatadd( fa , fb );

这样看起来很不直观,可读性不强,我们的目的是让人一眼就可以看出是在做相加运算。

聪明的读者可能发现,两个函数的返回值和参数并不一样,这样就可以区别开两个不同的行为。这个特性可不可以利用呢,答案是可以,C++贴心的为我们做好了一切。原理很简单,将函数的返回值和参数用一种可逆的编码方法变成一个字符串,安插在函数名后面,编译器向用户屏蔽这一切,用户可以用同一个名字来使用不同的函数。

就是这样

int add( int v1 , int v2 )

{

    return  v1+v2;

}

float add( float v1 , float v2 )

{

    return  v1+v2;

}

int ia = 1 , ib = 2 , iab = 0;

float fa = 1.0 , fb = 2.0 , fab = 0.0;

iab = add( ia ,ib );

fab = add( fa , fb );

哦~~~~,编译通过了,结果也运行无误。

这样的代码看上去要比原来的好读多了,我们可以略过我们不感兴趣的那些东西。

重载的另一个方面是可以重载运算符,不同的是,它需要使用一个关键字operator。这样就可以用自己的方式来使用运算符了。那么立刻用运算符来改写上面的一切吧

int operator + ( int v1 , int v2 )

{

    return  v1+v2;

}

float operator + ( float v1 , float v2 )

{

    return  v1+v2;

}

int ia = 1 , ib = 2 , iab = 0;

float fa = 1.0 , fb = 2.0 , fab = 0.0;

iab = ia + ib ;

fab = fa + fb;

哦~~~,这段代码真是太漂亮了,可是不实用,为什么,用过C++的人都知道,象int,float这类的基本类型,本来就可以直接用运算符,那么,就来一个不是基本类型的吧。复数类在C++里可不是基本类型哦。

在这个例子里实现了complex类运算符+的重载,并重载了<<运算符,让ostream可以接受complex的输出。

改变运算符原来的意义并不是一个好主意,应该尽量保证运算符原来的意义,我们使用它的本意就在于让程序易读易懂,书写方便,iostream中的<<和>>是由于人们大量使用形成惯例后的产物,他们原来的意义是做移位运算。

#include <iostream>

unsing namespace std;

class complex{

private:

    int real;

    int image;

public:

    complex( int _real = 0 , int _image = 0 ) : real(_real),image(_image) {}

    int& Real(){ return real; }

    int& Image(){ return image; }

    complex operator + ( complex const& v )

        {

        complex w( real + v.real , image + v.image );

        return w;

        }

};

ostream& operator << ( ostream& out , complex& v )

{

    if( v.Real() )

        out << v.Real() ;

    if( v.Image() > 0 )

        cout << " + " ;

    else if( v.Image() == 0 )

        return cout;

    else

        cout << " - " ;

    cout << v.Image() <<"i";

    return out;

}

void main()

{

    complex w( 1 , 2 ) , v( 3 , 4);

    cout << (w + v) << endl;

}

代码看起来很简洁,可读性很强。

我们可以看出<<失去了他原来的意义,而变成了ostream类的接口,其实重载运算符在本质上和重载函数是一样的。

使用重载的目的就是提高代码的可读性,运用得好还可以提高可复用程度。
上一篇 芥子须弥 下一篇 白马非马

TAG

Smile Big Smile Surprise Stick out tongue Wink Sad Tongue Tied Indifferent Crying Embarrassed Cool Angry Angel Devil [8-|] [:#] [:-*] [:^)] [<:o)] [|-)] Yes Beer Left Hug Music Star Time Snail Pizza Automobile Umbrella Computer Storm [mo] [8o|] [^o)] [+o(] [*-)] [8-)] Coffee No Drinks [Z] Right Hug Cake Broken Heart Gift Wilted Flower Movie Dog Idea Sleep Email Travel Paradise
呢称:

加粗 斜体 下划线 链接 图片 代码 邮件地址 引用 列表

最多只能输入100个字符

Tags

SQL 数据库 asp.net C# XML 控件 .NET教程 程序 事件 数据 安全 代码 Server 客户端 验证 数据库专栏 接口 文件 Oracle DataSet 函数 DataGrid 问题 .net return C#语言 JavaScript 服务 IIS 对象 语句 windows 继承 时间 web.config 设计 开发 参数 变量 解决 字符 ADO.net 环境 VB.Net语言 web 异常 工具 服务器 计算 实例 OLEDB Application VB Word WebService insert asp net 安装 记录

精华推荐

更多

精品下载

更多