EffectiveC++学习笔记-条款24|25
2017-06-30 07:56
381 查看
条款24 若所有参数都需要类型转换,则这个函数应该是non-member函数
条款25 考虑写出一个不抛出异常的swap函数
至于为什么不用member函数:
关于友元的方式,因为友元访问到到了私有成员部分
破坏了封装性,不如上述的non-member方式更好。
最后要注意:注意在转换过程中,Const修饰的重要性以及合理性
一个简单的示例:
可以看出标准的swap是对内存数据的交换。
总结一下书上的:
当std::swap对你的类型效率不高时,提供一个swap成员函数,这个成员函数不抛出异常,只对内置类型进行操作
如果提供一个member swap,也该提供一个non-member swap来调用前者,对于普通类,也请特化std::swap
调用swap时,区分是调用自身命名空间的swap还是std的swap,不能乱加std::符号
为“用户自定义类型”进行std template全特化是好的,但千万不要尝试在std内加入某些对std而言全新的东西。
关于异常:
不要在成员函数的那个swap里抛出异常,因为成员函数的swap往往都是简单私有成员(包括指针)的置换,比如交换两个int值之类,都是交换基本类型的,不需要抛出异常,把抛出异常的任务交给non-member的swap吧。
条款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是对内存数据的交换。
总结一下书上的:
当std::swap对你的类型效率不高时,提供一个swap成员函数,这个成员函数不抛出异常,只对内置类型进行操作
如果提供一个member swap,也该提供一个non-member swap来调用前者,对于普通类,也请特化std::swap
调用swap时,区分是调用自身命名空间的swap还是std的swap,不能乱加std::符号
为“用户自定义类型”进行std template全特化是好的,但千万不要尝试在std内加入某些对std而言全新的东西。
关于异常:
不要在成员函数的那个swap里抛出异常,因为成员函数的swap往往都是简单私有成员(包括指针)的置换,比如交换两个int值之类,都是交换基本类型的,不需要抛出异常,把抛出异常的任务交给non-member的swap吧。
相关文章推荐
- EffectiveC++学习笔记-条款41|42
- EffectiveC++学习笔记-条款34|35
- EffectiveC++学习笔记-条款11
- EffectiveC++学习笔记-条款14
- EffectiveC++学习笔记-条款38
- EffectiveC++学习笔记-条款8
- EffectiveC++学习笔记-条款22|23
- EffectiveC++学习笔记-条款49
- EffectiveC++学习笔记-条款9
- EffectiveC++学习笔记-条款12
- EffectiveC++学习笔记-条款13
- EffectiveC++学习笔记-条款15|16|17
- Effective STL学习笔记-条款24
- EffectiveC++学习笔记-条款20|21
- EffectiveC++学习笔记-条款28|29
- effective C++笔记之条款24、25:在函数重载和设定参数缺省值间慎重选择、避免指针和数字类型重载
- EffectiveC++学习笔记-条款26|27
- EffectiveC++学习笔记-条款7
- EffectiveC++学习笔记-条款45
- EffectiveC++学习笔记-条款32|33