🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1803閲覧

C++の定数クラスについて

the_hoots_under

総合スコア33

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2019/09/23 04:35

久々にC++でクラスの勉強をしまして、本を読み返していましたら、定数クラスなるものが書いてありました。
クラス Classのインスタンスを生成する際に、

const Class class1;

と定義するようです。これは、Classに定義されている(pricate,publicどちらの)メンバ変数も
いかなる方法でも変更できなくなる
ということでしょうか。

すなわち、実際クラス内でそのようには書けませんが
Classで定義されているメンバ変数の全てに、constを後付けしたと思えば良いのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

const なクラスオブジェクトを使う場合

クラスの宣言自体に工夫が必要なようです。

Classで定義されているメンバ変数の全てに、constを後付けしたと思えば良いのでしょうか。

変数ではなく、関数に const キーワードが必要ということですね。

投稿2019/09/23 05:27

編集2019/09/23 05:31
Zuishin

総合スコア28669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

int型で言えば,
int i1;

const int i2;
の違いと同じ話.

構造体で言えば,
struct S{ int A; int B; };
に対する
S S1;

const S S2;
の違いと一緒.


追記:

いかなる方法でも変更できなくなる

mutableなんてのがありますので,「いかなる方法でも変更できない」というわけではないですね.

投稿2019/09/23 04:45

編集2019/09/23 07:31
fana

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

the_hoots_under

2019/09/23 04:54

私の質問が曖昧だったので、少し話がずれるのですが まず、const int i2;のような文を書けましたでしょうか。 const int i2 = 10;のように値を代入しないと書けなかった気がします。 次に、私一切構造体を使わないのでわからないのですが const S S2; の場合、定数構造体の初期値設定はどのようになっているのでしょうか。初期値設定をしない場合でも定数で定義できてしまうのでしょうか。それとも、構造体も変数の場合と同じで、初期値設定を行わずにconstをつけるとコンパイルエラーになるのでしょうか。 最後に、const Class class1;の場合、class1のメンバ変数の初期値設定の全てがコンストラクタで行われていない場合、初期値設定を行っていないメンバ変数の値変更ができないということになるのでしょうか。それとも、メンバ変数の全ての初期値設定を行わないクラスに対し、定数インスタンスを定義するとコンパイルエラーになるのでしょうか。(もちろんこのような文を書くのがいけないのですが。)
fana

2019/09/23 05:09 編集

初期値の有無: 要点はconstの有無であるため,回答に値までは書きませんでした(実際上,値を指定せずに定数にしたいとか有り得んと思いますので,そこは暗黙的に理解されるかと…). 確かに文法上問題のある記述ですから,回答としてはふさわしくなかったかもしれません. エラーになるかを知りたいならば,とりあえずやってみれば良いのではないでしょうか.
the_hoots_under

2019/09/23 05:14

やっていないのに机上の空論をしている私が悪いのはもちろんです。 また、書いていて質問の意図が変わってしまって申し訳ございません。 やってみます。 ただ、const 変数とconst クラスはやっぱり違っていて クラスのメンバ変数はconstではないのに、const クラスが 常に取れるのか、場合によってはコンパイルエラーになるのか その時のクラスのメンバ変数がどういう状態にあるのかははっきりさせなければなと思いました。 コメントありがとうございました。
fana

2019/09/23 05:17

質問文の const Class class1; と記述の形を合わせたわけですが,値の有無が気になる場合は const int i2 = 100; とか const S S2{ 3, 9 }; とかだと思ってください. const なので,i2 = 7; とか S2.A = 60; とかして値を変えることはできません. const Class class1{ 何か適切な初期化記述 }; の場合も同様です.class1のメンバを変更することはできません. また,constでないメソッドを呼ぶことも禁止されます.
fana

2019/09/23 05:29

回答に{間違い,不備,不足,良くない点,etc}がある場合には,ぜひともその旨をコメントで明記して低評価を入れてください.(自分で自分の回答に評価は付けられないので)
the_hoots_under

2019/09/23 05:43

返答が不躾だったのかもしれません。(自問自答しながら書いています。) 値の有無が気になるわけではありません。 クラスのメンバ変数の値を定義しなくても定義できます。 メンバ変数の値が不定のまま、インスタンスを取ることもできます。 メンバ変数の値が不定のまま、constインスタンスを取ることができるのかが気になりました。 (もちろん自分で確かめれば良い話です。ただいますぐコードがかける状況にありません。)
fana

2019/09/23 06:06

> 返答が不躾 そんなことないです. 不定な状態でconstというのは実際にやったことがなかったので,そういう話が出てくるとこちらも勉強になり助かります. (classのメンバが不定のままconstなインスタンスを定義するとVS2017だとwarningが出ました.)
the_hoots_under

2019/09/23 07:55

ご返信ありがとうございます。 なるほど、コンパイルはできてしまうのですね。 とすると、返答者様がおっしゃられた通り、 変数のconstと感覚的には同義だと思っておいて、 ただメンバ変数不定のままでも動いてしまうので気をつける ということですね。脱線しましたが非常に参考になりました。
fana

2019/09/23 08:07 編集

(ただの個人の感想ですが)classのconstなインスタンスを作る場面ってレアな気がします. どんな場面で使う(と便利な)んだろう?
the_hoots_under

2019/09/23 08:09

確かに。。 久々にc++を使って復習をしていたのですが だいぶ脇道に逸れてしまいました。。。 まぁ私はだいぶ初心者なのであれですが、私は定数クラスを使ったことが一度もありません。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問