#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 # классы являются ссылками, поэтому вы не передаете объекты.