132
#include <iostream>

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

  T1()
  {

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

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

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

如何初始化一个const值?

4

11 回答 11

141

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

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

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

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

T1() : t( 100 ){}

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

于 2013-01-24T07:22:23.787 回答
61

好吧,你可以做到static

static const int t = 100;

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

T1() : t(100)
{
    // Other constructor stuff here
}
于 2013-01-24T06:56:31.420 回答
40

有几种方法可以初始化类中的 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
};
于 2014-06-25T03:56:12.093 回答
19

如果您不想使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){}
于 2017-06-03T20:52:05.947 回答
14
  1. 您可以升级您的编译器以支持 C++11,您的代码将完美运行。

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

    T1() : t( 100 )
    {
    }
    
于 2013-01-24T06:57:29.387 回答
7

另一种解决方案是

class T1
{
    enum
    {
        t = 100
    };

    public:
    T1();
};

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

于 2014-11-18T10:46:02.553 回答
3

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

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) {}
};
于 2016-10-01T04:35:14.953 回答
2

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

#include <iostream>

namespace mySpace {
   static const int T = 100; 
}

using namespace std;

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

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

于 2016-03-12T18:27:14.483 回答
1

这是正确的做法。你可以试试这段代码。

#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那么您不能在声明时初始化 cons 成员。所以这里必须让构造函数初始化 const 数据成员。还必须使用初始化列表T1():t(100)来即时获取内存。

于 2018-11-11T11:52:08.270 回答
0

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

static const int i = 100;

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

于 2017-05-19T14:46:30.970 回答
0

在 C++ 中,您不能在声明时直接初始化任何变量。为此,我们必须使用构造函数的概念。
见这个例子: -

#include <iostream>

using namespace std;

class A
{
    public:
  const int x;  
  
  A():x(0) //initializing the value of x to 0
  {
      //constructor
  }
};

int main()
{
    A a; //creating object
   cout << "Value of x:- " <<a.x<<endl; 
   
   return 0;
}

希望对你有帮助!

于 2020-09-23T04:42:41.850 回答