c ++ - 如何在类中初始化const成员变量?

#include <iostream>

using namespace std;
class T1
{
  const int t = 100;
  public:

  T1()
  {

    cout << "T1 constructor: " << t << endl;
  }
};

当我试图用100.初始化const成员变量t但它给我以下错误:

test.cpp:21: error: ISO C++ forbids initialization of member ‘t’
test.cpp:21: error: making ‘t’ static

如何初始化const值?

Chaitanya asked 2019-09-11T06:00:39Z
10个解决方案
103 votes

t = 100变量指定变量是否可修改。 每次引用变量时,将使用分配的常量值。 在程序执行期间,不能修改分配的值。

Bjarne Stroustrup的解释简要总结了一下:

类通常在头文件中声明,并且头文件通常包含在许多翻译单元中。 但是,为避免复杂的链接器规则,C ++要求每个对象都有唯一的定义。 如果C ++允许将需要作为对象存储在内存中的实体的类内定义,则该规则将被破坏。

必须在类中声明t = 100变量,但不能在其中定义。 我们需要在类外定义const变量。

T1() : t( 100 ){}

这里的赋值t = 100发生在初始化列表中,远在类初始化发生之前。

Dinkar Thakur answered 2019-09-11T06:01:17Z
44 votes

好吧,你可以把它变成static

static const int t = 100;

或者您可以使用成员初始化程序:

T1() : t(100)
{
    // Other constructor stuff here
}
Fred Larson answered 2019-09-11T06:01:48Z
27 votes

有几种方法可以初始化类中的const成员..

const成员的定义一般来说,也需要变量的初始化..

1)在类中,如果要初始化const,语法就是这样

static const int a = 10; //at declaration

2)第二种方式可以

class A
{
  static const int a; //declaration
};

const int A::a = 10; //defining the static member outside the class

3)如果你不想在声明中初始化,那么另一种方法是通过构造函数,变量需要在初始化列表中初始化(而不是在构造函数的主体中)。 它必须是这样的

class A
{
  const int b;
  A(int c) : b(c) {} //const member initialized in initialization list
};
ravs2627 answered 2019-09-11T06:02:39Z
12 votes
  1. 您可以升级编译器以支持C ++ 11,您的代码将完美运行。

  2. 在构造函数中使用初始化列表。

    T1() : t( 100 )
    {
    }
    
borisbn answered 2019-09-11T06:03:17Z
8 votes

如果您不想在类静态中创建const数据成员,则可以使用类的构造函数初始化const数据成员。例如:

class Example{
      const int x;
    public:
      Example(int n);
};

Example::Example(int n):x(n){
}

如果类中有多个const数据成员,则可以使用以下语法初始化成员:

Example::Example(int n, int z):x(n),someOtherConstVariable(z){}
GANESH B K answered 2019-09-11T06:03:50Z
5 votes

另一个解决方案是

class T1
{
    enum
    {
        t = 100
    };

    public:
    T1();
};

所以t初始化为100,它不能被改变,它是私有的。

Musky answered 2019-09-11T06:04:22Z
3 votes

如果一个成员是一个数组,它将比正常情况稍微复杂一点:

class C
{
    static const int ARRAY[10];
 public:
    C() {}
};
const unsigned int C::ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};

要么

int* a = new int[N];
// fill a

class C {
  const std::vector<int> v;
public:
  C():v(a, a+N) {}
};
Viet Anh Do answered 2019-09-11T06:04:50Z
2 votes

另一种可能的方式是命名空间:

#include <iostream>

namespace mySpace {
   static const int T = 100; 
}

using namespace std;

class T1
{
   public:
   T1()
   {
       cout << "T1 constructor: " << mySpace::T << endl;
   }
};

缺点是其他类也可以使用常量,如果它们包含头文件。

Baran answered 2019-09-11T06:05:23Z
0 votes

您可以添加static以使此类成员变量的初始化成为可能。

static const int i = 100;

但是,使用内部类声明并不总是一个好习惯,因为从该类实例化的所有对象将共享相同的静态变量,该静态变量存储在实例化对象的作用域内存之外的内部存储器中。

dhokar.w answered 2019-09-11T06:05:56Z
0 votes

这是正确的方法。 您可以尝试此代码。

#include <iostream>

using namespace std;

class T1 {
    const int t;

    public:
        T1():t(100) {
            cout << "T1 constructor: " << t << endl;
        }
};

int main() {
    T1 obj;
    return 0;
}

如果您使用的是C++10 Compiler or below,那么您无法在声明时初始化利弊成员。 所以这里必须使构造函数初始化const数据成员。 也必须使用初始化列表T1():t(100)即时获取内存。

Gambler Aziz answered 2019-09-11T06:06:30Z
translate from https://stackoverflow.com:/questions/14495536/how-to-initialize-const-member-variable-in-a-class