2010-08-13 31 views
7

Trong C++ đôi khi tôi thấy tờ khai như dưới đây:const loại vòng loại ngay sau tên hàm

return_type function_name( datatype parameter1, datatype parameter2 ) const 
{ /*................*/} 

gì loại vòng loại const này chính xác làm gì trong trường hợp này?

Trả lời

7

$ 9.3.1/3 states-

"Một hàm thành viên không tĩnh có thể được khai báo const, không ổn định, hoặc const không ổn định. Những cvqualifiers ảnh hưởng đến kiểu của con trỏ này (9.3.2). Họ cũng ảnh hưởng đến Hàm chức năng (8.3.5) của hàm thành viên, hàm thành viên khai báo const là hàm thành viên const, hàm thành viên được khai báo dễ bay hơi là hàm thành viên dễ bay hơi và hàm thành viên khai báo const volatile là hàm thành phần biến đổi const. "

Vì vậy, đây là tóm tắt:

a) Một vòng loại const có thể chỉ được sử dụng cho các chức năng lớp không tĩnh thành viên

b) trình độ cv cho chức năng tham gia vào quá tải

struct X{ 
    int x; 
    void f() const{ 
     cout << typeid(this).name(); 
     // this->x = 2; // error 
    } 
    void f(){ 
     cout << typeid(this).name(); 
     this->x = 2; // ok 
    } 
}; 

int main(){ 
    X x; 
    x.f();   // Calls non const version as const qualification is required 
        // to match parameter to argument for the const version 

    X const xc; 
    xc.f();  // Calls const version as this is an exact match (identity 
        // conversion) 
} 
+0

+ 1 để tham khảo quy phạm! –

13

Vòng loại const ở cuối khai báo hàm thành viên cho biết rằng hàm có thể được gọi trên các đối tượng mà chính chúng là const. Hàm thành viên const hứa hẹn sẽ không thay đổi trạng thái của bất kỳ thành viên dữ liệu không thể thay đổi nào.

chức năng thành viên const cũng có thể, tất nhiên, được gọi trên các đối tượng không phải const (và vẫn thực hiện cùng một lời hứa).

Chức năng thành viên cũng có thể bị quá tải trên const-ness. Ví dụ:

class A { 
    public: 
    A(int val) : mValue(val) {} 

    int value() const { return mValue; } 
    void value(int newVal) { mValue = newVal; } 

    private: 
    int mValue; 
}; 

A obj1(1); 
const A obj2(2); 

obj1.value(3); // okay 
obj2.value(3); // Forbidden--can't call non-const function on const object 
obj1.value(obj2.value()); // Calls non-const on obj1 after calling const on obj2 
3

Điều đó có nghĩa là nó không sửa đổi đối tượng, vì vậy bạn có thể gọi phương thức đó với đối tượng const.

tức

class MyClass { 
public: 
    int ConvertToInteger() const; 

}; 

Có nghĩa là nếu bạn có

const MyClass myClass; 

bạn có thể gọi

int cValue = myClass.ConvertToInteger(); 

mà không có một lỗi biên dịch, bởi vì phương pháp kê khai cho thấy nó không thay đổi dữ liệu của đối tượng.

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