2011-03-18 29 views
5

Bản sao có thể xảy ra:
c++ const use in class methods
Meaning of “const” last in a C++ method declaration?tại sao đặt "const" ở cuối?

int operator==(const AAA &rhs) const; 

Đây là một tuyên bố điều hành quá tải. Tại sao đặt const ở cuối? Cảm ơn

+2

thể trùng lặp của [C++ sử dụng const trong phương pháp lớp] (http://stackoverflow.com/questions/5346695/c-const -use-in-class-methods) (và nhiều thứ khác!) – Johnsyweb

Trả lời

6

Từ khóa const biểu thị rằng phương pháp sẽ không thay đổi đối tượng. Vì operator== là để so sánh, không cần phải thay đổi gì. Do đó, nó là const. Nó phải được bỏ qua cho các phương thức như operator= mà DO sửa đổi đối tượng.

Nó cho phép trình biên dịch kiểm tra kỹ công việc của bạn để đảm bảo bạn không làm bất cứ điều gì bạn không được phép làm. Để biết thêm thông tin, hãy xem http://www.parashift.com/c++-faq-lite/const-correctness.html.

+0

một câu hỏi ngu ngốc hơn, "const" trong "()" đã được đảm bảo rằng đối tượng sẽ không được thay đổi. "Const" cuối cùng có trùng lặp không? – user658266

+2

@ user658266 - 'const' ở cuối có một ý nghĩa khác với' const' trong '()'. 'const' ở cuối biểu thị rằng đối tượng mà phương thức được gọi là không được sửa đổi. Trong khi 'const' trong'() 'biểu thị rằng đối số đã nhận không được sửa đổi. – Mahesh

+1

@ user658266: "const" trong "()" đảm bảo rằng đối số được truyền dưới dạng tham số (trong trường hợp này là rhs) cho toán tử quá tải "=" không được sửa đổi."Const" ở cuối hàm chỉ ra rằng hàm không thay đổi bất kỳ thành viên nào của đối tượng mà nó đang được gọi. –

0

"const" ở cuối bất kỳ khai báo C++ nào cho trình biên dịch biết rằng nó sẽ không thay đổi thứ mà nó thuộc về.

+0

specifier trong trường hợp này? – user658266

0

Điều đó đánh dấu chính phương thức đó là không đổi, có nghĩa là trình biên dịch sẽ cho phép bạn sử dụng phương pháp này bất cứ khi nào bạn có tham chiếu const đối với đối tượng có liên quan. Nếu bạn có tham chiếu const, bạn có thể chỉ gọi các phương thức được khai báo là const.

0

Một 'const' ở cuối khai báo phương thức đánh dấu phương thức đó là an toàn để gọi trên một đối tượng cố định.

2

Tạo phương thức const sẽ cho phép đối tượng contant của lớp gọi nó. vì phương thức này không thể thay đổi bất kỳ thành viên nào của đối tượng (lỗi trình biên dịch).

Có thể đáng lưu ý rằng const là một phần của chữ ký của phương thức, vì vậy trong cùng một lớp, bạn có thể có hai phương pháp của cùng một mẫu thử nghiệm nhưng một là const và cột kia thì không. Trong trường hợp này, nếu bạn gọi phương thức quá tải từ một đối tượng biến thì phương thức non-const được gọi, và nếu bạn gọi nó từ một đối tượng không đổi thì phương thức const được gọi.

Tuy nhiên, nếu bạn chỉ có phương thức const (không có quá tải không const), thì nó được gọi từ cả đối tượng biến và đối tượng không đổi.

Ví dụ:

#include <iostream> 

using std::cout; 

class Foo 
{ 
public: 
    bool Happy; 
    Foo(): Happy(false) 
    { 
     // nothing 
    } 
    void Method() const 
    { 
     // nothing 
    } 
    void Method() 
    { 
     Happy = true; 
    } 
}; 

int main() 
{ 
    Foo A; 
    const Foo B; 
    A.Method(); 
    cout << A.Happy << '\n'; 
    B.Method(); 
    cout << B.Happy << '\n'; 
    return 0; 
} 

Will đầu ra:

1 
0 
Press any key to continue . . . 
Các vấn đề liên quan