找回密碼 或 安全提問
 註冊
|註冊|登錄

伊莉討論區

搜索
請尊重及感激所有版主付出和奉獻伊莉需要你的贊助和支持搞笑、娛樂、精彩的影片讓你看
無修無碼mg火影波多野結幼女
小宵虎南ハーレム寝取られwindows 女友品黑絲質詢

休閒聊天興趣交流學術文化旅遊交流飲食交流家庭事務PC GAMETV GAME
熱門線上其他線上感情感性寵物交流家族門派動漫交流貼圖分享BL/GL
音樂世界影視娛樂女性頻道潮流資訊BT下載區GB下載區下載分享短片
電腦資訊數碼產品手機交流交易廣場網站事務長篇小說體育運動時事經濟
上班一族博彩娛樂

Hololive 5th fes. Ca

✡ 斗破蒼穹 年番/鬥

[繁]肌肉魔法使-MASHL

[繁]我獨自升級11-

[繁]最強肉盾的迷宮攻

[簡]北海道辣妹金古錐
C & C++ 語言C# 語言Visual Basic 語言PHP 語言JAVA 語言
查看: 2888|回復: 4

[問題] 對於C++ class中 operator=() 和 operator=(&)的差別[複製鏈接]

Rank: 1

帖子
47
積分
41 點
潛水值
13340 米
發表於 2019-3-24 12:20 AM|顯示全部樓層
若對尊貴或贊助會員有任何疑問,歡迎向我們查詢。我們的即時通或MSN: admin@eyny.com
本帖最後由 在那裡 於 2019-3-24 12:30 AM 編輯

小弟在寫程式作業時,遇到了一個令我不解的問題:
由於是多檔案實作,程式碼有些長,我附上關鍵的程式碼就好。
使用的環境是Visual Studio 2017

首先是我定義的class
  1. class Month
  2. {
  3. private:
  4.         int month;

  5.         int translateStr(char a, char b, char c);
  6.         std::string translateNum(int num);

  7. public:
  8.         Month() : month(1) {};
  9.         Month(char a, char b, char c);
  10.         Month(int num);
  11.         ~Month() {};

  12.         void setMonth(int mon);
  13.         void setMonth(char a, char b, char c);
  14.         void inputInt();
  15.         void inputStr();
  16.         void inputFirstThreeLetters();
  17.         void outputInt();
  18.         void outputFirstThreeLetters();
  19.         void outputStr();
  20.         Month nextMonth();

  21.         Month& operator=(Month& b); //出問題的函數,改為 Month& operator=(Month b);就沒問題

  22. };
複製代碼


再來是出問題的行數
在main中
  1. int main()
  2. {
  3.         Month month1, month2(2), month3('M', 'a', 'r'), month4, month5, month6;
  4.         //month3並無錯誤。
  5.         
  6.         month4 = month3.nextMonth(); //錯誤行數,訊息為:

  7.         //error C2679: 二元運算子 '=': 找不到使用右方運算元類型 'Month' 的運算子 (或是沒有可接受的轉換)
  8.         //note: 可能是 'Month &Month::operator =(Month &)'
  9.         // note: 當嘗試符合引數清單 '(Month, Month)' 時
  10.         .......
  11.         return 0
  12. }
複製代碼


接下來是函數的實作
  1. Month& Month::operator=(Month& b)
  2. {
  3.         if (&b == this)
  4.         {
  5.                 return *this;
  6.         }

  7.         month = b.month;
  8.         return *this;
  9. }


  10. Month Month::nextMonth()
  11. {
  12.         return Month(month + 1);
  13. }


  14. Month::Month(int num)
  15. {
  16.         setMonth(num);
  17. }

  18. void Month::setMonth(int mon)
  19. {
  20.         if (mon <= 0 || mon > 12) //超出range
  21.         {
  22.                 month = 1;
  23.         }
  24.         else
  25.         {
  26.                 month = mon;
  27.         }
  28. }
複製代碼

為了讓程式碼能正常運作
附上Month3所使用的建構函數
Month::Month(char a, char b, char c)
{
        setMonth(a, b, c);
}

void Month::setMonth(char a, char b, char c)
{
        setMonth(translateStr(a, b, c));
}

int Month::translateStr(char a, char b, char c)
{
        std::string str = "";
        str += a;
        str += b;
        str += c;

        for (int i = 1; i <= 12; i++)
        {
                if (str == translateNum(i))
                {
                        return i;
                }
        }

        return 0; //error,查詢不到
}

std::string Month::translateNum(int num)
{
        static std::string table[12] =
        {
                "Jan", //1月
                "Feb", //2月
                "Mar", //3月
                "Apr", //4月
                "May", //5月
                "Jun", //6月
                "Jul", //7月
                "Aug", //8月
                "Sep", //9月
                "Oct", //10月
                "Nov", //11月
                "Dec"  //12月
        };

        if (num <= 0 || num > 12)
        {
                return "";
        }
        else
        {
                return table[num - 1];
        }
}



會出錯是不是因為傳遞的是自動變數,而不能使用reference的關係?還是說……?


...
瀏覽完整內容,請先 註冊登入會員
如果瀏覽伊莉時速度太慢或無法連接,可以使用其他分流瀏覽伊莉,www01.eyny.com(02,03)。

使用道具檢舉

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

帖子
155
積分
1291 點
潛水值
47805 米
發表於 2019-3-24 06:13 PM|顯示全部樓層
若瀏覽伊莉的時侯發生問題或不正常情況,請使用Internet Explorer(I.E)。
因為nextMonth回傳的型別是Month,但=右側要放入的卻是Month&。所以無法轉換
若瀏覽伊莉的時侯發生問題或不正常情況,請使用Internet Explorer(I.E)。

使用道具檢舉

Rank: 1

帖子
58
積分
163 點
潛水值
7017 米
發表於 2019-4-3 09:38 AM|顯示全部樓層
分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。
int 跟 int* 是不一樣的東西,這個可以理解嗎?
那Month跟Month&也就是不一樣的東西啦,一個是值一個是位址。
你這段像是想要寫成 車子A = 車子B,但卻寫成了 車子A = 停著車子B的車庫
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php

使用道具檢舉

帖子
74
積分
0 點
潛水值
12880 米
發表於 2019-4-14 01:39 PM|顯示全部樓層
回覆中加入附件並不會使你增加積分,請使用主題方式發佈附件。

使用道具檢舉

帖子
6
積分
52 點
潛水值
18610 米
發表於 2019-4-25 11:58 PM|顯示全部樓層
所有積分大於負-100的壞孩子,將可獲得重新機會成為懲罰生,權限跟幼兒生一樣。
本帖最後由 hi625096 於 2019-4-26 12:02 AM 編輯

簡單做一個概述,在C++ 中&配合變數宣告或是函數參數時是參考(Reference)的意思,
若&與一個變數單獨使用則與C語言的&等價就是取地址。
Ex: int &rnum = num; 參考
      int *pnum = # 取地址
------------------------------------------------------------------------------------------
參考可以視為為這個變數取一個小名,當你操作這個參考時等價於操作該變數本身,所以sizeof()該參考的大小會與該變數相同,所以在C++中使用參考當函數參數時不需要傳入地址,直接傳入該變數即可達到與call by address的效用,
...
瀏覽完整內容,請先 註冊登入會員





如果發覺自己無法使用一些功能或出現問題,請按重新整理一次,並待所有網頁內容完全載入後5秒才進行操作。

使用道具檢舉

您需要登錄後才可以回帖 登錄 | 註冊

Powered by Discuz!

© Comsenz Inc.

重要聲明:本討論區是以即時上載留言的方式運作,對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本討論區受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者發現有留言出現問題,請聯絡我們。有權刪除任何留言及拒絕任何人士上載留言,同時亦有不刪除留言的權利。切勿上傳和撰寫 侵犯版權(未經授權)、粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。
回頂部