C ++에서 연산자 ::
는 네임 스페이스 또는 클래스의 클래스, 함수 및 변수에 액세스하는 데 사용됩니다.
언어 명세를 사용하는 경우 .
대신 ::
인스턴스 변수 다음 객체 / 방법을 액세스 할 때와 같이 너무 이러한 경우에서와 함께 존재하지 않는 것을 원인 가능한 모호함 ::
?
C ++에서 유형 이름 인 변수 이름을 허용하지 않기 때문에 발생할 수있는 경우를 생각할 수 없습니다.
설명 : 나는 왜 그것이 효과 ::
가 있었을 지에 대해 왜 선택 되었는지 묻지 않고 .
있습니까?
답변
C ++가 기존 C 코드와 대부분 호환되도록 (오브젝트 이름과 구조체 태그 사이의 이름 충돌을 허용 함) 시도하기 때문에 C ++은 클래스 이름과 객체 이름 사이의 이름 충돌을 허용합니다.
의미하는 것은:
struct data {
static int member;
};
struct data2 {
int member;
};
void f(data2& data) {
data.member = data::member;
}
합법적 인 코드입니다.
답변
둘 다 유효하지만 다른 객체를 참조하는 예 :
#include <iostream>
struct A {
int i;
};
struct B {
int i;
A B;
};
int main() {
B x {0, 1};
std::cout << x.B.i << '\n';
std::cout << x.B::i << '\n';
}
coliru에서 라이브를 참조하십시오 .
답변
차이가 존재 a::b
하고 a.b
여기서 ::
것을 의미 a
는 네임 또는 유형 이름은 즉, 네임 스페이스로하는 방법을 사용 하였다. C ++이 비가 상 복수 상속을 지원하고 변수가 유형과 동일한 이름을 가질 수있는 경우 잘못된 객체를 참조 할 가능성이 줄어 듭니다. 템플릿 메타 프로그래밍에 필요합니다.
또 다른 예는 클래스 B와 관련하여 &B::foo
vs &B.foo
입니다.
답변
@Deduplicator 예제를 확장하자 :
#include <iostream>
struct A {
int i;
};
struct B : public A {
int i;
A A;
};
int main() {
B x {1, 2};
std::cout << x.i << '\n';
std::cout << x.B::i << '\n'; // The same as the line above.
std::cout << x.A.i << '\n';
std::cout << x.A::i << '\n'; // Not the same as the line above.
}
::의 도움으로 구별 할 가능성이 없는데, 우리가 접근하고자하는 멤버라면, 같은 이름으로 부모 클래스에 선언 된 멤버에 접근하는 것은 불가능합니다.