【问题标题】:Does it make sense to use const with an object that only has constant members?将 const 与只有常量成员的对象一起使用是否有意义?
【发布时间】:2021-02-04 11:53:16
【问题描述】:

如果一个类只有 const 成员:

struct A {
    const int n;
    const std::string s;
    void f() const;
};

以下几组定义是否等价?

A a1 {...};
const A a2 {...};

A& ref1 = a1;
const A& ref2 = a1;
const A& ref3 = a2;

const 在这种情况下是多余的吗?

【问题讨论】:

    标签: c++ constants


    【解决方案1】:

    const 成员变量一开始很少有意义。


    以下几组定义是否等价?

    A a1 {...};
    const A a2 {...};
    
    A& ref1 = a1;
    

    技术上不,它们不相等,因为你不能这样做:

    A& ref1 = a2;
    

    【讨论】:

    • "... 很少有意义..." 为什么?这是你个人的看法吗?最后一个例子确实不正确,但如果 const 是多余的,那就是正确的。
    • @m.alessandrini The last example is not correct indeed, but would be if const is redundant. 因此我们可以推断 const 不是多余的。 Is that your personal opinion? 是的,还有许多人的共同观点。
    • 嗯,我认为 const 成员在相反的情况下是必不可少的,当一个对象同时具有可以变化的成员和必须保持不变的其他成员时。这也是编译器优化的一个重要指标。但我对你所宣传的观点的基本原理感兴趣,你有一些链接吗?
    • @m.alessandrini - 有一些 const 成员变量的替代品,通常更易于管理。比如让成员private这样在类外无法访问,只能通过constgetter来访问。 class/struct 类型限制用户与其成员的交互方式是一回事。完全限制该类的成员函数的实现方式是另一回事(这是const 成员所做的) - 如果不能信任类的成员函数来明智地维护类状态,那么您就会遇到问题const 数据成员没有地址。
    • @m.alessandrini It's also an important indication for compiler optimization 这是一个常见的误解。运行时 const 很少有助于优化。
    【解决方案2】:

    回答标题中的问题:

    对只有常量成员的对象使用 const 有意义吗?

    恕我直言,您应该决定是否创建一个变量const,而不管他们的成员是否为const。这样做的原因是文档、语义和一致性,以及可维护性。

    因此,如果您的意图是这部分代码不会对变量进行更改,则添加 const 与您当前无法对成员变量进行任何更改这一事实无关。

    您永远不知道将来是否可以在没有 const 成员的情况下扩展该类,或者您需要删除其成员之一的 const 限定符,然后是 constness之前由所有成员提供的 const 将不再完全适用。

    【讨论】:

    • 我同意。我只是好奇编译器是否会以完全相同的方式对待它们,但我想应该检查各种编译器生成的汇编代码。
    猜你喜欢
    • 1970-01-01
    • 2017-06-30
    • 2020-06-01
    • 2017-09-17
    • 2012-09-13
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多