클래스에서 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
};
C ++ 11을 지원하도록 컴파일러를 업그레이드하면 코드가 완벽하게 작동합니다.
생성자에서 초기화 목록을 사용합니다.
T1() : t( 100 ) { }
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){}
또 다른 해결책은
class T1
{
enum
{
t = 100
};
public:
T1();
};
따라서 t는 100으로 초기화되고 변경할 수 없으며 비공개입니다.
If a member is a Array it will be a little bit complex than the normal is:
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};
or
int* a = new int[N];
// fill a
class C {
const std::vector<int> v;
public:
C():v(a, a+N) {}
};
Another possible way are namespaces:
#include <iostream>
namespace mySpace {
static const int T = 100;
}
using namespace std;
class T1
{
public:
T1()
{
cout << "T1 constructor: " << mySpace::T << endl;
}
};
The disadvantage is that other classes can also use the constants if they include the header file.
This is the right way to do. You can try this code.
#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;
}
if you are using C++10 Compiler or below
then you can not initialize the cons member at the time of declaration. So here it is must to make constructor to initialise the const data member. It is also must to use initialiser list T1():t(100)
to get memory at instant.
you can add static
to make possible the initialization of this class member variable.
static const int i = 100;
However, this is not always a good practice to use inside class declaration, because all objects instacied from that class will shares the same static variable which is stored in internal memory outside of the scope memory of instantiated objects.
참고URL : https://stackoverflow.com/questions/14495536/how-to-initialize-const-member-variable-in-a-class
'programing tip' 카테고리의 다른 글
글로벌 ASP.Net 웹 API 필터를 추가하는 방법은 무엇입니까? (0) | 2020.08.25 |
---|---|
PostgreSQL에서 초 단위의 타임 스탬프 차이 찾기 (0) | 2020.08.25 |
CMake에 대한 새 GCC 경로를 지정하는 방법 (0) | 2020.08.25 |
배치 파일을 사용하여 현재 작업 디렉토리를 변경하는 방법 (0) | 2020.08.25 |
SQL Developer에서 변수 값 인쇄 (0) | 2020.08.25 |