【问题标题】:Initialized const in a class在类中初始化 const
【发布时间】:2012-11-28 14:27:16
【问题描述】:

是否可以在classglobal const 中初始化class method?我想在我的class 中使用一种方法来设置const

我的想法是:

/* a.h */
class A {
private:
    const string cs;

public:
    A();
    ~A();

    bool cs(const string &host, ...)
};

/* a.cpp */
A::A(){
}

A::~A(){
}

bool cs(const string &host, ...) {
    /* check some values */
    cs = "Set Vaule";   //Doesnt work, get an compiler error
}

是否可以在method 中设置global const

【问题讨论】:

  • 如果你可以在初始化后更改它,它就不会是 const。
  • 您想要完成的工作的大局是什么?为什么不直接使用访问器方法来限制访问?
  • 在什么意义上cs是一个全局
  • 您对“全球”世界的使用似乎暴露了您的一些困惑。您确实知道您的班级A 的每个实例都有cs 的不同副本,对吗?其次,应避免将函数命名为与变量相同的名称。

标签: c++ class constants


【解决方案1】:

没有。您可以在构造函数初始化程序中对其进行初始化,但一旦初始化,const 成员就无法更改。否则,就不会是constant,对吧?

【讨论】:

  • 好吧,我也这么想!我不确定。谢谢大家!
【解决方案2】:

这只有在你的类的构造函数中才有可能,而且只有在初始化列表中:

A() : cs("Set Value") {
}

【讨论】:

    【解决方案3】:

    不,你只能在构造函数中设置它。建好后,一成不变。

    【讨论】:

      【解决方案4】:

      如前所述,您需要使用对象的initializer list 来初始化对象的 const 成员:

      /* a.h */
      class A {
      private:
          const string cs;
      
      public:
          A(const string &value) :
              cs(value) // <---- initialize here!.
          {};
      };
      

      对于类的每个 const 成员都是一样的:

      class A {
      private:
          const string cs;
          const float numberofthebeast;
          const char z;
      
      public:
          A(const string &value, const float number, const char character) :
              cs(value),
              numberofthebeast(number),
              z(character)
              {};
      };
      

      如果你不想提供构造函数来初始化每个值,你可以在默认构造函数中提供一个默认值,但记住构造后不能更改值:

      class A {
      private:
          const string cs;
          const float numberofthebeast;
          const char z;
      
      public:
          A(const string &value, const float number, const char character) :
              cs(value),
              numberofthebeast(number),
              z(character)
              {};
      
          // Default values!!!
          A() :
              cs("default ctor"),
              numberofthebeast(666.666f),
              z('Z')
              {};
      };
      

      构造函数初始化器列表对于初始化其他成员也很有用,例如引用或不提供默认构造函数的复杂数据:

      const unsigned float PI = 3.14f;
      
      class Weird
      {
          Weird (int w);
          // no default ctor!
          int W;
      };
      
      class Foo
      {
          // Error: weird doesn't provide default ctor, 
          Weird w;
          // Error: reference uninitialized.
          float &pi;
      };
      
      class Bar
      {
          Bar() :
              // Ok, Weird is constructed correctly.
              w(1),
              // Ok, pi is initialized.
              pi(PI)
          {};
          Weird w;
          float &pi;
      };
      

      【讨论】:

        【解决方案5】:

        正如所有其他答案所断言的那样,您无法在初始化后更改 const 类成员的值。不过也有人觉得自己很聪明,用const_cast&lt;&gt;

        class A {
          const int x;
        public:
          A(int _x) : x(_x) {}
          void change_x(int _x)        // change x ?!
          { const_cast<int&>(x) = _x; }
        };
        

        使用 gnu 和 intel 编译器,这实际上可以在没有警告 AFAIK 的情况下编译,甚至可以工作。但这违反了语言规则并构成了可怕的 UB(未定义行为)。换句话说,它可能并不总是按预期工作,因为允许编译器假设 x 自初始化以来未更改。

        【讨论】:

          猜你喜欢
          • 2010-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-07
          • 2020-03-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多