#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){}
답변
-
C ++ 11을 지원하도록 컴파일러를 업그레이드하면 코드가 완벽하게 작동합니다.
-
생성자에서 초기화 목록을 사용합니다.
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) {}
};