2010-03-28 45 views
8

tôi đã được trao lớp với int biến x và y trong tư nhân, và một chức năng điều hành quá tải,câu hỏi liên quan "này" con trỏ trong C++

class Bag{ 
private: 
    int x; 
    int y; 
public: 
    Bag(); 
    ~Bag(); 
    //....... 
    //.....etc 
}; 


Bag operator+ (Bag new) const{ 
    Bag result(*this); //what does this mean? 
    result.x += new.x;   
    result.y += new.y; 
} 

tác dụng của việc có "kết quả Bag (* Đây là gì); " có ?.

+5

Hàm 'operator +' có thiếu câu lệnh 'return' không? –

+3

Điều này có vẻ không hợp lệ C++ - mới là từ khóa – Artyom

+0

Nếu bạn muốn tạo toán tử, tôi khuyên bạn nên xem 'Boost.Operators'. Họ đã nhóm các toán tử tương tự lại với nhau (như '+ =' và '+') và chỉ viết một trong các nhóm cấp cho bạn những người khác miễn phí :) –

Trả lời

10

Bag result(*this) tạo bản sao của đối tượng mà chức năng nhà điều hành được gọi.

Ví dụ nếu có:

sum = op1 + op2; 

sau đó result sẽ là một bản sao của op1.

Vì hàm operator+ đang thực hiện tổng các toán hạng của nó và trả về tổng, chúng ta cần một cách để truy nhập toán hạng op1 được thực hiện thông qua con trỏ this.

Ngoài ra chúng tôi có thể làm:

Bag result; 
result.x = (*this).x + newobj.x; // note you are using new which is a keyword. 
result.y = (*this).y + newobj.y; // can also do this->y instead 
return result; 
2

Chức năng operator+ trả về một bản sao. Tuyên bố:

Bag result(*this); 

là tạo một bản sao của đối tượng này để trả lại cho người gọi. Theo chữ ký, nó phải trả về một giá trị, do đó, nó tạo một bản sao và sau đó thêm đối tượng new.

4

Trước hết, hãy yêu cầu người viết mã không sử dụng new làm tên biến - đó là từ khóa. Ngoài ra, hãy nhớ đến return result;. Và có thể chuyển qua tham chiếu const hoặc trực tiếp sửa đổi túi new.


Bên trong cấu trúc/lớp, this là con trỏ của chính nó. Do đó, *this là tham chiếu đến toàn bộ cá thể của Bag.

Tuyên bố Bag result(a_bag_reference) sẽ gọi hàm tạo bản sao là Bag, tạo bản sao a_bag_reference thành result.

Do đó,

Bag result(*this); 

tạo một bản sao của chính nó, sau đó lưu trữ vào result. Điều này làm cho 2 câu tiếp theo

result.x += new.x; 
result.y += new.y; 

không ảnh hưởng đến các trường hợp riêng của mình (ví dụ: this->xthis->y được giữ không đổi).

5

Mã của bạn sẽ trông như thế:

class Bag { 
public: 
    Bag(); 
    Bag(Bag const& other); // copy ctor, declared implicitly if you don't declare it 
    ~Bag(); 

    Bag operator+(Bag const& other) const; 

private: 
    int x; 
    int y; 
}; 

Bag Bag::operator+(Bag const& other) const { 
    Bag result (*this); 
    result.x += other.x;   
    result.y += other.y; 
    return result; 
} 

Các tiềm ẩn "đối tượng hiện tại" cho các chức năng thành viên được trỏ đến bởi một giá trị đặc biệt có tên này.Sau đó, *this nhận đối tượng đó (theo dereferencing này) và được sử dụng để xây dựng (thông qua trình tạo bản sao) một Túi có tên kết quả.

tôi nghi ngờ mã này được lấy từ một bài tập về nhà, vì vậy bạn có thể không có thể sử dụng mô hình one true addition operator, nhưng người ta thường và bạn cần phải nhận thức nó:

struct Bag { 
    //... 
    Bag& operator+=(Bag const& other) { 
    x += other.x; 
    y += other.y; 
    return *this; // return a reference to the "current object" 
    // as almost all operator=, operator+=, etc. should do 
    } 
}; 

Bag operator+(Bag a, Bag const& b) { 
    // notice a is passed by value, so it's a copy 
    a += b; 
    return a; 
} 
+1

Đó là cách viết nguy hiểm op +() - tham số đầu tiên sẽ được cắt và nếu có ý định có bất kỳ hành vi đa hình nào trong hàm dựa trên nó, thì sẽ không có. Tốt hơn hết là thực hiện cả hai tham số const tham chiếu và tạo bản sao trong hàm. –

+0

@Neil: Sao chép trong hàm cũng cắt; tốt hơn là sử dụng mẫu này cho đến khi bạn cần thay đổi nó. Xem thêm http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/ để khuyến khích cùng một thành ngữ cho toán tử =. –

2

Bag result(*this); là tuyên bố một biến result và gọi phương thức sao chép sao chép của nó.

Bạn có thể tưởng tượng C++ tự động khai báo hàm tạo bản sao mặc định cho tất cả các lớp. Công việc của nó chỉ đơn giản là để khởi tạo một đối tượng sử dụng một đối tượng khác:

Bag::Bag(Bag const& src) { 
    x = src.x; 
    y = src.y; 
}

Khái niệm *this có thể nhìn một chút đáng lo ngại, nhưng chỉ là kinh dị thông thường của C++ khi bạn đối phó với & tham số.