0

나는 몇 가지 테스트를하고있어이 ... 첫째 내 소스 코드를 게시이 데이터 멤버가 초기화되는 이유는 무엇입니까?

.H 파일

class Complex{ 
    private: 
     int r = 0;//initializer 
     int i ; 
    public: 
     Complex(int , int I = 0); 
     Complex(); 
     void print(); 
     void set(int, int I = 1); 
     static void print_count(); 
     static int count; 
}; 

.cpp 파일

#include <iostream> 
#include "complex.h" 

int Complex::count = 1; 

Complex::Complex(int R , int I){ 
    r = R; 
    i = I; 

    count++; 

    std::cout << "constructing Complex object...count is " << Complex::count << std::endl; 
} 

Complex::Complex(){//default constructor 
    std::cout << "default constructor is called..." << std::endl; 
} 

void Complex::print(){ 
    std::cout << "r = " << r << ';' << "i = " << i << std::endl; 
    return; 
} 

void Complex::set(int R, int I /*= 2*/){//will be "redefaulting", an error 
    r = R; 
    i = I; 
    return; 
} 

void Complex::print_count(){//static 
    Complex::count = -1;//jsut for signaling... 

    std::cout << "count is " << count << std::endl; 
    return; 
} 

주요 기능

#include <iostream> 
#include "complex.h" 

int main(){ 
    Complex d;//using default constructor 
    d.print(); 

    /*Complex c(4, 5);*/ 
    Complex c(4); 
    //c.print(); 

    /*c.set(2, 3)*/ 
    c.print(); 
    c.set(2); 
    c.print(); 

    std::cout << "count is " << c.count << std::endl;//c can access member data 
    c.print_count(); 
    c.count++;// 

    return 0; 
} 

de 데이터 멤버 R은 0 d.print 실행시에()를 사용하여 초기화되기 때문에

ctor에 잘못 R 0

될 예정 난 아니므 I는 쓰레기 값으로 예상

하지만 테스트 할 때 이상한 일이 발생합니다.

나는 주 파일에서 코드의 다음 줄을 제거하는 경우 :

표준 : : cout과는 < < < < c.count < < 표준 : ENDL "수는있다"; // c를 액세스 할 수 있습니다 회원 데이터

그러면 d.print()는 시스템의 32767로 i의 값을 제공합니다. 이는 가비지 값이라고 생각합니다.

하지만 일단 해당 행이 추가되면 d.print()는 시스템에서 i의 값을 0으로 지정합니다.

나는 그것을 얻지 않는다. 나는 값을 설정, 수정 또는 초기화하지 않았으며, 왜 0이어야 하는가?

또는 가비지 값입니까?

또는 이러한 함수 중 하나를 호출하면 i의 값이 손상됩니다.

여기 장면 뒤에는 어떤 일이 발생합니까?

thx

답변

2

0은 다른 어떤 것과 마찬가지로 쓰레기 값입니다. 다르게 생각하는 실수하지 마십시오.

공식적으로 초기화되지 않은 변수를 읽는 것은 정의되지 않은 동작이므로 궁금해 할 점은 없습니다. 변수를 올바르게 초기화하여 수정하십시오.

+0

저는 초급자입니다. 작은 테스트 시간을 보내고 이것들이 나쁘지는 않습니다. 설명하는 것과 똑같은 일을하는 것을 보는 것이 좋습니다. –