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

Cha*_*nya 97 c++ const

#include <iostream>

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

  T1()
  {

    cout << "T1 constructor: " << t << endl;
  }
};
Run Code Online (Sandbox Code Playgroud)

当我尝试t用100. 初始化const成员变量时,但是它给了我以下错误:

test.cpp:21: error: ISO C++ forbids initialization of member ‘t’
test.cpp:21: error: making ‘t’ static
Run Code Online (Sandbox Code Playgroud)

如何初始化const值?

Din*_*kur 105

const变量指定变量是否为可修改的或没有.每次引用变量时,将使用分配的常量值.在程序执行期间,不能修改分配的值.

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

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

一个const变量要在类中声明,但它不能在它被定义.我们需要在类外定义const变量.

T1() : t( 100 ){}
Run Code Online (Sandbox Code Playgroud)

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

  • 当你使用某人没有归属的确切词语时,它被称为抄袭.请使用正确的归属信息 - 请参阅http://www.stroustrup.com/bs_faq2.html#in-class和http://stackoverflow.com/questions/13662441/c11-allows-in-class-initialization-of-non-静态和非const成员-什么-C (4认同)
  • 你能不能详细说明最后一句话`这里初始化列表中的i = 10赋值发生在类initilizaiton发生之前.我得到了这个.基本上这种允许类中的定义是编译器特定的吗? (3认同)
  • 我= 10个任务? (3认同)

Fre*_*son 46

好吧,你可以做到static:

static const int t = 100;
Run Code Online (Sandbox Code Playgroud)

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

T1() : t(100)
{
    // Other constructor stuff here
}
Run Code Online (Sandbox Code Playgroud)

  • @Cititanya:C++ 11非静态成员初始值设定项是从gcc 4.7实现的. (3认同)
  • 对于他的使用(和/或意图),使它静止是更好的. (2认同)

小智 28

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

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

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

static const int a = 10; //at declaration
Run Code Online (Sandbox Code Playgroud)

2)第二种方式可以

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

const int A::a = 10; //defining the static member outside the class
Run Code Online (Sandbox Code Playgroud)

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

class A
{
  const int b;
  A(int c) : b(c) {} //const member initialized in initialization list
};
Run Code Online (Sandbox Code Playgroud)

  • 我认为这个答案需要澄清.对类成员使用static关键字不会添加一些任意语法来使编译器满意.这意味着对象的所有实例都有一个变量的副本,常量或不常量.这是一个需要仔细考虑的设计选择.尽管在给定对象的生命周期内保持不变,程序员可能会认为这个常量类成员仍然可以根据不同的对象而变化. (8认同)

bor*_*sbn 12

  1. 您可以升级编译器以支持C++ 11,您的代码将完美运行.

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

    T1() : t( 100 )
    {
    }
    
    Run Code Online (Sandbox Code Playgroud)


小智 9

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

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

Example::Example(int n):x(n){
}
Run Code Online (Sandbox Code Playgroud)

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

Example::Example(int n, int z):x(n),someOtherConstVariable(z){}
Run Code Online (Sandbox Code Playgroud)

  • 我认为这提供了比被接受的更好的答案。 (2认同)
  • 感谢您提供清晰的示例以及显示多个的变体!消除了读者的歧义和额外的研究/滚动! (2认同)

小智 5

另一个解决方案是

class T1
{
    enum
    {
        t = 100
    };

    public:
    T1();
};
Run Code Online (Sandbox Code Playgroud)

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