C++목록 초기 화 상세 설명 및 인 스 턴 스 코드

4642 단어 C++목록 초기 화
C++목록 초기 화
초기 화 목록 이란 무엇 인가
다른 함수 와 달리 구조 함 수 는 이름,매개 변수 목록,함수 체 외 에 도 목록 을 초기 화 할 수 있 습 니 다.목록 을 콜론 으로 시작 하고 쉼표 로 구 분 된 일련의 초기 화 필드 를 초기 화 할 수 있 습 니 다.C++에서 struct 와 class 의 유일한 차 이 는 기본 적 인 접근 성 이 다르다 는 것 입 니 다.여 기 는 접근 성 문 제 를 고려 하지 않 기 때문에 아래 코드 는 모두 struct 로 보 여 줍 니 다.

struct foo
{
  string name ;
  int id ;
  foo(string s, int i):name(s), id(i){} ; //      
};
구조 함수 의 두 실행 단계
구조 함수 의 집행 은 두 단계 로 나 눌 수 있 으 며 초기 화 단계 와 계산 단계 로 나 눌 수 있 으 며 초기 화 단 계 는 계산 단계 보다 앞 선다.
초기 화 단계
모든 클래스 형식(class type)의 구성원 은 초기 화 단계 에서 초기 화 됩 니 다.이 구성원 이 구조 함수 의 초기 화 목록 에 나타 나 지 않 았 더 라 도.
계산 단계
일반적으로 구조 함수 의 체 내 할당 작업 을 수행 하 는 데 사 용 됩 니 다.아래 의 코드 는 두 개의 구조 체 를 정의 합 니 다.그 중에서 Test 1 은 구조 함수,구조 함수 와 할당 연산 자 를 복사 하여 결 과 를 쉽게 볼 수 있 도록 합 니 다.Test 2 는 테스트 클래스 입 니 다.Test 1 의 대상 을 구성원 으로 합 니 다.Test 2 의 구조 함수 가 어떻게 실행 되 는 지 살 펴 보 겠 습 니 다.

struct Test1
{
  Test1() //       
  { 
    cout << "Construct Test1" << endl ;
  }

  Test1(const Test1& t1) //       
  {
    cout << "Copy constructor for Test1" << endl ;
    this->a = t1.a ;
  }

  Test1& operator = (const Test1& t1) //      
  {
    cout << "assignment for Test1" << endl ;
    this->a = t1.a ;
    return *this;
  }

  int a ;
};

struct Test2
{
  Test1 test1 ;
  Test2(Test1 &t1)
  {
    test1 = t1 ;
  }
};

호출 코드

Test1 t1 ;
Test2 t2(t1) ;
출력

첫 번 째 줄 의 출력 은 호출 코드 의 첫 번 째 줄 에 대응 하여 Test 1 대상 을 구성 합 니 다.두 번 째 줄 은 Test 2 구조 함수 에 대응 하 는 코드 를 출력 하고 기본 구조 함수 로 대상 test 1 을 초기 화 합 니 다.이것 이 바로 초기 화 단계 입 니 다.세 번 째 줄 출력 은 Test 1 의 할당 연산 자 에 대응 하고 test 1 에 대해 할당 작업 을 수행 합 니 다.이것 이 바로 계산 단계 입 니 다.
왜 초기 화 목록 을 사용 합 니까?
초기 화 클래스 의 구성원 은 두 가지 방식 이 있 습 니 다.하 나 는 초기 화 목록 을 사용 하 는 것 이 고,다른 하 나 는 구조 함수 에서 할당 작업 을 하 는 것 입 니 다.초기 화 목록 을 사용 하 는 것 은 주로 성능 문제 에 기반 한 것 입 니 다.내 장 된 유형,예 를 들 어 int,float 등 초기 화 클래스 표를 사용 하 는 것 과 구조 함수 에서 초기 화 하 는 것 은 큰 차이 가 없 지만 클래스 유형 에 있어 서 는 초기 화 목록 을 사용 하 는 것 이 좋 습 니 다.왜 일 까요?위의 테스트 를 통 해 알 수 있 듯 이 초기 화 목록 을 사용 하면 기본 구조 함 수 를 호출 하 는 과정 이 한 번 줄 어 들 었 습 니 다.이것 은 데이터 밀집 형 클래스 에 있어 매우 효율 적 입 니 다.마찬가지 로 위의 예 를 보면 테스트 2 의 구조 함 수 를 초기 화 목록 으로 구현 합 니 다.

struct Test2
{
  Test1 test1 ;
  Test2(Test1 &t1):test1(t1){}
}
같은 호출 코드 를 사용 하면 출력 결 과 는 다음 과 같 습 니 다.
 
첫 번 째 줄 은 호출 코드 의 첫 줄 을 출력 합 니 다.두 번 째 줄 출력 은 Test 2 의 초기 화 목록 에 대응 하고 복사 구조 함수 로 test 1 을 초기 화하 여 기본 구조 함 수 를 호출 하 는 과정 을 생략 합 니 다.그래서 좋 은 원칙 은 초기 화 목록 을 사용 할 때 가능 한 한 초기 화 목록 을 사용 하 는 것 이다.
초기 화 목록 에 넣 어야 할 것
성능 문 제 를 제외 하고 어떤 경우 에는 목록 을 초기 화 할 수 없 거나 부족 할 때 가 있 습 니 다.다음 몇 가지 경우 에는 초기 화 목록 을 사용 해 야 합 니 다.
상수 멤버,상수 만 초기 화 할 수 있 고 할당 할 수 없 기 때문에 초기 화 목록 에 넣 어야 합 니 다4.567917.인용 유형,인용 은 정의 할 때 초기 화 되 어야 하 며,다시 할당 할 수 없 기 때문에 초기 화 목록 에 도 써 야 합 니 다.4.567918.
4.567917.기본 구조 함수 의 유형 이 없습니다.초기 화 목록 을 사용 하면 기본 구조 함수 로 초기 화 하지 않 고 복사 구조 함수 로 초기 화 할 수 있 기 때 문 입 니 다기본 구조 함수 가 없 는 클래스 에 대해 우 리 는 예 를 봅 시다.

struct Test1
{
  Test1(int a):i(a){}
  int i ;
};

struct Test2
{
  Test1 test1 ;
  Test2(Test1 &t1)
  {
    test1 = t1 ;
  }
};

이상 코드 는 컴 파일 을 통과 할 수 없습니다.Test 2 클래스 에서 Test 1 test 1;기본 구조 함 수 를 호출 해 야 하지만 Test 1 류 는 인삼 이 없 는 구조 함수 가 없 지만 Test 1 에 기본 구조 함수 가 없 기 때문에 컴 파일 오류 가 발생 했 습 니 다.정확 한 코드 는 다음 과 같 습 니 다.할당 대신 초기 화 목록 을 사용 합 니 다.

struct Test2
{
  Test1 test1 ;
  Test2(Test1 &t1):test1(t1){}
}
구성원 변수의 초기 화 순서
멤버 들 은 클래스 에 나타 난 순서에 따라 초기 화 되 며,초기 화 목록 에 나타 난 순서에 따라 초기 화 되 지 않 고 코드 를 봅 니 다.

struct foo
{
  int i ;
  int j ;
  foo(int x):i(x), j(i){}; // ok,     i,    j
};
다음 코드 를 보 겠 습 니 다.

struct foo
{
  int i ;
  int j ;
  foo(int x):j(x), i(j){} // i    
};
여기 i 의 값 은 정의 되 지 않 았 습 니 다.j 는 초기 화 목록 에 i 앞 에 나타 나 지만 i 는 j 보다 먼저 정의 되 기 때문에 i 를 초기 화 합 니 다.그러나 i 는 j 에서 초기 화 되 었 습 니 다.이때 j 는 초기 화 되 지 않 았 기 때문에 i 의 값 이 정의 되 지 않 았 습 니 다.그래서 좋 은 습관 은 멤버 가 정의 하 는 순서에 따라 초기 화 하 는 것 이다.
 읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기