クラス宣言内でのaの静的メンバ変数宣言で静的メンバ変数aを初期化することはできません。

#include <iostream>


using namespace std;


class Cube{


public:

int no; //変数noはクラスCubeのメンバ変数とよばれます

public:

float tate; //変数tateはクラスCubeのメンバ変数とよばれます

public:

float yoko; //変数yokoはクラスCubeのメンバ変数とよばれます

public:

float takasa; //変数takasaはクラスCubeのメンバ変数とよばれます


public:

Cube();


/*🌞🌞🌞クラスCubeのコンストラクタCube() のメンバ関数宣言を行っています*/


public:

void display(); //自作関数display()のクラスCubeのメンバ関数宣言を行っています


public:

static int a;

/*🌞🌞🌞ここですよ~ん🌞🌞🌞

aのCubeの静的メンバ変数宣言を行っています*/


};


Cube::Cube() {



no = 0;

tate = 0;

yoko = 0;

takasa = 0;


cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";

}


//👆クラスCubeのコンストラクタCube()の定義をおこなっています




void Cube::display() {


cout << "cube1.aは" << a << "に初期化されました" << "\n";


}


//👆クラスCubeのメンバ関数となっている自作関数display()の定義をおこなっています


int Cube::a;


//🌞🌞🌞ここです aのメンバ変数宣言を実行しました。🌞🌞🌞


int main() {


Cube cube1;


//👆cube1のクラスCube型のオブジェクト宣言をおこなっています

/*🌞このとき オブジェクトcube1のコンストラクタが自動的に実行されています*/


cube1.a=0;

cube1.display();

return 0;

}


プログラムの実行結果


生成されたオブジェクトのメンバ変数を初期化しました

cube1.aは0に初期化されました


ソーラー「このプログラムでは


クラスCube型のオブジェクト宣言


Cube cube1;


を実行したときに


クラスCube型のオブジェクトcube1の静的メンバ変数


cube1.a


が生成されるようにするために


aのクラスCubeの静的メンバ変数宣言


static int a;


に続いて


Cubeのクラス宣言のあと


main関数の前で


aのクラスCubeのメンバ変数宣言


int Cube::a;


が実行されているね。」


ソーラー「次は


クラスCubeの静的メンバ変数宣言


             static int a;



             static int a=1;


として


クラスCubeの静的メンバ変数aが初期化できるかどうか


確かめてみたいと思うんだ😊」


マックス「そこで初期化するか・・・


う~ん 確かにできるんじゃないか」


ソーラー「


クラスCubeの静的メンバ変数宣言


             static int a;



             static int a=1;


として



cube1のオブジェクト宣言


Cube cube1;


を実行したならば


生成される


クラスCube型のオブジェクトcube1の静的メンバ変数


cube1.a



1に初期化されるんじゃないかな?


確かめてみよう。


そのプログラムはこちらとなります」

👇


#include <iostream>


using namespace std;


class Cube{


public:

int no; //変数noはクラスCubeのメンバ変数とよばれます

public:

float tate; //変数tateはクラスCubeのメンバ変数とよばれます

public:

float yoko; //変数yokoはクラスCubeのメンバ変数とよばれます

public:

float takasa; //変数takasaはクラスCubeのメンバ変数とよばれます


public:

Cube();


/*🌞🌞🌞クラスCubeのコンストラクタCube() のメンバ関数宣言を行っています*/


public:

void display(); //自作関数display()のクラスCubeのメンバ関数宣言を行っています


public:

static int a=1;

/*🌞🌞🌞ここですよ~ん🌞🌞🌞

静的メンバ変数aのCubeのメンバ変数宣言、初期化を行っています  このようなことは可能なのでしょうか?*/


};


Cube::Cube() {


no = 0;

tate = 0;

yoko = 0;

takasa = 0;


cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";

}


//👆クラスCubeのコンストラクタCube()の定義をおこなっています




void Cube::display() {


cout << "cube1.aは" << a << "に初期化されました" << "\n";


}


//👆クラスCubeのメンバ関数となっている自作関数display()の定義をおこなっています


int Cube::a;


//🌞🌞🌞ここです aのCubeのメンバ変数宣言を実行しました。🌞🌞🌞


int main() {


Cube cube1;


//👆cube1のクラスCube型のオブジェクト宣言をおこなっています

/*🌞このとき オブジェクトcube1のコンストラクタが自動的に実行されています*/


cube1.display();


return 0;

}


プログラムの実行結果



エラー (アクティブ) E1592 in-class initializer のあるメンバーは const である必要があります

エラー C2864 'Cube::a': in-class initializer を持つ静的 データ メンバー には、非揮発性 const integral 型が必要です


(initializerとは初期化するためのデータ、初期化子と呼ばれます


in-class initializerとは


クラス宣言内で


クラスのメンバ変数宣言を初期化するために用いられているデータのことで


この場合


static int a=1;


の1のことを指します


非揮発性 const integral 型が必要です

とは

後からデータを代入して変更することができないように


const int 型を用いてくださいという意味です)






ソーラー「


クラスの静的メンバ変数宣言


static int a;



static int a=1;


のように記述すると


ビルド実行エラーが表示されることになります。


クラス宣言内で


クラスの静的メンバ変数


static int a



初期化することはできないんだね。」


マックス「いやあ


ビルドエラー


エラー (アクティブ) E1592 in-class initializer のあるメンバーは const である必要があります

エラー C2864 'Cube::a': in-class initializer を持つ静的 データ メンバー には、非揮発性 const integral 型が必要です


が表示されている


つまり


constをクラスの静的メンバ変数宣言


static int a;


にくっつければいいんじゃないか


普通に


クラスCubeの静的メンバ変数宣言


static int a;



const static int a=1;


にしたらいいんじゃないか?」


その時のプログラムはこちらです

👇

#include <iostream>


using namespace std;


class Cube {


public:

int no; //変数noはクラスCubeのメンバ変数とよばれます

public:

float tate; //変数tateはクラスCubeのメンバ変数とよばれます

public:

float yoko; //変数yokoはクラスCubeのメンバ変数とよばれます

public:

float takasa; //変数takasaはクラスCubeのメンバ変数とよばれます


public:

Cube();


/*🌞🌞🌞クラスのコンストラクタCube::Cube() のメンバ関数宣言を行っています*/


public:

void display(); //自作関数display()のクラスCubeのメンバ関数宣言を行っています


public:

const static int a = 1;

/*🌞🌞🌞ここですよ~ん🌞🌞🌞

constをくっつけたaのCubeの静的メンバ変数宣言、初期化を行っています  このようなことは可能なのでしょうか?*/


};


Cube::Cube() {


no = 0;

tate = 0;

yoko = 0;

takasa = 0;


cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";

}


//👆クラスCubeのコンストラクタCube()の定義をおこなっています




void Cube::display() {


cout << "cube1.aは" << a << "に初期化されました" << "\n";


}


//👆クラスCubeのメンバ関数となっている自作関数display()の定義をおこなっています


int Cube::a;


//🌞🌞🌞aのCubeのメンバ変数宣言を実行しました。🌞🌞🌞


int main() {


Cube cube1;


//👆cube1のクラスCube型のオブジェクト宣言をおこなっています

/*🌞このとき オブジェクトcube1のコンストラクタが自動的に実行されています*/

cube1.display();

return 0;

}



ビルド実行エラー



エラー (アクティブ) E0147 宣言に "const int Cube::a" (宣言された 行 25) との互換性がありません

エラー C2734 'Cube::a' : 'const' オブジェクトが 'extern' でない場合、初期化する必要があります。

エラー C2373 'a': 再定義されています。異なる型修飾子です。


マックス「なんでビルド実行できない??



おお もしや。。。


const static int a = 1;

ではなく


static const int a = 1;


だったかぁ」


const static int a = 1;



static const int a = 1;


に切り替えたプログラムはこちらです

👇

#include <iostream>


using namespace std;


class Cube {


public:

int no; //変数noはクラスCubeのメンバ変数とよばれます

public:

float tate; //変数tateはクラスCubeのメンバ変数とよばれます

public:

float yoko; //変数yokoはクラスCubeのメンバ変数とよばれます

public:

float takasa; //変数takasaはクラスCubeのメンバ変数とよばれます


public:

Cube();


/*🌞🌞🌞クラスのコンストラクタCube::Cube() のメンバ関数宣言を行っています*/


public:

void display(); //自作関数display()のクラスCubeのメンバ関数宣言を行っています


public:

static const int a = 1;

/*🌞🌞🌞ここですよ~ん🌞🌞🌞

静的メンバ変数aのCubeのメンバ変数宣言、初期化を行っています  このようなことは可能なのでしょうか?*/


};


Cube::Cube() {


no = 0;

tate = 0;

yoko = 0;

takasa = 0;


cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";

}


//👆クラスCubeのコンストラクタCube()の定義をおこなっています




void Cube::display() {


cout << "cube1.aは" << a << "に初期化されました" << "\n";


}


//👆クラスCubeのメンバ関数となっている自作関数display()の定義をおこなっています


int Cube::a;


//🌞🌞🌞ここです aのCubeのメンバ変数宣言を実行しました。🌞🌞🌞


int main() {


Cube cube1;


//👆cube1のクラスCube型のオブジェクト宣言をおこなっています

/*🌞このとき オブジェクトcube1のコンストラクタが自動的に実行されています*/


cube1.display();


return 0;

}



ビルド実行結果



エラー (アクティブ) E0147 宣言に "const int Cube::a" (宣言された 行 26) との互換性がありません

エラー C2734 'Cube::a' : 'const' オブジェクトが 'extern' でない場合、初期化する必要があります。

エラー C2373 'a': 再定義されています。異なる型修飾子です。



マックス「なんでビルド実行できないぃィ??」








  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る