値型と参照型
値型とは、lvalue に直接代入できるデータ。たとえば、C 言語の int
, char
, double
, ... などの基本型は値型で
a = b;
のようにすると、その値を直接代入する。ポインタ変数も値型だからその値(アドレス値)が代入される。
C の構造体は値型だ。たとえば struct S
の変数 a
, b
は代入するとそのデータがすべてコピーされる。
C の配列はこの意味で値型ではない。つまり配列の値がすべてコピーされる事はない。 1 次元配列の配列名は即座にその要素へのポインタに格下げされ、そのポインタがコピーされる。従って、配列に代入はできない。
C++ での構造体は値型ではない。つまり、 C のような意味でデータがすべてコピーされるのではない*1。構造体の機能はクラスとほぼ同じで、代入演算子 =
による代入は、その構造体(クラス) の operator=()
が呼ばれる*2。関数が定義されていない場合は「デフォルトの代入演算子」によってすべてのメンバにたいして代入が行われる。つまり、すべてのメンバに対して operator=()
による代入が行われる。
C# は…略。
…で、参照型って何なんだか書いてないよ?( C++ の用語「参照」とは違うよ)