【问题标题】:c++ static member method with default argumentc++ 带默认参数的静态成员方法
【发布时间】:2014-05-30 08:06:31
【问题描述】:

如果我们对静态成员变量使用默认参数,会有什么陷阱吗?像这样:

enum Index
{
    INDEX_A = 0,
    INDEX_B
};

class foo
{
public:
    static void method1( int a, int b = INDEX_A);
};

编译器从不抱怨,但当涉及到静态时,我总是很谨慎。

【问题讨论】:

  • b 不是int,你在说什么陷阱?如果您只是在学习,您的消息来源是否告诉过您任何有关陷阱的信息?
  • 静态方法是完全正常的。避免静态数据
  • 非常感谢您的回复。我正在学习 C++ 中的“静态”。我关心初始化的顺序。我了解到静态成员是在程序启动时定义的。我了解到,调用方法时默认参数是“评估的”。这是否意味着默认参数必须是某种“const”并在静态方法之前声明和定义?我的问题有意义吗?
  • 在您给我们的示例中,您有 no 个静态成员。只有一个静态成员函数。没有静态数据成员

标签: c++ static default-arguments


【解决方案1】:

从技术上讲,我会使用:

static void method1( int a, Index b = INDEX_A);

但除此之外,静态函数与任何其他函数没有什么不同。他们只是没有传入“隐藏的”this 参数,因此不会使用类的实例调用该函数。

还要注意,当使用默认参数时,如果你稍后定义你的函数,你可以获得非常有趣的东西,使用这个:

static void method1( int a, Index b = INDEX_B)
{
  ...
}

因为,根据调用函数的位置,b 的值可能为 INDEX_AINDEX_B(如果在定义之前调用它,或者在不同的翻译单元中调用它,它将是 @ 987654327@,如果你在定义后调用它,它可能是INDEX_B)。该参数由编译器在调用时填充。

您关于静态成员的 cmets 适用于静态成员 VARIABLES。一旦代码被编译和链接,成员函数就存在。普通成员变量在类被实例化时创建,例如当代码执行 foo xfoo *p = new foo; 的代码时。静态成员变量具有“全局存储期限”,换句话说,它们就像全局变量,只是它们的“名称”在类内部,而不是常规的全局变量。

是的,如果您在翻译单元之间使用静态成员变量(不同的源文件 = 不同的翻译单元),您必须担心初始化顺序。不同 TU 之间的初始化顺序是未定义的(按标准)。

【讨论】:

  • 感谢您的解释。
  • "参数由编译器在调用时填充。"这是我不清楚的。那么默认参数的值是在编译时评估的,而不是运行时?这是否意味着默认值必须是“const”,可以在编译时确定?
  • 是的,默认参数必须是编译器可以在编译时确定的。语言定义不严格const,例如全局变量,但不允许const
猜你喜欢
  • 2011-01-18
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多