목록 구성원 변수의 초기화 초기화

3837 단어 초기화
다음 프로그램의 경우
#include <iostream>

using namespace std;

class Base
{
private:
         int a;
         int b;
public:
         Base(int i):b(i),a(b){}
         Base():b(0),a(b){}
         int get_a(){return a;}
         int get_b(){return b;}
};
int main()
{
         Base base(90);
         cout<<base.get_a()<<endl<<base.get_b()<<endl;
         return 0;
}

원래 얻으려고 했던 결과는 a, b가 모두 90이었다.그러나 실제 결과는 다음과 같다.
4273046
90

Process returned 0 (0x0)   execution time : 0.101 s
Press any key to continue.

즉 이때 출력의 첫 번째 수는 무작위 수이고 두 번째 수는 90이다.
초기화 목록의 구성원 변수의 초기화는 구성원 변수의 성명 순서에 따라 초기화됩니다!!!!!
변수 a는 변수 b에 앞서 설명한다. 그러면 클래스 베이스의 구조 함수 초기화 구성원 목록에서 변수 a는 먼저 정의하고 변수 b는 다음에 정의한다. 즉, 변수 a는 먼저 초기화하고 변수 b는 초기화한다. 그러므로 베이스(inti): b(i), a(b)를 실행할 때 a의 값은 b로 초기화하고 그 결과는 무작위 값이며 b의 값은 i=90!!!!!!!!!!!!!!!!!!!
성명의 순서를 바꾸거나 초기화하는 순서는 9090을 얻을 수 있다.예를 들면 다음과 같습니다.
#include <iostream>

using namespace std;

class Base
{
private:
         //int a;
         int b;
         int a;//      
public:
         Base(int i):b(i),a(b){}
         Base():b(0),a(b){}
         int get_a(){return a;}
         int get_b(){return b;}
};
int main()
{
         Base base(90);
         cout<<base.get_a()<<endl<<base.get_b()<<endl;
         return 0;
}

결과:
90
90

Process returned 0 (0x0)   execution time : 1.057 s
Press any key to continue.

원인은 초기화 목록에서 구성원 변수의 초기화 순서는 클래스에서 설명하는 순서가 아니라 클래스에서 설명하는 순서입니다.!!!!!
구성원 변수 성명과 일치하는 순서에 따라 구조 함수 초기화 목록을 작성하는 것을 주의해야 한다. 또한 구성원을 사용하여 다른 구성원을 초기화하는 것을 최대한 피해야 한다. 일반적인 상황에서 구조 함수의 인삼을 사용하여 대상의 데이터 구성원을 사용하지 않고 초기화의 집행 순서로 인한 문제를 피할 수 있다.

좋은 웹페이지 즐겨찾기