クラス宣言内での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': 再定義されています。異なる型修飾子です。
マックス「なんでビルド実行できないぃィ??」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます