它有意义吗?类方法可以是内联方式还是静态方式?
回答
static
意味着该方法不与类的实例相关联。 (即它没有“this”指针)。
inline
是一个编译提示,该方法的代码应该被包含在内联的地方,而不是通过普通分支调用。 (请注意,许多编译器会忽略此关键字,并使用他们自己的指标来决定是否内联)。
这些是正交(无关)的概念,所以没有特别的原因,他们不能合并。
我不明白为什么不。静态类成员就像一个独立的函数,可以私人访问其他成员函数。
是的,没有理由不能组合。
您可以。
然而,GCC手册说,该功能不会被编译器集成到代码,如果:
- 调用方法,你定义它之前,或
- 有内任何递归调用定义。
来源:GCC Manual - 讨论C和C++。
我尝试使用称为Class1的小样本类在Visual C++中对这两种场景进行编码。这里是相关的片段,其中incTest是在我的Class1.h文件中定义的。
// test static inline method - based on the GCC manual's C example
static inline int inc (int *a)
{
return (*a)++;
}
// test recursive call in a static inline method
static inline int fac (int x)
{
return x * fac(x-1);
}
int Class1::incTest(int* x)
{
return inc(x);
}
这是成功编译的版本。但是,如果我使用的是Visual C++,并且将inc()的定义移动到incTest()的定义之后,则该文件无法成功编译,因此在调用inc()时发生错误,表示“标识符不是发现”。
编辑:修改我的答案,以考虑我在Visual C++中的测试的评论和结果。
这些条件都不会阻止您声明方法内联。 – 2010-01-25 16:51:12
这是错误的。这两个限制都不是C++的一部分。它们可能会限制函数在生成的代码中实际内联的能力,但您仍然可以将它们标记为内联。如果需要在头文件中定义它们,例如,如果它们是模板化的,这非常有用。 – KeithB 2010-01-25 16:55:11
- 1. MVC的动作方法可以是静态的还是扩展的方法?
- 2. 以静态方式
- 3. 静态内联方法?
- 4. 我可以在Objective-C中内联静态类方法吗?
- 5. 静态方法是DI反模式吗?
- 6. 在java中的静态方法,我可以以非静态方式访问静态方法吗?
- 7. 是否可以“内联”一个“方法”?
- 8. 警告:静态方法应该以静态方式访问
- 9. 工厂类应该是单例还是静态方法?
- 10. 静态类的模板方法模式
- 11. Java的android优化。非静态还是静态方法?
- 12. 模型类(在MVC中)应该使用静态方法还是实例方法?
- 13. 是否可以使用最终的静态类方法?
- 14. C#静态内联方法参数
- 15. 使用类名调用静态方法 - 好还是坏?
- 16. 我应该创建静态方法还是抽象超类
- 17. 是静态方法吗?
- 18. pandas函数是否以“内联”方式更改列类型?
- 19. 检查类是否有静态方法
- 20. 有没有办法找出方法是静态的还是非静态的?
- 21. 哪种方法更好?静态方法内的ArrayList是困惑
- 22. 什么是方法内联?
- 23. 在一个类中混合使用静态方法和非静态方法是否可以接受?
- 24. 什么是从Java中的静态方法调用非静态方法的最佳方式?
- 25. 从静态基类方法调用静态派生类方法
- 26. C#实用功能静态方法/静态类/单身模式
- 27. 如何解决“静态方法___应该以静态方式访问”警告
- 28. 当不同的线程访问静态方法时,在java中是以本地方式还是共享方式声明的对象
- 29. 有没有从静态方法调用类方法的“最佳”方式?
- 30. 一个静态方法总是可以转换为一个实例方法吗?
内联的更重要的含义是该方法的多个定义是允许的(并且假定是相同的)。这允许函数定义在多个地方包含的头文件中。 仍然没有理由他们不能合并。事实上,对于模板中的静态方法,它们几乎必须是。 – KeithB 2010-01-25 16:49:03