質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.30%
C++

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

Q&A

解決済

2回答

16354閲覧

初期化子を使わずにconstなメンバ変数を初期化する方法

penpen

総合スコア8

C++

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

0グッド

0クリップ

投稿2015/04/30 10:20

C++でconstなメンバ変数を初期化する方法は初期化子を使うしかないと理解していたのですが,
ふと考えると,
コンストラクタで受け取った引数に対して,何かしらの処理を施した値を使って
constなメンバ変数を初期化したい場合もあると思います.

そのような時はどうしたら良いのでしょうか?
const宣言を使わないようにするしかないのでしょうか?

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

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

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

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

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

guest

回答2

0

一応初期化子の代入時に処理を挟むことができるので値の加工自体はできます。

lang

1class ConstValueHolder 2{ 3private: 4 const int _value; 5 static int ModifyValue(int value) 6 { 7 return value * 2; // 加工 8 } 9 10public: 11 ConstValueHolder(int value) : 12 _value(ModifyValue(value)) 13 { 14 ; 15 } 16};

staticじゃない関数でも呼び出すことができますが、止めた方がいいでしょうね…
上記のように間に処理を挟めば加工後に値を変更できないメンバ変数を利用できるとは思いますが、値の加工とgetterのみに絞ったクラスを別途用意して、そちらをメンバにした方が適切な気がします。

privateメンバのreadonlyな扱いを明示化したいという考え方はあると思います。
C#ではその希望にこたえるべくreadonlyとconstが分けて実装されているぐらいですしね。

C++のconstは「値を書き換えないことの明示」しか実現されていません。
staticではないクラスのメンバ変数にconstを付加して「定数」とすること自体正解なのか自分にはわかりません。そうすると、クラスサイズが無駄に増えちゃいますしね。と逆から考えると、なんとなくメンバ変数にconstを付加してreadonlyのために使うというのも、無しではない気はします。
このあたり、勉強しなおして書いているわけではないので、私の直感の話ですが。

投稿2015/05/05 01:38

編集2015/05/05 02:05
haru666

総合スコア1593

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

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

penpen

2015/05/05 06:53

回答ありがとうございます. c#ではreadonlyという宣言があるのですね.知りませんでした. C++でも定数用の宣言と読み取り用の宣言を明示的に分けてほしいものです. 少し調べてみたのですが,constを定数として扱う人,読み取り専用として扱う人,その両方として扱う人と人それぞれですね... constに対する扱い方,もう少し考えてみたいと思います.
guest

0

ベストアンサー

結論から言うとconst宣言せずに単なるメンバ変数として使うしかないと思います。
クラス内部に隠蔽した処理を使ってコンストラクタで受け取った値を加工する時点でconst宣言する意味がなくなっていると思いますが。

投稿2015/04/30 12:05

KoichiSugiyama

総合スコア3041

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

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

penpen

2015/04/30 12:36

回答ありがとうございます. 初期化後の処理で値を変更できないという点でconstの意味があると考えているのですが このような考え方は間違っているのでしょうか?それともconstは定数のような変数にのみ宣言すべきものなのでしょうか? 私はconstの使い方が良く分かっておらず,なんとなく宣言しているという状態です... constに対する適切な考え方等あれば教えていただけるとありがたいです.
KoichiSugiyama

2015/04/30 13:06

const宣言している変数は定数を表すものだと考えてもらって間違いないと思います。何らかの処理を加えたいのであれば、コンストラクタに渡す前に加工すべきだと思います。
penpen

2015/04/30 13:28

なるほどです. 長年のconstに対するふわふわした気持ちが晴れてよかったです. ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問