为何C++类成员函数默认参数被忽略?无参调用编译报错
为什么无参调用
PrintGrid()会报错? 这是个很典型的C++默认参数使用误区——默认参数必须声明在函数的可见接口处(通常是头文件的函数声明里),而不能仅在实现文件的定义中指定。
咱们拆解下你的代码问题:
- 在
grid_model.h的类声明里,PrintGrid的声明是void PrintGrid(bool);——这里完全没提默认参数,所以对于包含这个头文件的grid_model_test.cpp来说,编译器只认定这个函数必须传入一个bool类型参数,根本不知道你在cpp文件里给它加了默认值。 - 而在
grid_model.cpp的函数定义里,你写了void GridModel::PrintGrid(bool flag = false)——这个默认参数的定义只在cpp文件内部有效,测试代码作为调用者完全看不到这个信息,编译器自然会判定你调用PrintGrid()时缺少了必要参数。
修复方法
只需要把默认参数移到头文件的函数声明中,实现文件里可以保留也可以去掉默认参数(更规范的做法是只在声明处写):
修改grid_model.h:
class GridModel { public: GridModel(); void PrintGrid(bool flag = false); // 将默认参数放在声明位置 };
修改grid_model.cpp(可选,去掉默认参数更符合规范):
void GridModel::PrintGrid(bool flag) { // 此处无需再写默认值 // 执行逻辑... }
这样grid_model_test.cpp包含头文件后,编译器就知道PrintGrid支持无参调用(会自动使用默认的false),编译就能正常通过了。
补充说明
C++的默认参数是编译期特性,编译器需要在函数调用点明确知道有默认参数存在,才能生成正确的调用代码。如果默认参数只在定义处,调用点的编译器看不到这个信息,自然无法识别无参调用的合法性。
内容的提问来源于stack exchange,提问作者Alexander Kleinhans
相关产品推荐
相关产品推荐

