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;
}

デフォルトのctorで構築されたComplexオブジェクトdを考えてみましょう

データメンバ r は with 0 を使用して初期化されるため、d.print() を実行すると、r は 0 であることが期待されます

私はそうではないので、ガベージ値であると予想していました

しかし、私がテストしているとき、1 つの奇妙なことが起こります。

メインファイルでこれと次のコード行を削除すると:

std::cout << "count is " << c.count << std::endl;//c はメンバ データにアクセスできます

次に、 d.print() は、私のシステムでは i の値を 32767 として与えますが、これはガベージ値だと思います。

しかし、その行が追加されると、 d.print() は私のシステムで i の値を 0 にするだけです。

理解できません。i の値を設定、変更、または初期化していません。なぜ 0 にする必要があるのですか?

それともガベージ値ですか?

または、これらの関数のいずれかを呼び出すと、i の値が壊れますか?

ここの舞台裏で物事はどのように実行されていますか?

助けてくれてthx。

4

1 に答える 1