2009-12-09 2 views
2

대 내가 C++ 자바 배경에서 오는 (전 수년에서 약간의 C를 알고)를 배우고 C++에서 변수 이름 ... 자바에서생성자 및 Java

, 그것은 일반적인 관행 "이"를 사용하는의 생성자 내부의 클래스에 선언 된 하나에서 생성자에 인수로 전달 된 변수 구별 : 좋아요

class Blabla { 

    private int a; 
    private int b; 

    Blabla(int a, int b){ 
     this.a = a; 
     this.b = b; 
    } 
} 

을 변수 Blabla.a 생성자에 인수로 전달 된 하나 때문에 똑같은 것을 나타내므로 같은 이름을 가져야한다는 것이 논리적이라고 느낀다 ...

C++에서이 작업을 수행 할 수 있습니까?

답변

6

예, this을 사용하여 멤버 변수를 참조 할 수 있습니다. 관용적 C에서 다음과 같이 그는 말했다, 당신은 종종 ++ 코드를 보이는 것을 확인할 수있는 것들 : 당신이 볼 수 있듯이

class Blabla { 
    private: 
    int a_; 
    int b_; 

    public: 
    Blabla(int a, int b) : a_(a), b_(b) {} 
}; 

, 당신은 일반적으로 각 구성원에 대한 액세스 제어 지정 (public, protected 또는 private)를 적용하지 않는다, 그러나 당신은 섹션에서 그들을 그룹화합니다.

또한 위에 사용 된 초기화 유형을 사용하는 경우 멤버는 개체 생성시 기본적으로 두 번 초기화됩니다 (기본적으로 중괄호 안의 코드가 실행되기 전에). 두 번째 과제 중 시간은 this->a입니다.

+0

동의하지만, 이중화 초기화를 피하기 위해 최적화 컴파일러를 기대합니다. –

+0

int와 같은 기본 유형은 두 번 초기화되지 않으며 클래스 유형은 초기화되지 않습니다. 생성자가 기본 유형의 멤버 변수를 초기화하지 않으면 생성 후에 완전히 초기화되지 않습니다. –

4

예, 당신은 또한 당신의 생성자에서 초기화 목록을 사용합니다 ++ C에서 점에 유의

this->a = a;를 사용합니다.

class Blab 
{ 
    public: 
     Blab(int a, int b) 
      :m_a(a), 
      m_b(b) 
     { 
     } 

    private: 
     int m_a; 
     int m_b; 
}; 

편집 :

당신은 당신의 데이터 멤버 A와 생성자에 전달 된 매개 변수에 동일한 이름을 사용하여 초기화 목록에 :a(a), b(b)을 사용할 수 있습니다. 그것들은 다를 필요는 없지만, 멤버 변수 이름에 다른 명명 규칙을 사용하는 것이 더 나은 습관이라고 생각하는 사람들도 있습니다. 위의 예제에서 다른 이름을 사용하여 초기화 목록이 실제로 수행 한 작업과 사용 방법을 명확히했습니다. 원하는 경우 this->a을 사용하여 다른 멤버 변수를 설정할 수 있습니다. 예를 들어, 멤버 변수와 매개 변수 둘 모두와 B

class MyClass 
{ 
    public: 
     MyClass(int a, int b); 
    private: 
     int a; 
     int b; 
}; 

// Some valid init lists for the MyClass Constructor would be 
:a(a), b(b)  // Init member a with param a and member b with parameter b 
:a(a), b(this->a) // Init member a with param a and init member b with member a (ignores param b) 
:a(5), b(25)  // Init member a with 5 and init member b with 25 (ignoring both params) 

그 초기화리스트들은 클래스 정의에 나타나는 순서대로 멤버 변수를 초기화하기해야 언급되어야한다 경우. 좋은 컴파일러는 그렇지 않을 때 경고를 줄 것입니다.

+1

Erm ... 이니셜 라이저 목록에서'this-> a'를 사용할 수 없습니다. 초기화 될 멤버는 이름만으로 지정해야합니다 : Blab (int a, int b) : a (a), b (b) {}' –

+0

@Steve. 네, 코드를 작성할 때 "행복하다"고 생각합니다. 내 대답을 업데이트했습니다 –

+4

당신은 밑줄이 필요하지 않습니다 : 이니셜 라이저'a (a)'는 'a'매개 변수를 사용하여 'a'멤버를 초기화합니다. 동료들에 의해 촬영되었는지 여부는 또 다른 문제입니다. 또한'Blab (int a) : a (a), b (this-> a) {}'와 같은 표현식에서'this'를 사용할 수 있습니다. –

1

this이 포인터이기 때문에 this->var을 사용하여 멤버 변수에 액세스합니다.

C++은 Java와는 다른 규칙을 사용하는 경향이 있으며 일반적인 Java 방법 인 this.var 대신 일반 변수에 _var을 사용하는 것이 일반적입니다. 물론, 당신이 사용하고자하는 대회에 달려 있습니다.

+2

비록 내가 m_ *가 _ *보다 창고의 시력으로 사용된다고 주장 할지라도. 그것은 정말로 doesn'tmatter. – Goz

+0

@Goz : MS는 m_ *를 사용하기 때문에 도구/프레임 워크에 익숙한 사람들은 자주 동일한 작업을 수행합니다. 상당수의 사람들은 대신 * _를 사용합니다. 어쨌든'this -> *'는 매우 드문 경우이며, IME는 거의 코드 냄새가 난다. 대부분의 코드는 상대적으로 빈약 한 것으로 보인다. –

+2

사실, _var 같은 이름을 사용하는 것은 좋은 생각이 아닙니다. 선행 밑줄은 컴파일러와 라이브러리 구현자를 위해 예약되어 있습니다 (기술적으로 규칙에는 두 개의 밑줄과 대문자, 밑줄이 하나). –

0

그냥 요약하여 한 가지 대답으로 넣으십시오.

당신은이

class Blabla 
{ 
    private: 
     int a; 
     int b; 

    public: 
     Blabla(int a, int b); 
} 

Blabla::Blabla(int a, int b) 
{ 
    this->a = a; 
    this->b = b; 
} 

과 같을 것이다 또는 당신과 함께 C++ 방법을 사용하는 경우 this-> 방법을 사용하고자하는 경우 다음의 (a)는이

class Blabla 
{ 
    private: 
     int a; 
     int b; 

    public: 
     Blabla(int a, int b); 
} 

Blabla::Blabla(int a, int b):a(a), b(b) 
{ 
} 
과 같을 것이다

개인적으로는 this-> a가 m_a 또는 c 스타일과 같이 앞에 문자를 입력하는 헝가리 표기법보다 더 읽기 쉬운 코드로 이어진다 고 생각합니다.