Is this a desing rationale? (static array object member)
Brian Hsu
brianhsu.hsu at gmail.com
Sat Sep 29 00:47:45 PDT 2007
I posted a similar post at D.learn newsgroup and got a explanation about this. But I have a question after got that answer: is this reasonable?
Here is my code:
class Test
{
int [] z = [1,1,1,1,1];
void addByOne () { //Increase all elements in x by 1}
}
void fun1 (int y)
{
int [] x = [1,1,1,1,1];
foreach (int i, int v; x ) {
x[i] = x[i]+y;
}
}
void fun2 ()
{
int [] y = [1,1,1,1,1];
foreach (int i, int v; y ) {
Stdout.format ("{} ", v);
}
Stdout.newline;
}
void main ()
{
Test a = new Test();
Test b = new Test();
a.addByOne();
// Now b.z will be [2,2,2,2,2]
fun1(3);
fun2(); // Still print [1,1,1,1,1]
}
So a.z and b.z pointed to same array, but int [] y and int [] z are still different array instance.
Regan mentioned that this is because the array literal [1,1,1,1,1] create only one instance of array*, so at first time I suspect that when compiler see [1,1,1,1,1], it would translate that to a fixed memory address of something like that.
* http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.learn&article_id=9580
But it clearly that int [] x and int [] y is still a different array instance even they have same array literal initialization.
So, after all, when is a.z and b.z point to same array instance exactly? Since I believe it should be runtime, not compile time to do initialization of object member, then why a.z and b.z is same array instance but int [] x and int [] y is different array instance?
Finally, is this behavior reasonable? Since I didn't declare that int [] as a static class member, even though they have same initialization array literal, but I would expect that a.z/b.z they should be different array have same content. (As in Java or C++)
Or is there special reasons of this strange behaver?
More information about the Digitalmars-d
mailing list