Считается ли передача r-значения функциям, возвращающим его, неправильной в C ?

#c

#c

Вопрос:

Я хочу создать функцию Service , которая заряжает разряженный телефон и возвращает его следующим образом.

введите описание изображения здесь

Запись

 Phone p;
p = Service(p);
  

выглядит не элегантно, поэтому я хочу написать следующее.

 Phoneamp; p = Service(Phone());
  

Это приводит к следующим странным выводам.

 Ctor
Dtor
Destroyed
Energy: 100%
Ending...
  

Ожидаемый результат:

 Ctor
Energy: 100%
Dtor
Destroyed
Ending...
  

Вопрос

Не могли бы вы рассказать мне, почему это происходит?

Примечание: я новичок в C .

 class Phone
{
private:
    int energy;
    bool destroyed = false;
public:
    Phone() : energy{ 0 } {
        cout << "Ctor" << endl;
    }
    ~Phone()
    {
        cout << "Dtor" << endl;
        if (destroyed == false)
        {
            cout << "Destroyed..." << endl;
            destroyed = true;
        }
    }

    void Energize() { energy = 100; }
    void Status() const
    {
        cout << "Energy: " << energy << "%" << endl;
    }
};


Phoneamp; Service(Phoneamp;amp; input)
{
    input.Energize();
    return input;
}


int main()
{
    Phoneamp; p = Service(Phone());
    p.Status();

    cout << "Ending..." << endl;
}
  

Комментарии:

1. const Buttonamp; b = ButtonHole(Button()); Временная кнопка уничтожается в конце инструкции. Расширение срока службы с постоянной ссылкой не является транзитивным через параметр in и вывод возвращаемого значения.

2. ButtonHole(Button()).PassThrough(); будет работать. Возможно, не совсем так, как вы ожидаете, но, по крайней мере, без неопределенного поведения.

3. Добавьте ведение журнала для конструкторов копирования / перемещения и операторов присваивания копирования / перемещения, что даст вам лучшее представление о том, что происходит на самом деле

Ответ №1:

Нет смысла возвращать копию телефона. Так что просто передайте его как ссылку и работайте с ним:

 void Service(Phoneamp; phone);
  
 Phone p{};

Service(p);
  

Комментарии:

1. То есть это означает, что C не имеет такой функции, которая доступна в C #? На C # мы можем писать Phone p = Auxiliary.Service(new Phone()); .

2. @NotAZoomedImage сначала: старайтесь не писать C как C #. Во-вторых: я не понимаю: какая функция? Ofc вы можете создать что-то подобное, но имейте в виду: в C # классы являются ссылками, поэтому вы не передаете объекты.