为何C++函数定义无需重复声明默认参数?
为什么C++函数默认参数只需在声明中定义?
核心原因在于C++对默认参数的处理逻辑:
默认参数是编译期的替换操作
当你在代码里调用make_coffee()(不带参数)时,编译器会参考头文件里的函数声明,自动把默认值false填充进去,转换成make_coffee(false, false)再编译。这个替换过程发生在调用函数的.cpp文件(比如你的main.cpp)编译阶段,和函数实现文件(coffee.cpp)完全无关。函数定义只负责接收参数
函数实现的本质是处理传入的参数值——不管这个值是调用者显式传入的,还是编译器用默认值填充的。所以coffee.cpp里的make_coffee(bool milk, bool sugar)只需要接收两个bool类型的参数即可,不需要再写默认值;反而如果在定义里重复写默认参数,还可能因为和声明不一致导致未定义行为。符合C++标准规定
C++标准明确要求:默认参数只能在函数的第一次声明(通常就是头文件里的声明)中指定,后续的声明或定义里不能重复指定,也不能修改已有的默认参数。你在实现文件里不写默认参数,完全符合标准,自然不会触发错误。
你的代码示例:
头文件coffee.hpp
std::string make_coffee(bool milk=false, bool sugar=false);
函数实现文件coffee.cpp
#include <string> std::string make_coffee(bool milk, bool sugar) { std::string coffee = "Here's your coffee"; if (milk and sugar) { coffee += " with milk and sugar"; } else if (milk) { coffee += " with milk"; } else if (sugar) { coffee += " with sugar"; } return coffee + ".\n"; }
内容的提问来源于stack exchange,提问作者Farouk
相关产品推荐
相关产品推荐

