D Classes Passed By Reference or Value?

Brandon Ragland via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Aug 16 16:13:37 PDT 2015


On Sunday, 16 August 2015 at 22:35:15 UTC, Alex Parrill wrote:
> On Sunday, 16 August 2015 at 22:31:02 UTC, Brandon Ragland 
> wrote:
>> Hi All, I'm a bit confused as to how Classes in D are passed 
>> in arguments and returns.
>>
>> Take this for example:
>>
>> class MyClass{
>> int x = 2;
>> }
>>
>> And then in app.d
>>
>> ref MyClass doStuff(){
>> MyClass mc = new MyClass() // Heap allocation, using new....
>> return mc;
>> }
>>
>> The above fails, as "escaping reference to local variable" 
>> however, this was created using new.... Not understanding what 
>> the deal is, this should be a valid heap allocated object, and 
>> therefore, why can I not pass this by reference? I don't want 
>> this to be a local variable...
>>
>> So this begs the question: Are Classes (Objects) passed by 
>> reference already?
>>
>> -Brandon
>
> Classes are reference types, a la Java/C#.
>
>     class MyClass {
>         int x = 5;
>     }
>
>     void main() {
>         auto c1 = new MyClass();
>         auto c2 = c1;
>         c1.x = 123;
>         assert(c2.x == 123);
>     }

Thanks,

That makes more sense. Though it does make the ref method 
signature unclear, as it only applies to literals at this point?

Would you still need the ref signature for method parameters for 
classes to avoid a copy? Such that I could work on the class 
itself, and not a copy.


//This is reference?
void doStuff(ref MyClass mc){
return;
}

or would this also be a valid reference type:

//This is a copy?
void doStuff(MyClass mc){
return;
}


More information about the Digitalmars-d-learn mailing list