2011-02-25 36 views
11

Tôi đã nghe nó được sử dụng như quá tải toán tử + ví dụSử dụng toán tử cộng chỉ hành

class MyClass 
{ 
    int x; 
public: 
    MyClass(int num):x(num){} 
    MyClass operator+(const MyClass &rhs) 
    { 
     return rhs.x + x; 
    } 
}; 

int main() 
{ 
    MyClass x(100); 
    MyClass y(100); 
    MyClass z = x + y; 
} 

Đây có phải là thực sự việc sử dụng các toán tử cộng điều hành hoặc là nó thực sự là một nhà điều hành + nhị phân?

Trả lời

18

Đây không phải là quá tải và sử dụng unary + .. Bạn cần phải hoặc là làm cho điều đó một chức năng miễn phí hoặc thực hiện các chức năng thành viên mất 0 luận

class MyClass 
{ 
    int x; 
public: 
    MyClass(int num):x(num){} 
    MyClass operator+() const 
    { 
     return *this; 
    } 
}; 

int main() { 
    MyClass x = 42; 
    + x; 
} 
+0

Bạn có thể trả về 'tham chiếu' thay cho giá trị không? – user963241

+4

@cpx có nhưng đó có thể là một ý tưởng tồi, bởi vì tất cả các loại như 'int' đều mang lại giá trị quá, thay vì tham chiếu đến biến ban đầu. "Làm như nó làm như thế" (Scott Meyers). –

5

Đó là một nhị phân + nhà điều hành. Để quá tải toán tử cộng đơn, bạn cần something like this.

2

Khi hàm toán tử là hàm thành viên, hàm này có thêm một đối số (this) được đề cập một cách rõ ràng trong khai báo. Vì vậy, trong trường hợp của bạn đó là nhị phân +, đối số đầu tiên là this, đối số thứ hai là đối số được truyền.

1

Điều này đã được hỏi một vài lần trước đây.

Toán tử + là nhị phân. Nếu được định nghĩa là hàm thành viên cần phải là const.

class MyClass 
{ 
    int x; 
public: 
    MyClass(int num):x(num){} 
    MyClass operator+(const MyClass &rhs) const 
    { 
     return rhs.x + x; 
    } 
}; 

Nó được khá thường xuyên thực hiện trong điều kiện của nhà điều hành + =

Lưu ý bạn đã chuyển các giao hoán nhưng nó sẽ làm việc như + cho int là giao hoán.

Toán tử + đơn nhất làm thành viên sẽ không có tham số và sẽ không sửa đổi đối tượng do đó phải là const. Việc triển khai tùy thuộc vào đối tượng của bạn. Bạn có thể sử dụng nó như là "abs" cho int của bạn. (Sử dụng nó như là một no-op phục vụ ít mục đích).

MyClass MyClass::operator+() const 
    { 
     return (x >= 0) ? MyClass(x) : MyClass(-x); 
    } 
+5

Sử dụng nó như abs, mặt khác, sẽ chỉ là khó hiểu. – UncleBens

+1

Vâng, nhưng tôi thấy không có điểm trong quá tải một nhà điều hành là một no-op mặc dù nó buộc một bản sao. – CashCow

+1

Sau đó, đừng quá tải toán tử +. Nếu bạn muốn giá trị tuyệt đối, hãy sử dụng hàm có nghĩa là giá trị tuyệt đối. –

Các vấn đề liên quan