편집 : 내 커피 휴식 시간 동안 내 초기 찌르고, static const int a;
는 영업 이익은 초기 의견 확인 마음에있는 사용 사례에 대해 작동하지 않습니다, 그래서 나는 다시 작성하고 내 대답을 확장하고있다.
대부분의 경우 클래스의 요소를 상수로 만들려고 할 때 항상 상수이고 클래스의 모든 인스턴스에서 상수 인 상수입니다. 이 경우, 나는 const 정적 변수를 사용
class Foo
{
public:
static const int a;
};
이 적용되는 경우, 그 과제의 문제를 해결하는 것, 그래서 사람들은, 인스턴스로 복사 할 필요가 없습니다. 불행히도, OP는 OP가 염두에두고있는 경우에는 작동하지 않을 것이라고 지적했습니다.
당신은 클라이언트가 수정할 수없는 읽기 전용 값을 만들려면, 당신은 그것을 개인 멤버 변수를 만들 수 있습니다 만이 스레드의 다른 게시물 등의 const를 getter 메소드를 통해 노출을 나타냅니다 :
class Foo
{
public:
int get_a() const { return a; }
private:
int a;
};
이것
class Foo
{
public:
const int a;
};
차이는 다음
const int
은 클래스의 구현조차도 객체 수명 기간 동안 a
의 값으로 머뭇 거리지 않을 것이라는 확신을줍니다. 즉, 개체가 생성 된 후에 a
의 값을 수정하려고하므로 할당이 올바로 작동하지 않습니다. (이유는, a
의 사본을 건너 뛰는 사용자 정의 operator=()
을 쓰는 것이 아마도 설계 상 나쁜 생각 일 것입니다.)
- 액세스가 다릅니다 – 직접 액세스하지 말고 게터를 통과해야합니다.
실제로 두 가지를 선택할 때 읽기 전용 멤버를 사용합니다. 이렇게하면 의미를 위반하지 않고 개체의 값을 다른 개체의 값으로 바꿀 수 있습니다. 당신의 경우에 그것이 어떻게 작동하는지 보겠습니다.
너비와 높이가있는 Grid 개체를 고려하십시오. 초기에 벡터를 만들었을 때 vector::reserve()
을 사용하여 초기 공간을 예약한다고 가정하면 벡터는 초기 기본 초기화 (즉, 비어있는) 그리드로 채워집니다.벡터의 특정 위치를 지정하거나 벡터 끝으로 그리드를 이동하면 해당 위치에있는 객체의 값을 실제 물건이있는 격자로 바꿉니다. 그러나 당신은 이것으로 괜찮을지도 모른다! 너비와 높이를 일정하게 유지하려는 이유가 너비와 높이와 나머지 Grid 객체 내용 사이에의 일관성을 보장하고 너비와 높이가 바뀌어도 상관 없다는 것을 확인했다면 Grid의 다른 요소가 교체되기 전이나 후에, 할당의 끝까지 인스턴스의 전체 내용이 대체되고 일관된 상태로 돌아 오기 때문에이 할당은 안전해야합니다. (기본 할당 의 자성의 부족이 문제라면, 당신은 아마 복사 생성자와 swap()
작업을 사용하여 자신의 할당 연산자를 구현하여이 문제를 얻을 수 있습니다.)
요약하면, 당신에 의해 얻을 것 읽기 전용 getter를 사용하면 벡터 또는 값 의미를 가진 컨테이너의 객체를 사용할 수 있습니다. 그러나 컴파일러가 너비와 높이를 잠그지 않으므로 Grid의 내부 연산 (또는 Grid의 친구들 연산)이이 일관성을 위반하지 않도록해야합니다. 이는 기본 구성, 복사본 구성 및 할당에도 적용됩니다.
정확히 const 멤버가 필요한 이유는 무엇입니까? 'Foo'는 실제로 무엇입니까? – fredoverflow