おいらの目玉みたいだ、まさか………予備?
この記事は勉強の覚書として書いてますので間違えを修正したくてたまらない方は連絡くださると本当に助かります。
プログラミングは正直テンプレを組み立てて使ってるから細かい記号の使い方がよくわからない
「.」や「::」などは使い方はなんとなく解るもののちょっと「?」と思うことがある。こいつらをまじめに理解する必要はあるかわからないけど
とにかくコードは変でも書いてみなくちゃ…
ということでこんな感じのコードを書いてみた
#include<iostream>
class A {
public:
static int a; //メンバ変数
int b; //メンバ変数
class C {
public:
static int c ; //メンバ変数
};
static C c; //class C のインスタンス化、名前はc
};
class B : public A{ //class B にpublicでclass A を継承する
public:
int A(int A); //メンバ関数
};
int B::A(int A) { //メンバ関数の定義
int b = A + 1;
return b;
}
int A::a = 0; //class A のメンバ変数初期化(static変数は初期化が必要?)
int A::C::c = 0; //class A 内の入れ子class C メンバ変数の初期化(static変数は初期化が必要?)
int main() {
A a; //class A のインスタンス化、名前はa
B b; //class B のインスタンス化、名前はb
B b2; //class B のインスタンス化、名前はb2
std::cout << "A::aの初期値→ 結果 " << A::a << std::endl;
A::a = 1;
std::cout <<"A::aに1代入→ 結果 " << A::a << std::endl;
std::cout << "A::C::cの初期値→ 結果 " << A::C::c << std::endl;
A::C::c = 2;
std::cout << "A::C::cに2代入→ 結果 " << A::C::c << std::endl;
A::c.c = 3; //class A 内でclass c がインスタンス化されているのでその中の変数cに3を代入
//インスタンス化したクラス内の変数を変更しているがstatic変数なのでどのような挙動になるのか確認する
std::cout << "A::c.cに3代入→ 結果 " << A::c.c << std::endl;
std::cout << "A::C::cの値は変化したか確認→ 結果 " << A::C::c << std::endl; //ここで3と出ればstaticはインスタンス化してもずっと存在し続けることになる
a.c.c = 4; //インスタンス化されたclass A内のさらにインスタンス化されたclass C 内変数cに4を代入
std::cout << "a.c.cに4代入→ 結果 " << a.c.c << std::endl;
std::cout << "この時点でのA::c.cの値→ 結果 " << A::c.c << std::endl;
std::cout << "この時点でのA::C::cの値→ 結果 " << A::C::c << std::endl;
int B = b.A (a.c.c); //a.c.cの値4を関数b.A(int A)にコピーする
std::cout << "関数 b.A (a.c.c)の戻り値→ 結果 " << B << std::endl;
b.b = 6;
b2.b = 7;
std::cout << "b.bに6を代入→ 結果 " << b.b << std::endl;
std::cout << "b2.bに7を代入→ 結果 " << b2.b << std::endl;
return 0;
}
なぜこんなややこしいこと書いたかというと
コードを読む練習というか
スコープの理解とstatic変数の理解とかを深められたらなぁとおもってw
このaはどこのaのことを言っているのか理解をしながら読めているか、自分に対して書いていますw
ということで
この「.」や「:」、「::」の挙動はどんな風になっているのか、調べてみました
自分の勉強のための覚書ですのでご指摘ありましたらご連絡くださいよろしくお願いいたします。
これを実行すると結果は
A::aの初期値→ 結果 0
A::aに1代入→ 結果 1
A::C::cの初期値→ 結果 0
A::C::cに2代入→ 結果 2
A::c.cに3代入→ 結果 3
A::C::cの値は変化したか確認→ 結果 3
a.c.cに4代入→ 結果 4
この時点でのA::c.cの値→ 結果 4
この時点でのA::C::cの値→ 結果 4
関数 b.A (a.c.c)の戻り値→ 結果 5
b.bに6を代入→ 結果 6
b2.bに7を代入→ 結果 7
こうなりました。
この結果から
static変数は値を持ち続けていることがわかります。
また「::」はクラス内のメンバにアクセスする際に使用するもの
「.」はインスタンス化されたオブジェクトにアクセスするとき
ということも確認できました。
「:」は継承なのでちゃんとクラスが継承できているかの確認もできました。
staticに関しては値を持ち続けているかの確認ができました。
またクラス内のstaticを書かない変数へアクセスしようとしたところアクセスできませんでした(publicでメンバ変数を指定しましたが)
これはstatic変数はプログラム開始時にメモリへ配置されるからなのでしょうか?
つまりstaticを記述しないと、メモリへの割り当てがされないのでアクセスできないということなのかな?
class内でメンバ変数をstaticで記述した場合はグローバルで定義しなくちゃならないみたいだ。
class A {
public:
static int a; //メンバ変数
};
/*↑こうやってstatic変数を書いたら…
↓classの外側で定義を書く必要がある*/
int A::a = 0 ;
main()関数内で定義してもダメ見たい
そうするとvisualstudioではエラー2001を吐き出す…
いろいろ試してみてすこーし理解が深まった気がする