【问题标题】:Is private const redundant in a C++ class?C++ 类中的私有 const 是多余的吗?
【发布时间】:2018-10-22 07:15:31
【问题描述】:

假设我有一个带有我不想更改的成员变量的类。假设没有 setter 函数,将该变量设为私有 const 与仅将变量设为私有之间有什么区别吗?

私人:

class ConstFoo
{
public:
    Foo(int a);
    virtual ~Foo();
    int val(){ return val_; }
private:
    int val_;
}

私有常量:

class ConstFoo
{
public:
    Foo(int a);
    virtual ~Foo();
    int val(){ return val_; }
private:
    const int val_;
}

似乎两者没有区别,因为在任何一种情况下都无法更改val_ 的值,所以const 限定符似乎是多余的。

我可以看到显式添加const 的一个原因是为了代码清晰,因此将来处理代码的人不会向函数添加setter。但是,由于名称为 ConstFoo 并且文档明确指出它不是可变的,我认为这不会是一个问题。

【问题讨论】:

  • 您可以在第一种情况下使用一些 setter 成员函数(方法)更改int val,但在第二种情况下则不能。
  • 让它像int val() const { return val_; } 这样如果你有const ConstFoo foo; 或bar(const ConstFoo& foo) 你可以打电话给foo.val() 否则不能。对于val_ 成员,这在当前上下文中并没有太大的区别。

标签: c++ class constants private


【解决方案1】:

您更正了,如果成员是私有的,则任何外人都无法更改该成员。这并不意味着它不能改变。如果你有另一个成员函数,比如

void bar() { val_ = 42; }

然后你的第一个代码块会编译,而第二个代码块会给你一个错误。如果您真的不希望能够更改成员的值,那么它应该是const,无论它是否是私有的。 const 将充当您的错误检查器。

【讨论】:

    【解决方案2】:

    这完全取决于您希望这个值是“常量”。

    就目前而言,没有外部用户可以直接更改该值。但是他们可以间接这样做,因为对象本身可能不是const:

    ConstFoo a{0};
    ConstFoo b{2};
    a = b;
    

    a 现在有 2 个。

    另外,代码 within ConstFoo 也可以改变它的值;这就是复制赋值运算符可以更改其值的原因。

    因此,如果您想确保特定成员对象在任何ConstFoo 实例的整个生命周期中都采用一个值,则将其声明为const。

    当然,这使得ConstFoo 不可赋值。

    【讨论】:

    • 那么如果任何成员变量被声明为const,赋值运算符就不再起作用了?
    • @AlexanderJ93:除非你写一个。即使这样,书面的也不能改变const 成员。单纯的“封装”(外人无法触摸)和“const”(没有人可以触摸)之间需要区分。
    【解决方案3】:

    不确定,如果我的问题是正确的,但一般来说:

    • 私有成员只能从类本身内部访问,而公共成员可以从外部访问
    • 在创建这个特定类的新对象时,const 成员只能在构造函数中设置一次

    这意味着,私有 const 变量可以在创建此类的新对象时设置一次,因此可以作为内部修饰符(例如,为该类提供的某些函数提供偏移量)在 this 的整个生命周期内有效目的。 仅仅一个私有变量就可以从类内部改变它的值。

    一般来说你是完全正确的,在 C++ 中使用常量的整个概念是为了确保你的约束在进一步的开发过程中得到遵守(不仅由其他开发人员,也由你自己)

    【讨论】:

      【解决方案4】:

      您自己已经回答得很清楚了:将其设为const 非常清楚地表达了您的意图,并使编译器能够支持您。

      在我看来,const 关键字有两个用途:

      A) 它向程序员表明该值一旦被设置就不会被更改,

      B) 它允许编译器强制执行该意图,从而防止错误。

      将其命名为constFoo 在某种程度上实现了其中的第一个,但对第二个没有任何作用。并且(再次恕我直言)比使用 const 更难看。

      【讨论】:

        【解决方案5】:

        private 关键字确保类外的任何人都不能修改该变量。

        如果不修改类里面的变量那么结果是一样的。

        我认为最好也使用const 键,因为它不仅告诉开发人员(包括您自己)可能会修改您的类,它旨在保持不变,而且更安全:如果他们尝试修改修改不会有效果。

        所以在我看来这不是多余的。

        【讨论】:

          猜你喜欢
          • 2016-10-02
          • 1970-01-01
          • 2018-11-09
          • 2017-12-04
          • 1970-01-01
          • 1970-01-01
          • 2010-09-29
          • 2012-02-01
          • 1970-01-01
          相关资源
          最近更新 更多