2011-01-17 8 views
10

가능한 중복은 :
What is this weird colon-member syntax in the constructor?:: :: C++의 의미는 무엇입니까?

뭔가 항상 팝업 보인다하지만 난 모든 것을 알고 있다고 생각. 어쩌면 내가 뭔가를 잊고있다. : ::name은 무엇을 의미합니까? 나는 ::google의 의미는 글로벌 네임 스페이스에서 google, protobuf, message을 사용한다는 것을의 미합니다. 하지만 그 전에 :은 무엇을합니까? 왼쪽에는 텍스트가 없으므로 레이블이 될 수 없습니다 (또는 수 있습니까?!). 그래서 무엇입니까?

-edit- 나는 바보 같은 느낌이 들었다. 나는 함수 몸 안을보고 있다고 생각했다. 나는 그것이 새로운 무엇인가가되기를 바랬다.

+0

'네임 스페이스'는 클래스입니까? – Naveen

+4

분명히 그래서, 그것은 : google :: protobuf :: 메시지에서 파생 된 것으로 보입니다. – EboMike

+6

* 생성자 초기화 목록 *과 같은 중요한 기본 언어 기능에 대해 잘 모르는 경우에는 "모든 것을 알고 있습니다"와는 여전히 멀리 떨어져 있습니다. – AnT

답변

12

첫 번째 콜론 :은 실제로 이어지는 것이 초기화 목록입니다. 이것은 생성자의 본문이 실제로 실행되기 전에 클래스의 데이터 멤버에 초기 값 (따라서 이름)을 부여하는 방법으로 클래스의 생성자에 나타날 수 있습니다.

작은 예를 들어, 다른 형식 : 추가 참고로

class Foo { 
public: 
    Foo() : 
     x(3),  // int initialized to 3 
     str("Oi!"), // std::string initialized to be the string, "Oi!" 
     list(10) // std::vector<float> initialized with 10 values 
    { /* constructor body */ } 

private: 
    int x; 
    std::string str; 
    std::vector<float> list; 
}; 

편집

, 다른 하위 클래스 클래스가있는 경우, 방법 당신은 당신의 슈퍼 클래스 생성자는 다음과 같이 정확하게 호출 , 이니셜 라이저 목록 내부. 그러나 멤버의 이름을 지정하는 대신 수퍼 클래스의 이름을 지정합니다.

7

::은 전역 범위를 나타냅니다. 예 :

+0

-1 나는 이미 that :: global입니다. 그리고 그것은 내가 무슨 aske, 대답은 ':'무엇을 대답하지 않았다. –

+0

@ acidzombie24 잠깐, 내가 말한 것이 잘못 되었기 때문에 투표하지 마라. –

+1

아니요, 제 질문에 대답하지 않았기 때문에 투표했습니다. > "이름이 의미하는 것은 무엇입니까?"그리고 "하지만 그 전에 무엇을합니까?" –

19

생성자에서 변수 초기화 및/또는 부모 생성자 호출에 콜론을 사용합니다. 예를 들어 :

struct foo { 
    foo(); 
    foo(int var); 
}; 

struct bar : public foo { 
    bar(); 
    int x; 
}; 

이제 당신은 다음과 같이 표시 줄의 생성자를 할 수있는 :

bar::bar() 
: x(5) 
{ 
} 

5. X를 설정하거나 : int로서 8 foo는 두 번째 생성자를 사용

bar::bar() 
: foo(8) 
, x(3) 
{ 
} 

인수를 설정 한 다음 x를 3으로 설정합니다.

의 조합이 있으므로 코드에서 재미있어 보입니다. 초기화를 위해서는이고 글로벌 네임 스페이스를 얻으려면 ::.

+0

나는 어리석은 느낌이 들었다. 나는 함수 몸 안을보고 있다고 생각했다. +1하고 받아들입니다. –

+2

바보가 될 이유는 없습니다. 나는 처음에 이중 테이크를하게 만드는 많은 것들을 보았다. 일부 프로그래밍 언어는 실제로 마음이 혼란 스러울 수 있습니다. – EboMike

+0

완전하고 명확한 의견을 보내 주신 EboMike에게 감사드립니다. – Chavoosh

3

글로벌 네임 스페이스에서 확장되어 상속으로 작업하는 것으로 보입니다.

class baseClass{ 
    public: 
    int someVal; 
}; 

class childClass : baseClass 
{ 
    public: 
    int AnotherVal; 
} 

나중에 제공되는 답변은 훨씬 강력합니다.