cpp——复合类型——函数——匿名形参 默认实参

来源:互联网 发布:wiki 数据库 编辑:程序博客网 时间:2024/05/16 07:46

匿名形参

c++允许形参匿名,匿名形参主要用来占位,待以后完善,因为形参匿名,因此函数体中无法访问
void feed(int, int){    cout << "feed(int, int)" << endl;}void call_feed(){    //feed();    //feed(5);    feed(5, 8);}

默认实参

  • 默认实参本质就是在函数调用时,从函数声明(引用性声明和定义性声明)中获取默认实参值代替当前函数调用中相应位置实参的缺失,显然编译期代替
  • 可为一个或多个形参指定默认实参,如果一个形参具有默认实参,那么此形参后所有形参(如果还有)都必须具有默认实参,因为函数调用时实参按位置解析,默认实参只能用来代替函数调用时缺少的尾部实参,默认实参可以是任何类型表达式(包括常量,常量是特殊表达式),只要表达式值类型与形参类型兼容,即表达式值类型允许隐式转换为形参类型
  • 在函数声明(引用性声明和定义性声明)中指定默认实参,同一source file中,每个形参至多只能指定一次默认实参,否则编译器不知道使用哪个函数声明中默认实参,编译error,不同source file中同一函数声明可指定不同默认实参,不会引起冲突,因为编译器编译单元是source file,而且默认实参是编译器代替
  • 通常在函数声明(引用型声明)中指定默认实参,在函数定义中不指定,因为函数作为接口常以header file和lib的形式分发给使用者,函数声明放在header file,使用者可知道默认实参值,函数定义以目标代码形式编译进lib,使用者无法知道默认实参值

默认实参使用合法

同一source file中每个形参至多只能指定一次默认实参
void feed(int rice = 5);void feed(int rice){    cout << "feed rice " << rice << endl;}
不同source file中同一函数声明可指定不同默认实参
file1.cpp
void feed(int rice = 5);
file2.cpp
void feed(int rice = 8);
同一source file中每个形参至多只能指定一次默认实参,并且符合“可以为一个或多个形参定义默认值,如果有一个形参具有默认实参,那么此形参后所有形参(如果还有)都必须具有默认实参”规则
void feed(int rice, int meat = 8);void feed(int rice = 5, int meat);void feed(int rice, int meat){    cout << "feed rice " << rice << " and " << "meat " << meat << endl;}
注:第1个feed声明指定meat默认实参,第2个feed声明时,meat已具有默认实参,第3个feed声明时,rice和meat都具有默认实参,正确

默认实参使用非法

同一source file中为形参多次指定默认实参(即使多次指定的默认实参相同,因为默认实参是表达式,不一定是常量,因此编译期不知道默认实参值),编译器不知道使用哪个函数声明中默认实参
void feed(int rice = 5);void feed(int rice = 8){    cout << "feed rice " << rice << endl;}
不符合“可以为一个或多个形参定义默认值,如果有一个形参具有默认实参,那么此形参后所有形参(如果还有)都必须具有默认实参”规则
void feed(int rice = 5, int meat);void feed(int rice, int meat = 8);void feed(int rice, int meat){    cout << "feed rice " << rice << " and " << "meat " << meat << endl;}
注:第1个feed声明时,meat没有默认实参,编译error,meat默认实参缺失

匿名形参的默认实参

匿名形参也可具有默认实参,但意义不大
void feed(int = 5, int = 8){    cout << "feed(int, int)" << endl;}void call_feed(){    feed();    feed(5);    feed(5, 8);}
0 0