C++목록 초기 화 학습
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 의 값 이 정의 되 지 않 았 습 니 다.그래서 좋 은 습관 은 멤버 가 정의 하 는 순서에 따라 초기 화 하 는 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C++목록 초기 화 학습초기 화 목록 초기 화 클래스 를 사용 하 는 이 유 는 두 가지 방법 이 있 습 니 다.하 나 는 초기 화 목록 을 사용 하 는 것 이 고,다른 하 나 는 구조 함수 에서 할당 작업 을 하 는 것 입 니 다.초기 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.