cpp——复合类型——函数——匿名形参 默认实参
2017-03-01 09:13
295 查看
匿名形参
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); }
相关文章推荐
- C/C++中二维数组作函数形参时,调用函数时,可传递的实参类型的小结
- 函数的类型,函数的声明,函数的定义,函数的调用,函数嵌套,函数递归,形参实参
- C/C++中二维数组作函数形参时,调用函数时,可传递的实参类型的小结
- 函数调用时,需注意实参和形参的类型差异,类型内存存储格式的差异
- cpp——复合类型——函数——运算符重载
- 函数的基本类型, 实参与形参的运用 调用头文件 递归调用
- cpp——复合类型——函数——函数重载
- Cpp primer<<学习函数-实参类型转换、指向函数的指针_3
- C++语法基础--模板实参推断,模板类型形参的实参的受限转换,模板实参推断与函数指针
- 3.当形参,返回值类型是JavaBean式的复合类,List集合,数组等时:服务端业务逻辑层接口
- 8.当形参,返回值类型是JavaBean式的复合类,List集合,数组等时:客户端主类
- IntelliSense: "const char *" 类型的实参与 "LPCTSTR" 类型的形参不兼容 (vs2010)
- C#中函数参数的形参和实参即加ref 或加 out 与全部不加
- 5.当形参,返回值类型是JavaBean式的复合类,List集合,数组等时:服务端domain
- c# 值类型与引用类型 实参与形参 ref与out
- 4.当形参,返回值类型是JavaBean式的复合类,List集合,数组等时:服务端业务逻辑层实现类
- 虚函数与默认实参
- 总结:数组作为实参的传送及函数中的形参接受
- 形参引用类型_而传入的实参随便时
- 仅Chrome中函数实参与形参发生关联