C ++ 표준 (9.2.3.2 정적 데이터 멤버)에 따름
1 정적 데이터 멤버는 클래스의 하위 개체에 속하지 않습니다 ...
그리고 (9.2.2.1 this 포인터)
1 비 정적 (9.2.1) 멤버 함수의 본문에서 this 키워드는 해당 값이 함수가 호출되는 객체의 주소 인 prvalue 표현식입니다. 클래스 X의 멤버 함수에서 이것의 유형은 X *입니다. 멤버 함수가 const로 선언 된 경우이 유형은 const X * , ...
그리고 마침내 (9.2.2 비 정적 멤버 함수)
3 ... 이름 조회 (3.4)가 id-expression의 이름을 일부 클래스 C의 비 정적 비 유형 멤버로 확인하고 id-expression이 잠재적으로 평가되거나 C가 X 또는 기본 클래스 인 경우 X의 경우 id-expression은 (* this) (9.2.2.1)을. 운영자.
따라서이 클래스 정의에서
class A
{
public:
static int a;
void set() const
{
a = 10;
}
};
정적 데이터 멤버 a
는 클래스 유형의 개체의 하위 개체 this
가 아니며 포인터 는 정적 데이터 멤버에 액세스하는 데 사용되지 않습니다. 따라서 멤버 함수, 비 정적 상수 또는 비상 수 또는 정적 멤버 함수는 상수가 아니기 때문에 데이터 멤버를 변경할 수 있습니다.
이 클래스 정의에서
class A
{
public:
int a;
void set() const
{
a = 10;
}
};
비 정적 데이터 멤버 a
는 클래스 유형 객체의 하위 객체입니다. 멤버 함수에서 액세스하려면이 구문의 멤버 액세스 구문이 내포되어 있습니다. 상수 포인터 this
를 사용 하여 데이터 멤버를 수정할 수 없습니다 . 그리고 포인터 this는 실제로 함수가 한정자로 선언되기 때문에 const A *
함수 내에서 유형을 set
갖습니다 const
. 이 경우 함수에 한정자가 없으면 데이터 멤버를 변경할 수 있습니다.