2013-08-16 16 views
5

Chúng tôi có lớp học sau đây. Tôi cần giải thích một số phần của mã.Từ khóa nhà điều hành C++

class CPoint3D 
    { 
    public: 
     double x, y, z; 

     CPoint3D (double dX = 0.0, double dY = 0.0, double dZ = 0.0) 
       : x(dX), y(dY), z(dZ) {} 
     //what means these lines of code? 
     CPoint3D operator + (const CPoint3D& point) const; 
     CPoint3D operator - (const CPoint3D& point) const; 
     CPoint3D operator * (double dFactor) const; 
     CPoint3D operator/(double dFactor) const; 
}; 

Tôi đoán sử dụng

CPoint3D operator + (const CPoint3D& point) const;

chức năng tôi có thể dễ dàng thêm/trừ trường hợp/nhân/chia của CPoint3D lớp học?

Ai đó có thể giải thích điều này bằng ví dụ? Cảm ơn!

+0

Bạn có muốn biết làm thế nào để sử dụng các nhà điều hành hoặc làm thế nào để thực hiện chúng? – doctorlove

+0

@doctorlove, Cả hai. – Nurlan

+1

Có một [câu hỏi hoành tráng] (http://stackoverflow.com/questions/4421706/operator-overloading) giải thích mọi thứ khá tốt. – juanchopanza

Trả lời

10

Có hàng triệu ví dụ và/hoặc bài viết này trên web (bao gồm this one) vì vậy tôi sẽ không lặp lại chúng tại đây.

đủ để nói rằng khi bạn thêm cùng hai CPoint3D đối tượng với obj1 + obj2, chức năng đó được gọi là operator+ cho lớp đó, với một đối tượng là this và người kia là point.

Mã của bạn chịu trách nhiệm tạo một đối tượng khác có chứa thêm hai đối tượng đó, sau đó trả lại.

Ditto cho phép trừ. Các toán tử nhân là hơi khác nhau vì chúng sử dụng giá trị gấp đôi làm đối số khác - có lẽ khi thêm/bớt các thành viên riêng lẻ trong lớp của bạn cho toán tử cộng, điều đó không hữu ích cho các phép nhân.

3

Bạn có thể đọc một số tài liệu liên quan đến C++ operator overloading. Cũng here, hoặc here, hoặc chỉ Google nó :)

Dưới đây là một ví dụ đơn giản từ cplusplus.com:

// vectors: overloading operators example 
#include <iostream> 
using namespace std; 

class CVector { 
    public: 
    int x,y; 
    CVector() {}; 
    CVector (int,int); 
    CVector operator + (CVector); 
}; 

CVector::CVector (int a, int b) { 
    x = a; 
    y = b; 
} 

CVector CVector::operator+ (CVector param) { 
    CVector temp; 
    temp.x = x + param.x; 
    temp.y = y + param.y; 
    return (temp); 
} 

int main() { 
    CVector a (3,1); 
    CVector b (1,2); 
    CVector c; 
    c = a + b; 
    cout << c.x << "," << c.y; 
    return 0; 
} 
+3

Có thể lấy const CPoint3D & điểm cho toán tử + như OP không? – doctorlove

+0

Vâng, các loại đối số của các toán tử không gán quá tải không thực sự quan trọng. Họ không có ý nghĩa gì cả! Điều này không giống như copy/move constructors/các toán tử gán, trong đó đối số phải là một trong các kiểu xác định của _lvalue_ đại diện cho cùng một kiểu để được coi là một bản sao/di chuyển 'thực'. Nhưng đối với bất kỳ đối tượng lớn hơn nào, đi qua tham chiếu 'const &' sẽ hiệu quả hơn. Ví dụ ở đây, có chứa 2 loại cơ bản, tôi _think_ nằm ngay trên đường biên, nơi cần có điểm chuẩn cẩn thận để chứng minh việc truyền qua bản sao hay -ref hiệu quả hơn. –

+0

Btw, vì đối số là giá trị, nếu bất cứ ai tự hỏi tại sao câu trả lời này không chỉ thêm vào và trả về _that_, một lý do chính đáng - mà tôi cho là Didac đã ghi nhớ! - đó là các đối số được miễn từ tên tối ưu hóa giá trị trả về: http://stackoverflow.com/q/6009278/2757035 Vì vậy, trong khi bạn có thể nghĩ rằng nó chậm để tạo tạm thời và thêm vào nó - làm như vậy cho phép trình biên dịch (có lẽ !) thực hiện các phép biến đổi lớn vốn có trong RVO và thu được kết quả hiệu quả hơn nhiều bằng cách xây dựng 'temp' trực tiếp tại trang gọi, thay vì trả về một giá trị cần phải sao chép. –