2011-10-13 4 views
8

tôi thấy một ví dụ về việc thực hiện trước increment và sau tăng, trong đó khẳng định rằng quá tải trước increment có thể được định nghĩa làquá tải trước increment và sau increment

T& T ::operator++() 

và quá tải sau increment có thể được xác định và thực hiện về trước incremet như sau

const T T::operator++(int){ 
    const T old(*this); 
    ++(*this); 
    return old; 
} 

tôi có hai câu hỏi:

1) những gì “cũ” nghĩa là gì?

2) ++ (* this) được giả định sử dụng tiền tố gia tăng và định nghĩa tiền gia tăng ban đầu không có đối số. Tuy nhiên, nó có * cái này ở đây.

+3

'old'' == ''!new' – Mehrdad

Trả lời

2

"cũ" nghĩa là gì?

Phương pháp này là tăng gia số bài đăng. Giá trị hiện tại ("giá trị cũ") được trả về và sau đó giá trị được tăng lên ("giá trị mới").

++ (* this) được giả định sử dụng tiền gia tăng và định nghĩa tiền gia tăng ban đầu không có đối số. Tuy nhiên, nó có * cái này ở đây.

*this không phải là đối số. Các dấu ngoặc đơn không cần thiết, chúng có thể đọc được.
Tương đương với ++*this.

+0

Bạn có nghĩa là 'old' là giá trị gia tăng * trước *; vì nó là giá trị của đối tượng trước khi tăng thêm – Praetorian

+0

@Praetorian: Đọc từ đầu tiên "It's" là "Toán tử là". Đề xuất viết lại. –

1

old đơn giản chỉ là tên biến (không phải là từ khóa, nếu đó là những gì bạn đang thắc mắc). Nó được sử dụng để lưu giá trị trước đó của toán hạng.

2

1) "cũ" là giá trị "giá trị này" có trước khi được tăng lên. Post-increment được cho là trả về giá trị đó.

2) ++ (* this) là tương đương với this-> operator ++()

2

2) ++ (* this) được giả định sử dụng pre-increment, và bản gốc trước định nghĩa gia tăng không có đối số. Tuy nhiên, nó có * này tại đây.

++ là một toán tử đơn nhất, vì vậy nó có một đối số không sao. Bất cứ khi nào bạn quá tải một toán tử như một hàm thành viên, đối số đầu tiên là đối tượng hiện tại.

Thông số int không sử dụng là một hack để phân biệt giữa trước và sau tăng, bởi vì operator++ có thể có nghĩa là một trong hai. Post-increment không thực sự chấp nhận một số nguyên *, nó chỉ là một cấu trúc ngôn ngữ (khó xử).

Bạn cũng có thể quá tải các nhà khai thác như các chức năng miễn phí:

struct T 
{ 
    int n; 
}; 

T& operator++(T& t) { ++t.n; return t; } 
T operator++(T& t, int) { T old(t); ++t; return old; } 

int main() 
{ 
    T a; 
    T b = a++; 
    ++b; 
} 

* dưới sử dụng bình thường. Khi bạn gọi toán tử bằng cú pháp gọi hàm, bạn có thể chuyển thêm một int để phân biệt giữa hai số này:

operator++(a); //calls-preincrement 
operator++(b, 1); //calls post-increment