首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ operator+ 重載失敗於 const 物件?加上 const 資格與傳值參數

     編輯:程式設計綜合問答

錯誤程式碼

A operator+(A& p) { // 非 const 參考,非 const 成員函數
    A tmp(n + p.n);
    return tmp;
}

const A a(10); a + A(30); 編譯失敗:const A 無法綁定到非 const 參考,且無 const 版本可呼叫。

修正版

A operator+(A p) const { // 1. 成員函數加 const  2. 參數傳值 (支援臨時物件)
    return A(n + p.n);
}

關鍵點解析

修改原因
const 後置允許 const A 物件調用
參數 A p (傳值)接受右值 A(30),避免綁定非 const 參考失敗;C++17 保證複製消除 (RVO) 無效能損失
回傳 A (非參考)回傳區域物件,編譯器優化為直接建構於呼叫端

完整可編譯範例

#include <iostream>
struct A {
    int n;
    A() = default;
    A(int n_) : n(n_) {}
    A operator+(A p) const { return A(n + p.n); }
};
int main() {
    A c;
    const A a(10);
    c = a + A(30); // OK
    std::cout << c.n; // 40
}

進階:非成員函數重載 (更對稱)

friend A operator+(A lhs, const A& rhs) {
    lhs.n += rhs.n;
    return lhs;
}

支援 A + A、int + A (若有轉換建構子) 等混合運算。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved