回答編集履歴
2
記述を少し改善
test
CHANGED
@@ -40,7 +40,7 @@
|
|
40
40
|
|
41
41
|
staticじゃない関数でも呼び出すことができますが、止めた方がいいでしょうね…
|
42
42
|
|
43
|
-
間に処理を挟
|
43
|
+
上記のように間に処理を挟めば加工後に値を変更できないメンバ変数を利用できるとは思いますが、値の加工とgetterのみに絞ったクラスを別途用意して、そちらをメンバにした方が適切な気がします。
|
44
44
|
|
45
45
|
|
46
46
|
|
@@ -50,4 +50,8 @@
|
|
50
50
|
|
51
51
|
|
52
52
|
|
53
|
+
C++のconstは「値を書き換えないことの明示」しか実現されていません。
|
54
|
+
|
53
|
-
|
55
|
+
staticではないクラスのメンバ変数にconstを付加して「定数」とすること自体正解なのか自分にはわかりません。そうすると、クラスサイズが無駄に増えちゃいますしね。と逆から考えると、なんとなくメンバ変数にconstを付加してreadonlyのために使うというのも、無しではない気はします。
|
56
|
+
|
57
|
+
このあたり、勉強しなおして書いているわけではないので、私の直感の話ですが。
|
1
誤投稿のため
test
CHANGED
@@ -1,15 +1,53 @@
|
|
1
1
|
一応初期化子の代入時に処理を挟むことができるので値の加工自体はできます。
|
2
|
+
|
3
|
+
```lang-<ここに言語を入力>
|
4
|
+
|
5
|
+
class ConstValueHolder
|
6
|
+
|
7
|
+
{
|
8
|
+
|
9
|
+
private:
|
10
|
+
|
11
|
+
const int _value;
|
12
|
+
|
13
|
+
static int ModifyValue(int value)
|
14
|
+
|
15
|
+
{
|
16
|
+
|
17
|
+
return value * 2; // 加工
|
18
|
+
|
19
|
+
}
|
2
20
|
|
3
21
|
|
4
22
|
|
23
|
+
public:
|
24
|
+
|
25
|
+
ConstValueHolder(int value) :
|
26
|
+
|
27
|
+
_value(ModifyValue(value))
|
28
|
+
|
29
|
+
{
|
30
|
+
|
31
|
+
;
|
32
|
+
|
33
|
+
}
|
34
|
+
|
35
|
+
};
|
36
|
+
|
37
|
+
```
|
5
38
|
|
6
39
|
|
7
40
|
|
41
|
+
staticじゃない関数でも呼び出すことができますが、止めた方がいいでしょうね…
|
8
42
|
|
9
|
-
|
43
|
+
間に処理を挟み込めることを利用できるとは思いますが、値の加工とgetterのみに絞ったクラスを別途用意して、そちらをメンバにした方が適切な気がします。
|
10
44
|
|
11
|
-
C#だとそのあたりの希望にこたえるべくreadonlyとconstが明確に分けられているんですけどね。```lang-<ここに言語を入力>
|
12
45
|
|
13
|
-
コード
|
14
46
|
|
15
|
-
|
47
|
+
privateメンバのreadonlyな扱いを明示化したいという考え方はあると思います。
|
48
|
+
|
49
|
+
C#ではその希望にこたえるべくreadonlyとconstが分けて実装されているぐらいですしね。
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
C++のconstは「値を書き換えられない」ことのみしか実現されていませんから、クラスのメンバ変数にconstを付加して「定数」とすること自体正解なのか自分にはわかりません。このあたりのことは勉強しなおして書いているわけではないので、直感ですが…
|