C++목록 초기 화 학습

4780 단어 목록 초기 화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 을 초기 화하 여 기본 구조 함 수 를 호출 하 는 과정 을 생략 합 니 다.그래서 좋 은 원칙 은 초기 화 목록 을 사용 할 때 가능 한 한 초기 화 목록 을 사용 하 는 것 이다.
어떤 것 을 초기 화 목록 에 넣 어야 하 는 지 성능 문 제 를 제외 하고 어떤 경우 에는 목록 을 초기 화 할 수 없 거나 없어 서 는 안 되 며,다음 몇 가지 경우 에는 초기 화 목록 을 사용 해 야 합 니 다.
상수 구성원 은 상수 만 초기 화 할 수 있 고 값 을 부여 할 수 없 기 때문에 초기 화 목록 에 인용 형식 을 넣 어야 합 니 다.인용 은 정의 할 때 초기 화 되 어야 하고 다시 할당 할 수 없 기 때문에 초기 화 목록 에 기본 구조 함수 가 없 는 유형 도 써 야 합 니 다.초기 화 목록 을 사용 하면 기본 구조 함수 로 초기 화 할 필요 가 없 기 때 문 입 니 다.복사 구조 함 수 를 직접 호출 하여 초기 화 합 니 다.기본 구조 함수 가 없 는 클래스 에 대해 우 리 는 예 를 봅 시다.

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

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

이상 코드 는 컴 파일 을 통과 할 수 없습니다.Test 2 의 구조 함수 중 test 1=t1 이라는 줄 은 실제로 두 단계 로 나 뉘 어 실행 되 기 때 문 입 니 다.
1.Test 1 의 기본 구조 함 수 를 호출 하여 test 12 를 초기 화 합 니 다.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 의 값 이 정의 되 지 않 았 습 니 다.그래서 좋 은 습관 은 멤버 가 정의 하 는 순서에 따라 초기 화 하 는 것 이다.

좋은 웹페이지 즐겨찾기