effective C++笔记之条款24、25:在函数重载和设定参数缺省值间慎重选择、避免指针和数字类型重载
2012-03-15 15:09
357 查看
条款24:在函数重载和设定参数缺省值间慎重选择
l 会对函数重载和设定参数缺省值产生混淆的原因在于,他们都允许一个函数以多种方式被调用。
l 到底用哪个取决于两个问题。
确实有那么一个值可以作为缺省吗?
要用到多少种算法?
一般来说,如果可以选择一个合适的缺省值并且只是用到一种算法,就使用缺省值,否则,就用函数重载。
l 设定参数缺省值的情况:
max函数:最关键的一点是,不管函数的调用者提供几个参数,max计算时采用的是相同的算法。在函数内部任何地方都不用在意哪些是“真”的,哪些是缺省值;而且,所选用的缺省值不可能影响到算法计算的正确性。
l 重载函数的情况:
会遇到找不到缺省值的情况。如计算平均值
想完成一个特殊的任务,但算法取决于给定的输入值。这种情况对于构造函数很常见:默认构造函数与拷贝构造函数就是如此。
条款25: 避免指针和数字类型重载
l 因为对于如下函数:void f(int x);
void f(string*ps);
f(0);
0是一个int,所以总是f(int)被调用。但这有时不是我们所希望的。
l 解决方法是使用成员函数模板,即使NULL成为一个“包含一个隐式类型转换运算符”的类的对象,对每一个T类型,运作起来都像static<T*>(0)这样。例如调用f(NULL),这时就回去调用void f(string *ps);
l 但是这种解决方法只有在你是调用者时候才有意义,因为你不能防止使用它的人仍然这样使用f(0);但其实他还是调用了f(int);
l 所以作为重载函数的设计者,只要有可能,就要避免对一个数字和一个指针类型重载。
l 会对函数重载和设定参数缺省值产生混淆的原因在于,他们都允许一个函数以多种方式被调用。
l 到底用哪个取决于两个问题。
确实有那么一个值可以作为缺省吗?
要用到多少种算法?
一般来说,如果可以选择一个合适的缺省值并且只是用到一种算法,就使用缺省值,否则,就用函数重载。
l 设定参数缺省值的情况:
max函数:最关键的一点是,不管函数的调用者提供几个参数,max计算时采用的是相同的算法。在函数内部任何地方都不用在意哪些是“真”的,哪些是缺省值;而且,所选用的缺省值不可能影响到算法计算的正确性。
l 重载函数的情况:
会遇到找不到缺省值的情况。如计算平均值
想完成一个特殊的任务,但算法取决于给定的输入值。这种情况对于构造函数很常见:默认构造函数与拷贝构造函数就是如此。
条款25: 避免指针和数字类型重载
l 因为对于如下函数:void f(int x);
void f(string*ps);
f(0);
0是一个int,所以总是f(int)被调用。但这有时不是我们所希望的。
l 解决方法是使用成员函数模板,即使NULL成为一个“包含一个隐式类型转换运算符”的类的对象,对每一个T类型,运作起来都像static<T*>(0)这样。例如调用f(NULL),这时就回去调用void f(string *ps);
l 但是这种解决方法只有在你是调用者时候才有意义,因为你不能防止使用它的人仍然这样使用f(0);但其实他还是调用了f(int);
l 所以作为重载函数的设计者,只要有可能,就要避免对一个数字和一个指针类型重载。
相关文章推荐
- Effective C++学习笔记:在函数重载和设定参数缺省值间慎重选择
- 在函数重载和设定参数缺省值间慎重选择
- effective C++笔记之条款31、32: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针所指对象的引用、尽可能地推迟变量的定义
- 避免对指针和数字类型重载以及潜在的二义性
- C语言提高-第23/24/25讲: 指针的运算/数组名作为函数参数/指针作函数参数(一维数组Vs指针)
- 条款24::若所有参数皆需类型转换,请为此采用 non-member 函数
- Effective C++——》条款24:若所有参数皆需类型转化,请谓词函数采用non-member函数
- effective C++笔记之条款30: 避免这样的成员函数:其返回值是指向成员的非const指针或引用,但成员的访问级比这个函数要低。
- 条款24:若所有的函数参数可能都需要发生类型转换才能使用,请采用non-member函数
- Effective C++ 第二版 25)避免指针和数字重载 26)二义性
- C++语言笔记系列之六——函数的重载、函数缺省参数
- 读书笔记 effective c++ Item 24 如果函数的所有参数都需要类型转换,将其声明成非成员函数
- c++类型重载 : 避免对指针和数字重载
- More Effective C++ (条款21:利用重载技术避免隐式类型转换)
- More Effective C++ 条款21 利用重载技术避免隐式类型转换
- Effective C++笔记_条款35 考虑virtual 函数以外的其他选择
- 指针类型作为成员函数的参数
- effective c++条款10-12(operator=(重载返回类型、自我赋值和深层复制))整理
- 《Effect C++》学习------条款24 :若所有参数皆须类型转换,请为此采用non-member函数
- effective C++笔记之条款20、21:避免public接口出现数据成员、尽可能使用const