2016-11-18 2 views
0
#include <iostream> 
#include<conio.h> 
using namespace std; 

class Distance { 
    private: 
     int feet;    // 0 to infinite 
     int inches;   // 0 to 12 
    public: 
    // required constructors 
     Distance(){ 
     feet = 0; 
     inches = 0; 
    } 
    Distance(int f, int i){ 
     feet = f; 
     inches = i; 
    } 
    // method to display distance 
    void displayDistance() { 
     cout << "F: " << feet << " I:" << inches <<endl; 
    } 
    // overloaded minus (-) operator 
    Distance operator-() { 
     feet = -feet; 
     inches = -inches; 
     // return Distance(feet, inches); 
    } 
}; 

int main() { 
    Distance D1(11, 10), D2(-5, 11); 

    -D1;      // apply negation 
    D1.displayDistance(); // display D1 

    -D2;      // apply negation 
    D2.displayDistance(); // display D2 

    return 0; 
} 

Я начинаю изучать функцию перегрузки оператора C++. Этот код на самом деле работает нормально, но на одном шаге я немного смущен // return Distance(feet, inches); Я сделал этот оператор как комментарий в программе, но все же вывод верен. но если я запускаю программу, не комментируя ее, программа работает отлично, чем в какой цели используется этот оператор? Во-вторых, это функция-конструктор, возвращающая значения? В-третьих, как это возвращает значения, я имею в виду, что это не переменная, которую я всегда слышал, мы можем возвращать значения из переменной?- минус унарная перегрузка оператора в C++

+0

Что делает '-D1.displayDistance()' show? – danielunderwood

+0

- D1.displayDistance(); это не -. –

+0

'operator -' не должен изменять переменную, поэтому вы не должны использовать ее как' '-D1; ', которая ничего не должна делать. вы должны использовать его следующим образом: 'D1 = -D1;' – smead

ответ

0

если я запускаю программу, не делая его комментировать программу также работает отлично, чем в том, что цель это утверждение с помощью

От [stmt.return]:

Измельчитель с конца конструктора, деструктора или функции с возвратным типом cv void эквивалентно возврату без операнда. В противном случае, выключение конца функции, отличной от основной ([basic.start.main]), приводит к неопределенному поведению.

Ваша программа в результате к неопределенное поведение, все может случиться.

Во-вторых, это функция-конструктор, возвращающая значения?

Я думаю, что вы имели в виду эту строку:

return Distance(feet, inches); 

Эта линия возвращал prvalue из Distance, который построен из feet и inches. Это значение должно иметь право на копирование и гарантировать, что оно будет отменено в копии с C++ 17

В-третьих, как это возвращает значения. Я имею в виду, что это не переменная, которую я всегда слышал, мы можем возвращать значения из переменная?

Из указанного [stmt.return], выделено мной:

выраж-или-приготовился-INIT-лист оператора возврата называется его операнд. Оператор return без операнда должен использоваться только в функции, тип возврата которой является cv void, конструктором ([class.ctor]) или деструктором ([class.dtor]).Оператор return с операндом типа void должен использоваться только в функции, возвращаемый тип которой является vvoid. Оператор return с любым другим операндом должен использоваться только в функции, тип возврата которой не является vv void; оператор return инициализирует результат результата glvalue или объект результата prvalue (явный или неявный) вызов функции с помощью copy-initialization ([dcl.init]) из операнда. [Примечание. Оператор return может включать вызов конструктора для выполнения копирования или перемещения операнда, если он не является prvalue или его тип отличается от возвращаемого типа функции. Операция копирования, связанная с оператором return, может быть отменена или преобразована в операцию перемещения, если возвращается переменная продолжительности автоматического хранения ([class.copy]). - конец примечание] [Пример:

std::pair<std::string,int> f(const char* p, int x) { 
    return {p,x}; 
} 

return заявление должно идти в те формы:

return; // for void and constructor, destructor 

или

return expression-or-braced-init-list; 

Во всяком случае, я думаю, что ваш оператор минус должен выглядеть следующим образом:

Distance operator-() { 
    return Distance(-feet, -inches); 
} 
+0

s/все может случиться/демоны могут летать из вашего носа / – Qix

0
  1. return Distance(feet, inches); влияет на значение выражения, как -D1, так что если вы D1 = -D2, то с помощью return будет иметь значение.

  2. Функция-конструктор ничего не возвращает. Он просто содержит код, который запускается при создании объекта.

  3. В некотором смысле возвращаемое значение похоже на невидимую переменную. Тем не менее, вам нужно будет много узнать о сборке, компиляторах и процессоре, чтобы понять их лучше.

Смежные вопросы