DOSEIの日記

技術メモ+日常ログ

値型と参照型

値型とは、lvalue に直接代入できるデータ。たとえば、C 言語の int, char, double, ... などの基本型は値型で

 a = b;

のようにすると、その値を直接代入する。ポインタ変数も値型だからその値(アドレス値)が代入される。

C の構造体値型だ。たとえば struct S の変数 a, b は代入するとそのデータがすべてコピーされる。
C の配列はこの意味で値型ではない。つまり配列の値がすべてコピーされる事はない。 1 次元配列の配列名は即座にその要素へのポインタに格下げされ、そのポインタがコピーされる。従って、配列に代入はできない。
C++ での構造体は値型ではない。つまり、 C のような意味でデータがすべてコピーされるのではない*1。構造体の機能はクラスとほぼ同じで、代入演算子 = による代入は、その構造体(クラス) の operator=() が呼ばれる*2。関数が定義されていない場合は「デフォルトの代入演算子」によってすべてのメンバにたいして代入が行われる。つまり、すべてのメンバに対して operator=() による代入が行われる。
C# は…略。

…で、参照型って何なんだか書いてないよ?( C++ の用語「参照」とは違うよ)

*1:たとえば構造体のメンバ間にパディングがあったとき、その部分もコピーされるかは未定義…だよね?

*2:一般にユーザ定義型を第一引数に持つ2項演算子は、その型の関数として呼ばれる。