EffectiveC++学习笔记-条款24|25

条款24 若所有参数都需要类型转换,则这个函数应该是non-member函数
条款25 考虑写出一个不抛出异常的swap函数

若所有参数都需要类型转换,则这个函数应该是non-member函数

比如设计一个Int的class它就可以使用隐式转换,但是如下函数更适合non-member方式实现。一个表示有理数的类。

 const Rational operator* (const Rational& r1, const Rational& r2)
 {
     return Rational(r1.GetNumerator() * r2.GetNumerator(), r1.GetDenominator() * r2.GetDenominator());
}

至于为什么不用member函数:

 const Rational operator* (const Rational& r) const;
//如下调用
result = oneHalf * 2; //ok!
result = 2 * oneHalf; //err!
//相当于 2.operator*(oneHalf)

关于友元的方式,因为友元访问到到了私有成员部分
破坏了封装性,不如上述的non-member方式更好。

最后要注意:注意在转换过程中,Const修饰的重要性以及合理性

写一个不抛出异常的swap

先看看标准库的swap是如何工作的。
一个简单的示例:

class String
{
public:
    String(char *str)
    {
        if(str == nullptr)
        {
            d = new char[1];
            d = '\0';
        }
        else
        {
            int len = strlen(str);
            if(len <= 0)
            {
                d = new char[1];
                d = '\0';
            }
            else
            {
                d = new char[len + 1];  //c++ new
                memset(d, 0, len + 1);
                memcpy(d, str, len);
                d[len] = 0;
            }
        }
    }

    void show()
    {
        cout << d<<"   : "<<&d<<endl;
    }

private:
    char *d;
};

int main()
{
    String s1("hello");
    String s2("world");
    s1.show();
    s2.show();

    swap(s1,s2);
    cout <<"-----swap-----"<<endl;

    s1.show();
    s2.show();
    return 0;
}

//打印结果
hello   : 0x28feac
world   : 0x28fea8
-----swap-----
world   : 0x28feac
hello   : 0x28fea8

可以看出标准的swap是对内存数据的交换

总结一下书上的:

  1. 当std::swap对你的类型效率不高时,提供一个swap成员函数,这个成员函数不抛出异常,只对内置类型进行操作
  2. 如果提供一个member swap,也该提供一个non-member swap来调用前者,对于普通类,也请特化std::swap
  3. 调用swap时,区分是调用自身命名空间的swap还是std的swap,不能乱加std::符号
  4. 为“用户自定义类型”进行std template全特化是好的,但千万不要尝试在std内加入某些对std而言全新的东西。

关于异常:
不要在成员函数的那个swap里抛出异常,因为成员函数的swap往往都是简单私有成员(包括指针)的置换,比如交换两个int值之类,都是交换基本类型的,不需要抛出异常,把抛出异常的任务交给non-member的swap吧。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值