私はいくつかのテストを行っています...まず、ソースコードを投稿します
.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。