首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >常量静态成员函数:是否有其他可用的方法?

常量静态成员函数:是否有其他可用的方法?
EN

Stack Overflow用户
提问于 2019-09-16 23:16:23
回答 3查看 101关注 0票数 2

正如this Q&A中所报道的,常量静态成员函数在C++中不可用。从那以后(2011)有什么变化吗?

有没有其他方法可以让静态成员函数不修改其类的静态成员?

类似于(伪代码):

代码语言:javascript
运行
复制
class C
{
   static int a;
public:
   static void Incr() { ++a; }
   static int  Ret() const { return a; }
};

int C::a = 0;

我需要从另一个类的const成员函数中调用一个const静态成员函数。

EN

回答 3

Stack Overflow用户

发布于 2019-09-16 23:24:36

根据当前的cppreference.com (关于static members的页面),静态成员函数仍然不能是const,因为const关键字只修改this指针,而静态函数显然没有。

所以自从你提到的答案写出来之后,似乎什么都没有改变。

票数 7
EN

Stack Overflow用户

发布于 2019-09-16 23:27:08

从那以后(2011),

有什么改变吗?

没有任何改变,你仍然不能对静态成员函数进行cv限定。

有没有其他方法可以让静态成员函数不修改其类的静态成员?

这不是一个完美的解决方案,但您可以为静态数据成员声明常量“别名”:

代码语言:javascript
运行
复制
static int  Ret() { 
    static constexpr const auto& a = C::a;
    // Now C::a is shadowed by the local a
    // and the function can't modify it.
    // a = 2; // ill-formed
    return a * 2; // OK
}

它仍然需要纪律,但至少这样编译器可以捕获意外的修改尝试。

票数 4
EN

Stack Overflow用户

发布于 2019-09-16 23:56:09

只有静态字段和静态方法的类不值得被称为class。它只是函数和全局变量的形式,具有奇特的名称间距。

无论如何,最好是有一个包含常规字段和方法的常规类,然后将其实例化为全局变量(这不是一个很好的解决方案,但至少在类只包含静态字段和方法的情况下更诚实)。

代码语言:javascript
运行
复制
class C
{
   int a;
public:
   C() : a(0) {}
   void Incr() { ++a; }
   int  Ret() const { return a; }
};

C instance;

或者使用我讨厌的单例模式。

从生成代码的角度来看,应该没有区别。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57959862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档