클래스에서 const 멤버 변수를 초기화하는 방법은 무엇입니까? {

#include <iostream>

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

  T1()
  {

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

const 멤버 변수 t를 100 으로 초기화하려고 할 때 .하지만 다음과 같은 오류가 발생합니다.

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

const값을 초기화하려면 어떻게 해야합니까?



답변

const변수를 지정하는 변수 수정 여부. 할당 된 상수 값은 변수가 참조 될 때마다 사용됩니다. 할당 된 값은 프로그램 실행 중 수정할 수 없습니다.

Bjarne Stroustrup의 설명은 이를 간략하게 요약합니다.

클래스는 일반적으로 헤더 파일에서 선언되고 헤더 파일은 일반적으로 많은 변환 단위에 포함됩니다. 그러나 복잡한 링커 규칙을 피하기 위해 C ++에서는 모든 개체에 고유 한 정의가 있어야합니다. C ++에서 객체로 메모리에 저장해야하는 엔티티의 클래스 내 정의를 허용하면 해당 규칙이 깨집니다.

const변수는 클래스 내에서 선언되어야하지만, 그 안에 정의 할 수 없습니다. 클래스 외부에서 const 변수를 정의해야합니다.

T1() : t( 100 ){}

여기서 할당 t = 100은 클래스 초기화가 발생하기 훨씬 전에 이니셜 라이저 목록에서 발생합니다.


답변

글쎄, 당신은 그것을 만들 수 있습니다 static.

static const int t = 100;

또는 멤버 이니셜 라이저를 사용할 수 있습니다.

T1() : t(100)
{
    // Other constructor stuff here
}


답변

클래스 내에서 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
};


답변

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){}


답변

  1. C ++ 11을 지원하도록 컴파일러를 업그레이드하면 코드가 완벽하게 작동합니다.

  2. 생성자에서 초기화 목록을 사용합니다.

    T1() : t( 100 )
    {
    }

답변

또 다른 해결책은

class T1
{
    enum
    {
        t = 100
    };

    public:
    T1();
};

따라서 t는 100으로 초기화되고 변경할 수 없으며 비공개입니다.


답변

멤버가 배열 인 경우 일반적인 경우보다 약간 복잡합니다.

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) {}
};