回答編集履歴
3
修正
test
CHANGED
@@ -26,9 +26,9 @@
|
|
26
26
|
|
27
27
|
|
28
28
|
|
29
|
-
|
29
|
+
結局のところ、これは一般的に振る舞いの異なる値型と参照型を区別せずに扱うことにより起きる混乱だと思います。
|
30
30
|
|
31
|
-
|
31
|
+
値型を扱わない、扱えない言語 (例えば Ruby のような、全てのデータが参照型と同じ振る舞いをするように作られた言語) においては、代入によってコピーが行われる状況は通常発生しないため、この場合は「代入はシャローコピーである」は明確に間違いになります。
|
32
32
|
|
33
33
|
|
34
34
|
|
2
全面修正/コメント参照
test
CHANGED
@@ -1,3 +1,45 @@
|
|
1
|
+
(2020/02/13 全面修正)
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
変数への代入時にコピーが行われるかどうかは、その対象が「値」であるか「参照」であるかの違いに拠ります。
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
対象が値の場合、変数への代入時にはデータそのものがコピーされるため、まさにシャローコピーと呼ばれる挙動と同様の振る舞いとなります。
|
10
|
+
|
11
|
+
これを指して「代入はシャローコピーである」と表現するのは、表現の是非は別として、間違いではないと思います。
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
C# や C++ の言語では、値そのものを直接扱うことが可能なため、代入がシャローコピーとなる状況がしばしば発生します。
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
さらに、プログラミング言語によっては上記のルールに当てはまらない特殊な処理を行っているものもあり、例えば PHP の配列は、変数の内容は参照であるにも関わらず、値型のような振る舞いが期待されており、実際そのように振る舞うような暗黙的なコピー処理が実装されているとのことです。
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
「シャローコピー」とは、言い換えると「対象のクローン」に相当し、対象が持つ「値」をそっくりそのまま持った新たなデータを生成することを指します。
|
24
|
+
|
25
|
+
代入によって発生するのは値の複製以上のものではないため、代入時にデータの複製が発生する場合は、必ずシャローコピーとなります (特殊な処理を実装していない限り)。
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
以上の回答は、「値型を含め、全てはオブジェクトである」という立場に則ったものです。
|
30
|
+
|
31
|
+
仮に、値型をオブジェクトに含まない (Ruby のような、全てのデータが参照である状況を指して「全てはオブジェクトである」と表現する) という立場では、代入によってコピーが行われる状況は発生しないため、このときは「代入はシャローコピーである」は明確に間違いになります。
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
---
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
以下は過去の回答です。
|
40
|
+
|
41
|
+
|
42
|
+
|
1
43
|
こんにちは。
|
2
44
|
|
3
45
|
|
1
コメントの内容について追記
test
CHANGED
@@ -13,3 +13,27 @@
|
|
13
13
|
代入時に本当にオブジェクトを複製してしまう「代入はシャローコピー」が成り立つようなプログラミング言語が存在するかもしれません。
|
14
14
|
|
15
15
|
用語を濫用し、代入をシャローコピーと呼ぶ低品質なリファレンスを持つプログラミング言語が存在するかもしれません。
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
---
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
以上の話は扱う対象が「オブジェクト」であることが前提です。
|
24
|
+
|
25
|
+
オブジェクトを雑に定義すると、「存在の同一性が確認可能なもの」とでもしておきます。
|
26
|
+
|
27
|
+
このとき、値はオブジェクトではない (全く同じ中身を持っていても、それが同じ存在であるかどうかは分からない) ため、代入とコピーの議論から外れます。
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
コメントで maisumakun さんからサジェストを頂きましたが、
|
32
|
+
|
33
|
+
C++ のオブジェクトは「値」としても扱うことができ、その場合は代入操作で自身が複製されるため、まるでシャローコピーされたような挙動になります。
|
34
|
+
|
35
|
+
PHP の配列は値である、とのことなので、オブジェクトとしてではなく値としての代入の振る舞いを再現しており、内部的には参照であるにもかかわらず、代入時に (※) コピーを行っています。
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
少なくとも、「オブジェクトの定義を満たすものの代入」について、上記言語においても本回答の内容は成り立っています。
|