簡體   English   中英

-減去C ++中的一元運算符重載

[英]- minus unary operator overloading in c++

#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);感到困惑// return Distance(feet, inches); 我已經將此語句作為程序中的注釋進行了聲明,但輸出仍然是正確的。 但是,如果我運行程序時未對其進行注釋,則該程序也可以正常運行,而不是該語句用於什么目的? 第二,構造函數是否返回值? 第三,它如何返回值我的意思是它不是變量我一直聽說我們可以從變量返回值?

  1. return Distance(feet, inches); 影響-D1之類的表達式的值,因此,如果執行D1 = -D2 ,則使用return會有所不同。

  2. 構造函數不返回任何內容。 它僅包含創建對象時運行的代碼。

  3. 從某種意義上說,返回值就像一個不可見變量。 但是,您需要閱讀很多有關匯編,編譯器和cpu的知識,才能更好地理解它。

如果我在未注釋的情況下運行程序,則該程序也可以正常運行,而該語句的用途是什么?

來自[stmt.return]

從構造函數,析構函數或具有cv void返回類型的函數的末尾流出就等於沒有操作數的返回。 否則,從main([basic.start.main])以外的函數的末尾流出會導致未定義的行為。

您的程序導致未定義的行為 ,任何事情都可能發生。

第二,構造函數是否返回值?

我認為您的意思是:

return Distance(feet, inches);

那條線返回一個以feetinches為單位的Distanceprvalue 該值應該可以進行復制刪除,並且可以保證從C ++ 17中刪除該值

第三,它如何返回值我的意思是它不是變量我一直聽說我們可以從變量返回值?

從上述的[stmt.return]中,重點是我的:

return語句的expr-or-braced-init-list稱為其操作數。 沒有操作數的return語句只能在返回類型為cv void,構造函數([class.ctor])或析構函數([class.dtor])的函數中使用。 操作數類型為void的return語句只能在返回類型為cv void的函數中使用。 帶有任何其他操作數的return語句只能在返回類型不是cv void的函數中使用; return語句通過從操作數進行復制初始化([dcl.init])來初始化(顯式或隱式)函數調用的glvalue結果或prvalue結果對象 [注意:如果return語句不是prvalue或類型與函數的返回類型不同,則返回語句可以涉及構造函數的調用以執行操作數的復制或移動。 如果返回了自動存儲持續時間變量([class.copy]),則可以取消與return語句關聯的復制操作或將其轉換為move操作。 —尾注] [示例:

  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);
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM