1.一些注意点
1.1函数赋值必须按照从右向左原则如:
play( i = 0 ; k ; l = 1 ) //出错
1.2 防止用户输入内容超过数组长度的解决办法
while(i<n&&str[i]); //后面判断函数数组是否达到/0;
2.函数重载
double a ( int );
double a ( double ) ;
int a ( int ) ; //歧义声明,错误
int a ( const double ) ; //重复声明,错误
int a ( const &double) ; //引用类型,正确重载
double a( double * ) ;
double a ( const double*) ;//基于传入指针所指向数据的类型的重载
double a ( int* ) ;
double a ( int* const ) //这里定义将传入指针要是const ,为重复重载
2.1任何程序有且仅有一个main函数的实例,main函数不能重载。
2.2对于函数重载来说,它们应该在形参数量和形参类型上有所不同。
3.3如果两个函数声明的返回类型和形参表完全匹配,则将第二个声明视为第一个的重复声明。
3.4如果两个函数的形参列表相同(参数个数和类型)相同但是返回类型不同,那么第二个函数的声明将会出现编译错误。
3.5对于指针形参也是如出一辙。
3.6不能基于指针本身是否为const来实现函数重载。
4.函数模板
简单说就是在函数定义和声明前加上
template<typename T > //类的定义里会用到的class
T a ( t c , t d ) ;
T a(T &c , T & d ) ;
T a ( T c ; T d ; T g ) ; // 模板也可以用于重载
4.1优先度:
显式具体化>普通模板
显式具体化<非普通模板
隐式具体化=普通模板函数
template< >void add<int> (int& , int & ) ;
template< >void add<int> (int& , int & ) {} ; //主要作用在产生优先关系时
4.2对于给定的函数名,可以有非模板函数、模板函数和显式具体化函数以及它们的重载版本
4.3编译器对模板的选择
@1 提升转换,如:char/shorts->int||float->double
@2标准转换,如:int->char||long->double
@3人工选择:
/**如果有less<>(int,int)函数//显式具体化
想要调用它 less(a,b) ;
但是有了less(int,int)函数 */
less<>(a,,b) ; //强制调用显式具体化
less<int>(a,b)//强制转换ab并调用显式具体化
5.关键字decltype
auto h(int a ,float b ) ->double ; // 指定返回类型
template < typename T >
auto h (T a , T b ) - > decltype(x+y) ; // 自动推断x+y的类型
//c++11