On Tuesday, 8 November 2022 at 12:30:50 UTC, Alexander Zhirov
wrote:
Do I understand correctly that in order for me to pass a string
when creating an object, I must pass it by value? And if I have
a variable containing a string, can I pass it by reference?
Should I always do constructor overloading for a type and a
reference to it?
In the case of the variable `c`, a drop occurs. Why? An object
is not being created on the stack?
```d
import std.stdio : writeln;
class A
{
private string str = "base";
this(ref string str)
{
writeln("type reference string");
this.str = str;
}
this(string str)
{
writeln("type string");
this.str = str;
}
this() {}
void print()
{
writeln(str);
}
}
void main()
{
auto a = new A("Hello, World!"); // this type string
a.print();
string text = "New string";
auto b = new A(text); // this type reference string
b.print();
A c;
c.print(); // segmentation fault! Why not "base"?
}
```
You forgot to assign "c" to anything, I think you meant:
`A c = b;`
Read that segmentation fault as null pointer exception.
Whenever you assign something to `ref type something`, it will
basically be the same as writing `myVariable = *something;` in C
code, so, in that case, it won't make any difference.
The `ref` attribute only means that if you change your string
inside the code that takes by ref, it will reflect when
returning, such as:
```d
void modifyString(ref string input)
{
input~= "Now it is modified";
}
string text = "New string";
modifyString(text);
writeln(text); //"New stringNow it is modified"
```