回答編集履歴

4

追記 + refine

2015/02/20 06:40

投稿

yohhoy
yohhoy

スコア6189

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
 
28
28
 
29
- - クラス`Product`型の変数`product1`には、クラス`Product`から作り出したインスタンスが格納されています。
29
+ - クラス`Product`型の変数`product1`には、その値としてクラス`Product`から作り出したインスタンスが格納されています。
30
30
 
31
31
  - `int`型の変数`val`には、値`100`が格納されています。
32
32
 
@@ -68,6 +68,24 @@
68
68
 
69
69
  > そもそもポインタは変数ではないのでメンバという言い方はしないのでしょうか?
70
70
 
71
- ポインタは「型」です。「`int`型の変数」と同じように、「ポインタ型**の**変数」という言い方をします。例えば`int *p;`は、「`int`型へのポインタ型の変数`p`」になります。先の例では、「クラス`Product`のメンバ変数`price`は、`char`型へのポインタ型(=`char*`型)のメンバ変数」となります。
71
+ ポインタは「型」です。「`int`型の変数」と同じように、「ポインタ型**の**変数」という言い方をします。例えば`int *p;`は、「`int`型へのポインタ型(=`int *`型)の変数`p`」になります。先の例では、「クラス`Product`のメンバ変数`price`は、`char`型へのポインタ型(=`char *`型)のメンバ変数」となります。
72
72
 
73
73
 
74
+
75
+ ---
76
+
77
+
78
+
79
+ > 正しくは *product1.name= example; と書く必要があり、インスタンスを生成するときにnew、deleteで領域を確保しないとエラーがでてしまう
80
+
81
+
82
+
83
+ 本質的な問題は`product1.name`が有効なメモリを指していない、つまりポインタ型のメンバ変数`name`を初期化していないことです。「インスタンスを生成するときにnew、deleteで領域を確保」は、初期化のための1つの手段です。(他の方法も考えられます)
84
+
85
+
86
+
87
+ `*product1.name`はポインタ型変数が指す先を見に行く(参照はがし)操作ですが、`product1.name`が有効なメモリ(変数)を指していない状態では、プログラムクラッシュなどの実行時エラーを引きおこしたり、全く無関係なメモリ(変数)に書き込んで値を破壊する不可解なバグの原因となります。
88
+
89
+
90
+
91
+

3

refine

2015/02/20 06:40

投稿

yohhoy
yohhoy

スコア6189

test CHANGED
@@ -60,8 +60,6 @@
60
60
 
61
61
 
62
62
 
63
-
64
-
65
63
  > そしてこのように、「ポインタをクラスのメンバ」にするような書き方は一般にするものですか?
66
64
 
67
65
  一般的です。
@@ -70,6 +68,6 @@
70
68
 
71
69
  > そもそもポインタは変数ではないのでメンバという言い方はしないのでしょうか?
72
70
 
73
- ポインタは「型」です。「`int`型の変数」と同じように、「ポインタ型**の**変数」という言い方をします。例えば`int *p;`は、「`int`型へのポインタ型の変数`p`」になります。
71
+ ポインタは「型」です。「`int`型の変数」と同じように、「ポインタ型**の**変数」という言い方をします。例えば`int *p;`は、「`int`型へのポインタ型の変数`p`」になります。先の例では、「クラス`Product`のメンバ変数`price`は、`char`型へのポインタ型(=`char*`型)のメンバ変数」となります。
74
72
 
75
73
 

2

refine

2015/02/19 16:32

投稿

yohhoy
yohhoy

スコア6189

test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  > それともexampleのポインタのみがメンバですか?
10
10
 
11
- 「クラス」と「インスタンス」、「型」と「変数」の関係がごっちゃになっているようです。まずは簡単な`int`型の`price`メンバ(変数)で考えてみてください。
11
+ メンバ(変数)の前に、「クラス」と「インスタンス」の関係、「型」と「変数」の関係がごっちゃになっているようです。まずは簡単な`int`型の`price`メンバ変数で考えてみてください。
12
12
 
13
13
  ```
14
14
 
@@ -36,6 +36,32 @@
36
36
 
37
37
 
38
38
 
39
+ ```
40
+
41
+ // 質問文から転機したコード
42
+
43
+ char example = 'a';
44
+
45
+ product1.*name = example;
46
+
47
+ ```
48
+
49
+ なお、質問文にあるコードではコンパイル時エラーになります。下記のように`*`を先頭に書く必要があります。(これでコンパイルは通るようになりますが、別の問題があるため実行時エラーになります。)
50
+
51
+ ```
52
+
53
+ // 修正したコード
54
+
55
+ char example = 'a';
56
+
57
+ *product1.name = example;
58
+
59
+ ```
60
+
61
+
62
+
63
+
64
+
39
65
  > そしてこのように、「ポインタをクラスのメンバ」にするような書き方は一般にするものですか?
40
66
 
41
67
  一般的です。

1

refine

2015/02/19 16:27

投稿

yohhoy
yohhoy

スコア6189

test CHANGED
@@ -1,6 +1,4 @@
1
1
  > nameと*nameとどどちらがメンバなのでしょうか。
2
-
3
-
4
2
 
5
3
  クラスのメンバ(変数)とは、その「変数名」のことを指します。この例では`name`がメンバ(変数)です。
6
4
 
@@ -10,9 +8,7 @@
10
8
 
11
9
  > それともexampleのポインタのみがメンバですか?
12
10
 
13
-
14
-
15
- 「クラス」と「インスタンス」、「型」と「変数」の関係がごっちゃになっているようです。まずは簡単な`int`型の`price`メンバで考えてみてください。
11
+ 「クラス」と「インスタンス」、「型」と「変数」の関係がごっちゃになっているようです。まずは簡単な`int`型の`price`メンバ(変数)で考えてみてください。
16
12
 
17
13
  ```
18
14
 
@@ -34,15 +30,13 @@
34
30
 
35
31
  - `int`型の変数`val`には、値`100`が格納されています。
36
32
 
37
- - `procut1.price`は、変数`product1`に格納された`Product`型インスタンスの、`int`型のメンバ変数を表します。
33
+ - `procut1.price`は、変数`product1`に格納された`Product`型インスタンスの、`int`型のメンバ変数`price`を表します。
38
34
 
39
- - `product.price = val;`とすると、変数`product1`に格納された`Product`型インスタンスの、`int`型のメンバ変数に、値`100`が**コピー**されて代入されます。
35
+ - `product.price = val;`とすると、変数`product1`に格納された`Product`型インスタンスの、`int`型のメンバ変数`price`に、値`100`が**コピー**されて代入されます。
40
36
 
41
37
 
42
38
 
43
39
  > そしてこのように、「ポインタをクラスのメンバ」にするような書き方は一般にするものですか?
44
-
45
-
46
40
 
47
41
  一般的です。
48
42
 
@@ -50,8 +44,6 @@
50
44
 
51
45
  > そもそもポインタは変数ではないのでメンバという言い方はしないのでしょうか?
52
46
 
53
-
54
-
55
47
  ポインタは「型」です。「`int`型の変数」と同じように、「ポインタ型**の**変数」という言い方をします。例えば`int *p;`は、「`int`型へのポインタ型の変数`p`」になります。
56
48
 
57
49