带默认char参数的C++print函数调用异常:print(rep)无输出求解
问题分析:C++默认参数调用
print(rep)无输出的原因 先看你给出的代码:
#include <iostream> using namespace std; int print(char c = '*', int num = 10); int print(char c, int num) { for (int i = 0; i < num; i++) { cout << c << endl ; } cout << endl; return 0; } int main() { int rep; char letter; cout << "Enter a character : "; cin >> letter; cout << "Enter the number of times it has to repeat : "; cin >> rep; print(letter, rep); print(rep); print(letter); return 0; }
核心原因:参数匹配顺序搞反了
C++里函数参数是按位置顺序匹配的,默认参数的规则是:只有当右侧的所有参数都使用默认值时,左侧的参数才能省略。你误以为调用print(rep)时,会把rep传给第二个形参num,同时第一个形参c使用默认值'*',但实际情况完全相反:
print(rep)中,rep是int类型,编译器会将它隐式转换为char类型,赋值给第一个形参c,第二个形参num则使用默认值10。- 你输入的
rep是整数(比如10、5这类),转换为char后对应的是ASCII控制字符(比如10是换行符,5是查询字符),这些字符是不可打印的,所以你看不到任何输出,而非默认参数没生效。
解决方案
要实现“使用默认字符*,自定义重复次数”的需求,有两种常用方法:
1. 调整参数顺序(推荐)
把有默认值的参数放在右侧,符合C++默认参数的设计逻辑:
// 修改函数声明和定义的参数顺序 int print(int num = 10, char c = '*'); int print(int num, char c) { for (int i = 0; i < num; i++) { cout << c << endl ; } cout << endl; return 0; } // 调用时对应调整顺序 print(rep, letter); // 自定义字符和次数 print(rep); // 使用默认字符,自定义次数 print(10, letter); // 自定义字符,使用默认次数(避免char隐式转int的歧义)
2. 增加函数重载
如果不想调整参数顺序,可以新增一个只接收int参数的重载函数,内部复用原函数逻辑:
// 新增重载 int print(int num) { return print('*', num); // 显式使用默认字符,传入自定义次数 } // 原函数保持不变 int print(char c = '*', int num = 10); int print(char c, int num) { /* ... */ } // 调用时正常使用 print(rep); // 自动匹配重载函数,输出*重复rep次
内容的提问来源于stack exchange,提问作者DSK
相关产品推荐
相关产品推荐

