1 重载函数
1 必须体现在参数个数和参数类型差异上,仅仅判断返回值不足重载,会议之前的描述底层函数名+参数个数+参数类型编码。
2 const 修饰的参数不足以重载,比如
void f(int i)
void f(const int i)
不能作为重载函数。
但是如果作为引用或者指针类型,则表示是可以重载的。
比如
void f(int *);
void(const int *);
void (int &);
void(const int &);
2 重载函数与域
重载函数集合的所有函数必须在同一个域中,一个声明在局部函数将隐藏而不是重载全局域中的函数,比如:
void print(const string&);
void print(double);
void foobar(int ival)
{
extern void print(int &);
print("hello,world!") ;// error
print(i); //ok
}
using 声明可以制造一个更大的域范围,该范围内的函数支持重载
3 extern “C" 引用的C函数可以同C++函数重载,但是不能extern ”c“ 两个重载的函数,C编译器不支持函数重载。
4 重载函数的细节,暂时没有兴趣关注。
5 函数模板中的类型参数和非类型参数:
模板非类型参数表示该参数名代表一个潜在的值,模板函数使用的一个常量,而模板实例化的过程中会自动传入这个费类型的参数,这个是编译器自动完成的。
比如:
template <typename Tyte, int size>
type min((const Type(&array)[size])
{
Type min_val = array[0];
for(int i = 1;i<size;i++)
if(array[i]<min_val)
min_val = array[i];
return min_val;
}
6 显式模板实参
显示制定模板参数类型,放弃系统自动推导(避免麻烦和错误)
考虑如下情况:
template <class T> T min(T,T) { ...............}
int main()
{
unsigned int ui;
....
min(ui,1024); //错误T只能绑定在一个类型上,或者unsigned int 或者int
}
解决办法是显式制定模板实参类型,比如 min<unsigned int>(ui,1024)
7 模板编译模式:
包含编译模式:
模板定义在头文件中,包含模板的实现
分离编译模式:
仅包含模板的声明,模板的实现放在C中使用exprot,比如:
exprot template<typename Type>
模板实例化的细节,目前没有兴趣关注了。