面向对象 —— 类设计(十)—— 成员函数

  • 注意区别同名成员函数接口所属的类类型;

    BinNodePosi(T) BinNode<T>::insertAsLC(const T&);
    BinNodePosi(T) BinTree<T>::insertAsLC(BinNodePosi(T), const T&);

1. 成员函数的重载

  • 成员函数(包括构造函数)重载的目标一般是为客户端提供更为方便、灵活的接口,也即方便客户端的调用;
  • 一般而言,形参列表较长的会被形参列表更短的调用,自然需要为其指定一些默认的参数,或者说参数列表较多的服务与参数列表较短的。

2. 成员函数之间的关系

重载的成员函数之间存在foo的实现是基于与其构成重载的foo的实现的关系,不构成重载关系的成员函数之间自然也并非彼此独立、泾渭分明、井水不犯河水,也存在互相调用的关系。

以 Vector 元素去重的实现为例,需要借助区间内查找(find(e, lo, hi)),以及指定位置删除(remove(r))(而指定位置删除有需借助区间内删除):

template <typename T>
int Vector<T>::deduplicate(){
    int oldSize =_size;
    int i = 1;
    while (i < _size){
        find(_elem[i], 0, i) < 0 ? ++i : remove(i);
    }
    return oldSize - _size;
}

3. 自由度

构成重载的成员函数(乃至一般函数)之间,如果参数较多的成员函数被参数较少的成员函数所调用,几乎可以肯定的是,参数较多的成员函数相较参数较少的成员函数,具有较高的自由度。

所谓自由度,其实也是参数的设置。

4. 再论成员函数的重载:为什么需要众多的函数重载

构成重载的成员函数之间除了参数较短的调用参数较长的(指定一些默认参数)外(实现完全相同,只是参数的设置略有不同),有时也会提供完全不同的实现形式,当然是针对不同的场景,出于实际问题的考虑,比如对文件的读取操作,显然大文件和小文件的读取操作不应该相同。

5. 构造函数的参数

  • 构造函数的功能正在于为类的成员变量赋初值;一般提供以下构造函数:
    • 空参构造:默认值;
    • 含参构造:设置初始值;
    • 拷贝构造:将其他同一个类的实例化对象的成员变量的值,赋给自己的成员变量;

类内部除构造函数以外的其他成员函数,如何获取构造函数中的参数呢?
将构造函数的参数保存在类的成员变量中,此即为封装,将成员函数和成员变量封装在一起。

6. 更易型成员函数

对于一些更易型成员函数,比如数据结构的插入和删除操作(insert/delete),一定要检查类内部的成员变量是否需要做相应的更改(++_size/--_size)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值