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"
    ```

Reply via email to