Skip to content
Silica edited this page Sep 4, 2012 · 7 revisions

#reference ##PSL int a = 1; ref r = a; r += 2; if (a == 3) // true print("true!"); or

int a = 1;
p = &a;
p += 2;
if (a == 3)	// true
	print("true!");

sample:

int a = 1;
int b = 10;
p = &a;
p = b;		// pの指す対象(a)にbの値を代入する
print(a);	// 10
p = &b;		// pの指す対象をbとする
p = 20;
print(b);	// 20
if (p == b)	// true(pの指す対象がbであるかどうか)
	print(a + p);	// 30
a = 20;
if (p == a)	// false(pの指す対象がaであるかどうか)
	hoge;
if (a == p)	// true(aの値がpの指す対象の値と同じであるか)
	print(p + a);	// 40

参照型は演算時には概ね指す対象の型と値として振る舞うが
基本的にはそれ自体は参照型であるので
if (p)はpが指す対象を持っているかどうかだし(!= nullptr)
pを左項に持ってきた==と!=は指す対象の判定である
不確実な場合は必ずデリファレンスしてから使う様にすると良い

以前は、C++の参照と同様に完全に対象そのものとして振る舞う参照型と
変数を指し示すだけのポインタ型が別々に存在していたのだが
両方存在する意味は無いのではないか?という意見により廃止された

###nullptr 空参照を示す基本組み込みグローバル定数

###代入動作 空の参照型変数に対して代入を行う場合
普通の変数を代入すれば、変数の参照を受け取り、その変数を参照する様になる
参照型変数を代入すれば、その変数の参照先を受け取り、同じものを指す参照になる

ref a;
int i;
a = i;	// aはiを指す参照となる
ref b;
b = a;	// bもiを指す参照となる

参照先が存在する参照型変数に対して代入を行う場合
普通の変数を代入すれば、参照先の変数に対して代入を行うのと同じ操作になる
参照型変数を代入すれば、その変数の参照先を受け取り、同じものを指す参照になる(空時と同じ)

ref a;
int i;
a = i;	// aはiを指す参照となる
int j = 10;
a = j;	// aの指す先(i)にjを代入する
print(i);	// 10

即ち、ref a = i;でもlocal a = &i;でも同じ動作であるが
ref a = &i;とした場合にaはiの参照を参照することにはならない
但し、参照の参照自体は&a& &iとすることで取得することが可能である.

###型変換動作 型変換が行われる場合、bool(上記参照)以外は参照先の値として振る舞う
(PSLにbool型はない、ifに直接渡す場合等の話である)

###比較動作 ==と!=上記参照
その他は参照先の型と値として振る舞う

###その他演算動作 参照型自体に演算が存在しない為、常に参照先の型と値として振る舞う

特に重要なのが配列アクセス演算子とメンバアクセス演算子である

a = 100,200,300;
ref r = a;
print(r[0]);	// 100
print(r[1]);	// 200
print(r[2]);	// 300

object b;
b.x = 500;
b.y = 600;
ref p = b;
print(p.x);	// 500
print(p.y);	// 600

PSLは代入時(引数渡しを含む)にコピーを作る、それはオブジェクトであっても例外ではないが
参照を保持して受け渡しをする様にすれば、不用意にコピーを作ることなく
それでいて元の変数と同じ使用感でアクセスすることが可能である

##C++ variable ###reference variable v = 1; variable r = v.ref(); v += 2; if (r == 3) // true printf("true!");

variable &r = v; // C++ reference ###pointer(same as PSL ref) variable v = 1; variable p = v.pointer(); p += 2; if (v == 3) // true printf("true!");

variable *p = &v; // C++ pointer

Clone this wiki locally