是否应在头文件或.cpp源文件中指定C++函数的默认参数值

Should C++ function default argument values be specified in headers or .cpp source files?

本文关键字:函数 C++ 默认 参数 文件 源文件 cpp 是否      更新时间:2023-10-16

我对C++有点陌生。我在设置标题时遇到问题。这是来自函数.h

extern void apply_surface(int, int, SDL_Surface *, SDL_Surface *,SDL_Rect *);

这是functions.cpp 中的函数定义

void
apply_surface(int x, int y, SDL_Surface * source, SDL_Surface *
destination,SDL_Rect *clip = NULL)
{
    ...
}

这就是我在main.cpp 中使用它的方式

#include "functions.h"
int
main (int argc, char * argv[])
{
    apply_surface(bla,bla,bla,bla); // 4 arguments, since last one is optional.
}

但是,这并不能编译,因为main.cpp不知道最后一个参数是可选的。我怎样才能做到这一点?

您使声明(即在头文件-functions.h中)包含可选参数,而不是定义(functions.cpp)。

//functions.h
extern void apply_surface(int, int, SDL_Surface *, SDL_Surface *,SDL_Rect * clip = NULL);
//functions.cpp
void apply_surface(int x, int y, SDL_Surface * source, SDL_Surface *
destination,SDL_Rect *clip /*= NULL*/)
{
    ...
}

默认参数值应在函数声明(functions.h)中,而不是在函数定义(function.cpp)中。

使用:

extern void apply_surface(int, int, SDL_Surface *, SDL_Surface *,SDL_Rect * = NULL);

(注意,我不能在这里检查;附近没有编译器)。

奇怪的是,如果我有一个没有默认参数的虚拟函数,然后继承者在.h文件中没有默认参数,然后在他们的.cpp文件中有默认参数,这对我来说很好。像这样:

// in .h
class Base {virtual void func(int param){}};
class Inheritor : public Base {void func(int param);};
// in .cpp
void Inheritor::func(int param = 0){}

原谅粗制滥造的格式