找回密码
 立即注册
收起左侧

C++老鸟日记025 什么是重载,重载的目的是什么?

2
回复
6052
查看
[复制链接]
累计签到:41 天
连续签到:1 天
来源: 原创 2018-9-18 22:56:43 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 baizy77 于 2018-10-1 20:57 编辑

版权声明
---------------------------------------------------------------------------------------------------------------------
该文章原创于Qter开源社区(www.qter.org
作者: 女儿叫老白 (白振勇)
转载请注明出处!
---------------------------------------------------------------------------------------------------------------------
本套课程属于:《C++跨平台开发干货》系列课程。
-----------------------------------------------------------------------------

引言:
----------------------------------------------------------------------------
       有时候,我们需要提供某个接口,而这个接口会支持各种不同的参数组合,因而衍生出好几个同名接口。这就是重载,所谓的一词多义。

正文:
----------------------------------------------------------------------------
       举个例子,我们要计算功率,可以用下列公式:
  1. P = U * I;
  2.               P = I * I * R;
  3.               P = U * U / R;
复制代码

       如果设计成接口,可以是下面的样子:
  1. double getP(DataTypeU u, DataTypeI i);
  2. double getP(DataTypeI i, DataTypeR r);
复制代码

       这几个接口就构成了重载。从上述例子,我们可以对重载形成一个直观印象:为了达到某种操作目的,可以通过不同的手段或者途径。
       除了这种常规意义上的重载之外,实际上构造函数也可以重载,这就相当于为类提供了不同的初始化手段。比如:
  1. //cpen.h
  2.        classCPen {
  3.        public:
  4.            /**  构造函数
  5.            *      @param[in] clr 画笔颜色
  6.            *      @param[in] style画笔形状(实线、虚线、点划线等)
  7.            */
  8.               CPen(CColorclr, CPenStyle style);

  9.            /**  构造函数
  10.            *      @param[in] clr 画笔颜色
  11.            *      @param[in] style画笔形状(实线、虚线、点划线等)
  12.            *      @param[in] dWidth画笔宽度
  13.            *      @param[in] js 拐点形状
  14.            */
  15. CPen(CColor clr, CPenStyle style, double dWidth, CPenJoinStyle js);//
  16. };
复制代码

       上述代码就为CPen提供了两个不同的构造函数,这两个函数构成了构造函数重载。
       那么,我们可以确定一下重载的定义:
1, 在同一个(class/stuct)定义范围内,函数名相同
2,参数类型或参数个数至少有一个不同

       看了上面的定义,我们可能会问,能否通过返回值实现重载呢?
       答案是:不能。
       因为C++允许调用函数时,不对返回值暂存。比如,定义两个同名、同参数的函数,但是返回值不同:
  1. 1, double getP(double u, double i);
  2. 2, int getP(double u, double i);
复制代码

       看上去好像可以。但是别忘了,我们可以直接调用这两个函数,而不去关心返回值:
  1. getP(100, 20);
  2. getP(100, 20);
复制代码

       请问,编译器能猜到您分别调用的是函数1还是函数2吗?
       别说编译器,就是人工也无法判断。因此不能通过函数返回值实现函数重载。

结语:
----------------------------------------------------------------------------
       函数的重载还是比较容易理解的。但是函数的重载、覆盖、隐藏是3个比较容易混淆的概念,后面的内容中我们会详细讨论这三个概念,敬请关注。

参考资料
----------------------------------------------------------------------------
《C++编程思想》两卷合订本中文版(P171),(美) Bruce Eckel  Chuck Allison著

回复

使用道具 举报

累计签到:50 天
连续签到:1 天
2018-9-22 11:10:57 显示全部楼层
我来想想重载,覆盖和隐藏。 都用到继承里面的么。
     继承下来,然后在子类写一个一模一样的函数, 这样子类的函数叫做重载; 父类继承下来的函数叫做隐藏。   覆盖是把父类的函数定义虚函数就成了覆盖么。    理解正确没?
回复 支持 反对

使用道具 举报

累计签到:41 天
连续签到:1 天
2018-9-22 12:38:39 显示全部楼层
tan 发表于 2018-9-22 11:10
我来想想重载,覆盖和隐藏。 都用到继承里面的么。
     继承下来,然后在子类写一个一模一样的函数, 这 ...

重载指一个域(类)内部的函数之间。不是父子之间。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了