2010-10-15 67 views
5

tôi có một chương trình và nhiều người trong lớp mình có một số nhà khai thác và các phương pháp với const từ khóa như sau:const và không có phương pháp const trong c + +?

operator const char*() const; 
operator char*(); 
void Save(const char *name) const; 
void Load(const char *name); 

Đầu tiên: những gì có nghĩa là const ở phần cuối của tờ khai phương pháp ?, là nó trở thành giống như đặt nó ngay từ đầu?

Thứ hai: Tại sao phiên bản const và không có phiên bản const của toán tử() cần thiết?

Xin cảm ơn trước.

Trả lời

2

'const' ở cuối cho trình biên dịch biết rằng phương pháp này không thay đổi bất kỳ biến thành viên nào - an toàn để gọi phương thức này trên các cá thể const. Vì vậy, Save có thể được gọi trên một cá thể const, vì nó sẽ không thay đổi cá thể đó. Tải mặt khác, sẽ thay đổi cá thể sao cho không thể được sử dụng trên các cá thể const.

Phiên bản const của toán tử() trả về một con trỏ const, đảm bảo bộ đệm được truyền lại sẽ không thay đổi. Có lẽ đó là một con trỏ vào một biến cá thể của lớp. Đối với các cá thể không phải const, toán tử khác() trả về một con trỏ không phải là const. Nó sẽ phải là một con trỏ đến một số bộ nhớ mà ngay cả khi được ghi vào, sẽ không thay đổi nội dung của cá thể.

Ngoài ra, hãy tìm kiếm từ khóa 'có thể thay đổi' đôi khi. Hiểu được điều đó sẽ giúp bạn hiểu ý tưởng này về tính chính xác của const.

2

Chức năng thành viên constness. Nó có nghĩa là chức năng không thể (*) sửa đổi bất kỳ biến thành viên nào của bạn. Nó giống như đặt một const ở phía trước của tất cả các biến thành viên của bạn cho một cuộc gọi chức năng này. Đó là một đảm bảo tốt cho các khách hàng của lớp học của bạn và cũng có thể hỗ trợ trong tối ưu hóa trình biên dịch.

(*) - cũng xem từ khóa có thể thay đổi.

8

Đầu tiên: có nghĩa là gì ở cuối khai báo phương pháp ?, có giống như đặt nó ở đầu không?

No. A const ở cuối có nghĩa là phương pháp có thể được gọi trên các đối tượng được khai báo const. A const lúc đầu có nghĩa là giá trị trả về là const.

Thứ hai: Tại sao phiên bản const và không có phiên bản const của toán tử() cần thiết?

Phiên bản không const trả về char* không phải là const. Bằng cách sửa đổi điều này char* bạn có thể sau đó trong thực tế sửa đổi đối tượng (giả sử char* là một thành viên của đối tượng).

Vì điều này không được phép đối với các đối tượng const, có quá tải operator() đối với các đối tượng const, sao cho trả lại const char* để không thể sửa đổi đối tượng.

+1

Ok, tôi lấy lại câu trả lời của tôi, máy của bạn rõ ràng hơn nhiều. –

1

Đặt const vào cuối khai báo phương pháp là nói rằng chính đối tượng đó hoặc this, là const thay vì loại trả về.

C++ cho phép các phương thức bị quá tải trên const vì các lý do phức tạp. Không đủ không gian để đi vào chi tiết ở đây. Nhưng đây là một vài cái ngắn.

  • Thỉnh thoảng có giá trị hoặc nhu cầu căn hộ, khi phương thức hoạt động khác khi được gọi từ loại const. Ví dụ về phía trước thẳng nhất là khi bạn muốn trả lại giá trị const từ phương thức const và giá trị không const từ phương thức thông thường.
  • Có hay không thisconst thay đổi đáng kể ràng buộc của phương thức nội bộ. Đến mức nó về cơ bản sẽ trở thành hai cơ quan phương pháp khác nhau. Do đó nó có ý nghĩa để chia nó thành 2 phương pháp khác nhau.
0
  1. Const ở đầu áp dụng cho giá trị trả về. Const ở cuối áp dụng cho chính phương thức đó. Khi bạn khai báo một phương thức là "const", bạn đang nói rằng bạn không có ý định sửa đổi bất kỳ biến thành viên nào của lớp trong phương thức. Trình biên dịch thậm chí sẽ thực hiện một số kiểm tra cơ bản để đảm bảo rằng phương thức không sửa đổi các biến thành viên. Const trong giá trị trả về ngăn người gọi sửa đổi giá trị được trả về. Điều này có thể hữu ích khi bạn trả lại con trỏ hoặc tham chiếu đến dữ liệu do lớp quản lý. Điều này thường được thực hiện để tránh trả lại các bản sao dữ liệu phức tạp có thể tốn kém vào thời gian chạy.

  2. Lý do bạn có hai toán tử khác nhau là phiên bản "const" trả về con trỏ const cho dữ liệu có thể là nội bộ của lớp. Nếu cá thể của lớp là const, thì rất có thể bạn muốn dữ liệu được trả về cũng phải là const. Phiên bản "non-const" chỉ cung cấp một phương thức trả về một giá trị trả về có thể sửa đổi khi người gọi có một cá thể không phải là const của lớp đó.

1

Một lưu ý ngoài các câu trả lời khác: không có operator() trong ví dụ của bạn.

operator const char*() const; 
operator char*(); 

là nhà khai thác chuyển đổi, mà có nghĩa là đối tượng của lớp có thể được ngầm chuyển đổi sang chuỗi C-phong cách, giống như

void f(const MyClass& x, MyClass& y) { 
    const char* x_str = x; 
    char* y_str = y; 
} 

Tờ khai và sử dụng operator(), có nghĩa là bạn có thể sử dụng một đối tượng loại kiểu lớp giống như một hàm, trông giống như:

class MyClass { 
public: 
    const char* operator() (int x, int y) const; 
    // ... 
}; 

void g(const MyClass& obj) { 
    const char* result = obj(3, 4); 
} 
1

Nếu bạn đang tìm kiếm nguồn tài nguyên tuyệt vời trên C++ (bao gồm các mẹo sử dụng)chính xác) thử "Hiệu quả C++".

Một trang web hữu ích về vấn đề này: JRiddel.org

Trong C++ khi bạn khai báo một phương pháp const bằng cách đặt nó SAU chữ ký phương pháp bạn đang khẳng định rằng: "Phương pháp này sẽ không thay đổi bất kỳ phi mutable biến dụ trong đối tượng đó đang được gọi. "

const trước giá trị trả về (ví dụ: const in: operator const char*...") đang tuyên bố rằng nó chỉ trả về một con trỏ biến số const char*. (Bạn không thể thay đổi nội dung của char* nhưng bạn có thể gán lại con trỏ.) Nếu bạn đã viết "const char* const ...", nó sẽ là một con trỏ liên tục đến các ký tự không đổi. (Số const xuất hiện sau dấu sao).

Các nhiều phiên bản rất hữu ích để trình biên dịch có thể hiểu được điều này:

const char* my_const_var = <object_name>(); 
char* my_var = <object_name>(); 

Chris

1

Bạn nên tham khảo các "CAO · LIÊM C++ mã hóa tiêu chuẩn HƯỚNG DẪN" cho biết khi nào nó được khuyến khích để sử dụng công cụ sửa đổi const cho các thành viên của lớp học:

Quy tắc CPP chính trực cao 3.1.8: Khai báo 'const' bất kỳ hàm thành viên lớp nào không sửa đổi trạng thái hiển thị bên ngoài của đối tượng. (QACPP 4211, 4214)

biện minh: Mặc dù ngôn ngữ thực thi bit const đúng đắn, const đúng đắn nên được coi là logic, chứ không phải bitwise. Một hàm thành viên sẽ được khai báo const nếu không thể cho một máy khách xác định xem đối tượng có thay đổi như là kết quả của việc gọi hàm đó hay không. Từ khóa 'có thể thay đổi' có thể được sử dụng để khai báo dữ liệu thành viên có thể được sửa đổi trong các hàm const, điều này chỉ nên được sử dụng khi dữ liệu thành viên không ảnh hưởng đến trạng thái hiển thị bên ngoài của đối tượng.

class C 
{ 
public: 
    const C& foo() { return * this; } // should be declared const 
    const int& getData() { return m_i; } // should be declared const 
    int bar() const { return m_mi; }  // ok to declare const 
private: 
int m_i; 
mutable int m_mi; 
}; 

Tham chiếu Hiệu quả C++ Mục 21, Sức mạnh công nghiệp C++ 7.13;

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