你好,我在C++大約一個月的時間,所以請原諒,如果這個問題太微不足道了。C++返回一個臨時對象的問題
#include <iostream>
using namespace std;
class Point {
int x,y;
public:
Point(int x_val = 0,int y_val = 0) :x(x_val),y(y_val) { }
Point(Point& copy) : x(copy.x), y(copy.y) { }
void showLocation() const { cout << "[" << x << "," << y << "]" << endl; }
friend Point operator+(const Point& p1, const Point& p2);
friend Point operator-(const Point& p1, const Point& p2);
Point operator-(Point& p2) { // (1)
Point(x-p2.x, y-p2.y).showLocation();
return Point(x-p2.x, y-p2.y);
}
};
Point operator+(const Point& p1, const Point& p2) { // (2)
Point pos(p1.x+p2.x, p1.y+p2.y);
return pos;
}
Point operator-(const Point& p1, const Point& p2) { // (3)
return Point(p1.x-p2.x, p1.y-p2.y);
}
int main() {
Point p1(3,4);
Point p2(2,5);
(p1+p2).showLocation();
//(p1-p2).showLocation();
operator-(p1,p2);
}
因此,這是實踐操作符重載一個簡單的代碼 - 我只是創造了一個點和過載+和 - 運營商,無論是作爲類的成員,全局函數。
當我編譯這段代碼,但是,我發現,雖然(2)的作品,無論是(1)和(3)繼續顯示,我看不出爲什麼錯誤:
q1.cpp:17:10: error: no matching constructor for initialization of 'Point' return Point(x-p2.x, y-p2.y); ^~~~~~~~~~~~~~~~~~~~~ q1.cpp:8:2: note: candidate constructor not viable: no known conversion from 'Point' to 'int' for 1st argument
據我瞭解,(1)和(3)都應該返回一個臨時的Point對象,根據Google搜索,它應該等同於情況(2)。
此外,錯誤陳述更令我困惑 - 我看不到任何轉換髮生在提到的表達式中是有問題的。
Point(x-p2.x, y-p2.y).showLocation();
這工作得很好,和外殼(2)也做,所以我想這不是一個語法問題。除了關於返回臨時對象(不命名它)的問題的可能性之外,我看不到任何問題。
謝謝!
我可以看到你來自哪裏。爲什麼(2)與(1)和(3)不同?從概念上說,它們基本上是等價的,但從技術上講,因爲(2)使用了一個命名變量而不是臨時的,它允許該值基於非const引用參數。 C++不允許以這種方式使用臨時對象。 – nobar
因此,我在網上看到的'返回SomeObject(1,2)'實際上是錯誤的,那麼。猜猜我必須做更好的搜索。謝謝! – SJC
這沒有錯。問題出在你的拷貝構造函數中。 – nobar