C+클래스 멤버 초기 화

3869 단어 C++
C++프로 그래 밍 을 사용 하 는 과정 에서 클래스 구성원 을 초기 화 해 야 합 니 다.일반적인 방법 은 두 가지 가 있 습 니 다.
첫 번 째 방법:
CMYClass::CSomeClass()

{

    x=0;

    y=1;

}

두 번 째 방법:
CSomeClass::CSomeClass() : x(0), y(1)

{

}

본 고 는 이 두 가지 방법의 공통점 과 차이 점,그리고 이 두 가지 방법 을 어떻게 사용 하 는 지 연구 하고 자 한다.
    기술적 으로 두 번 째 방법 이 좋 지만 대부분 상황 에서 이들 은 사실상 별 차이 가 없다.두 번 째 문법 은 구성원 초기 화 목록 이 라 고 불 린 다.이런 문법 을 사용 하려 면 두 가지 이유 가 있다.하 나 는 반드시 이렇게 해 야 하기 때문이다.다른 하 나 는 효율 적 인 고려 에서 비롯 된 것 이다.
    첫 번 째 이유 인 필요 성 을 살 펴 보 자.하나의 구성원 이 있다 고 생각 하 세 요.그 자체 가 하나의 유형 이나 구조 이 고 하나의 매개 변 수 를 가 진 구조 함수 만 있 습 니 다.
class CMember {

public:

    CMember(int x) { ... }

};

    CMember 는 명시 적 으로 설 명 된 구조 함수 가 있 기 때문에 컴 파일 러 는 구조 함수 가 부족 하지 않 기 때문에 정수 가 하나 도 없 으 면 CMember 의 인 스 턴 스 를 만 들 수 없습니다.
CMember* pm = new CMember;        //   !!

CMember* pm = new CMember(2);     // OK

    CMember 가 다른 종류의 멤버 라면 어떻게 초기 화 합 니까?정 답 은 멤버 초기 화 목록 을 사용 해 야 한 다 는 것 이다.
class CMyClass {

    CMember m_member;

public:

    CMyClass();

};

//                 m_member

CMyClass::CMyClass() : m_member(2)



{

•••

}

    m 에 인 자 를 전달 할 다른 방법 이 없습니다.member,멤버 가 상수 대상 이거 나 인용 이 라면 마찬가지 입 니 다.C++의 규칙 에 따라 상수 대상 과 인용 은 할당 되 지 않 고 초기 화 될 수 있 습 니 다.
    초기 화 목록 을 사용 하 는 두 번 째 이 유 는 효율 적 인 고려 에서 비롯 되 었 습 니 다.구성원 류 가 부족 한 구조 함수 와 할당 연산 자 를 가지 고 있 을 때 입 니 다.MFC 의 CString 은 완벽 한 예 를 제공 했다.CMy Class 가 CString 형식의 멤버 m 를 가지 고 있다 고 가정 합 니 다.str,"Hi,how are you."로 초기 화하 고 싶 습 니 다.당신 은 두 가지 선택 이 있 습 니 다.
CMyClass::CMyClass() {

//        

// CString::operator=(LPCTSTR);

m_str = _T("Hi,how are you.");

}
//        

//       CString::CString(LPCTSTR)

CMyClass::CMyClass() : m_str(_T("Hi,how are you."))

{

}

    그들 사이 에는 어떤 차이 가 있 습 니까?예.컴 파 일 러 는 항상 모든 구성원 대상 이 구조 함수 체 가 실행 되 기 전에 초기 화 되 는 것 을 확보 하기 때문에 첫 번 째 예 에서 컴 파 일 된 코드 는 CString::Cstring 을 사용 하여 m 를 초기 화 합 니 다.str,이것 은 할당 문 구 를 제어 하기 전에 완 료 됩 니 다.두 번 째 예 에서 컴 파 일 러 는 CString::CString(LPCTSTR)을 호출 하고"Hi,how are you."를 이 함수 에 전달 합 니 다.결 과 는 첫 번 째 예 에서 두 개의 CString 함수(구조 함수 와 할당 연산 자)를 호출 했 고 두 번 째 예 에서 한 함수 만 호출 했다.
    CString 의 예 에서 이것 은 상 관 없 는 것 입 니 다.구조 함수 가 부족 한 것 은 내 연 된 것 이기 때 문 입 니 다.CString 은 필요 할 때 문자열 에 메모리(즉,실제 값 을 할당 할 때)를 할당 합 니 다.그러나 일반적으로 중복 되 는 함수 호출 은 자원 을 낭비 하 는 것 이다.특히 구조 함수 와 할당 연산 자가 메모 리 를 분배 할 때.일부 큰 클래스 에 서 는 구조 함수 와 할당 연산 자 를 가지 고 있 을 수 있 습 니 다.대량의 메모리 공간 을 분배 하 는 Init 함 수 를 호출 해 야 합 니 다.이 경우 두 번 의 메모 리 를 할당 하지 않도록 초기 화 목록 을 사용 해 야 합 니 다.
    내 장 된 유형,예 를 들 어 ints 나 longs 또는 다른 구조 함수 가 없 는 유형 에서 초기 화 목록 과 구조 함수 의 체 내 에서 값 을 부여 하 는 두 가지 방법 은 성능 상의 차이 가 없다.그 방법 을 사용 하 더 라 도 한 번 의 할당 만 발생 할 수 있다.어떤 프로그래머 들 은 항상 목록 을 초기 화하 여 좋 은 습관 을 유지 해 야 한다 고 말 하지만,나 는 필요 에 따라 이 두 가지 방법 사이 에서 전환 하 는 데 어떤 어려움 이 있 는 지 발견 하지 못 했다.프로 그래 밍 스타일 에 있어 서 저 는 주체 에서 할당 을 사용 하 는 경향 이 있 습 니 다.주석 을 포맷 하고 추가 할 공간 이 더 많 기 때문에 이런 문 구 를 쓸 수 있 습 니 다.
x=y=z=0;

혹은
memset(this,0,sizeof(this));

두 번 째 세 션 은 절대 대상 이 아 닙 니 다.
    목록 을 초기 화 하 는 문 제 를 고려 할 때 이상 한 특성 이 있 습 니 다.C++초기 화 클래스 구성원 에 관 한 것 입 니 다.초기 화 목록 에 나타 나 는 순서 가 아니 라 성명 순서에 따라 초기 화 되 었 습 니 다.
class CMyClass {

    CMyClass(int x, int y);

    int m_x;

    int m_y;

};

CMyClass::CMyClass(int i) : m_y(i), m_x(m_y)

{

}

    너 는 위의 코드 가 먼저 m 를 만 들 것 이 라 고 생각 할 지도 모른다.y=i,그리고 mx=m_y,마지막 으로 그것들 은 같은 값 을 가지 고 있다.하지만 컴 파일 러 는 m 를 초기 화 합 니 다.x,그리고 my,왜냐하면 그것들 은 이런 순서에 따라 성명 하기 때문이다.결 과 는 mx 는 예측 할 수 없 는 값 이 있 을 것 이다.이 예 는 고의로 이렇게 설계 하여 이 점 을 설명 하 는 것 이지 만,이러한 bug 는 매우 자 연 스 럽 게 나타 날 것 이다.두 가지 방법 으로 그것 을 피 할 수 있 습 니 다.하 나 는 항상 초기 화 되 기 를 원 하 는 순서에 따라 구성원 을 설명 하 는 것 입 니 다.두 번 째 는 초기 화 목록 을 사용 하기 로 결정 하면 항상 성명 의 순서에 따라 이 구성원 들 을 나열 하 는 것 입 니 다.이것 은 혼동 을 없 애 는 데 도움 이 될 것 이다.

좋은 웹페이지 즐겨찾기