2013-07-24 20 views
6

Tôi rất quen thuộc với các khai báo hàm tiêu chuẩn C/C++. Tôi vừa mới nhìn thấy một cái gì đó như thế này:Cú pháp/hàm mẫu C++ - kiểu dữ liệu sau dấu ngoặc đơn

int myfunction(char parameter) const 

Ở trên chỉ là một ví dụ giả định và tôi thậm chí không biết nếu nó có ý nghĩa. Tôi đang đề cập đến phần SAU thông số. Const. Cái gì thế này?

Một ví dụ thực tế hơn:

wxGridCellCoordsArray GetSelectedCells() const 

này có thể được tìm thấy here Vì vậy, những gì chính xác là văn bản const làm vào cuối dòng?

+0

http : //stackoverflow.com/questions/15999123/const-before-parameter-vs-const-after-function-name-c – chris

+0

hoặc [this] (http://stackoverflow.com/questions/3141087/what-is- có nghĩa là-với-const-at-end-of-chức năng khai báo) – aaronman

+0

@chris Thật tuyệt. Nhưng bây giờ tôi đang bối rối. Hàm 'GetSelectedCells' có NO paramater để thay đổi? – itsols

Trả lời

4

Từ khóa const, khi được hiển thị sau một hàm, đảm bảo người gọi hàm không có biến dữ liệu thành viên nào bị thay đổi.

Ví dụ cho lớp này,

// In header 
class Node { 

public: 

Node(); 

void changeValue() const; 

~Node(); 

private: 

int value; 

}; 

// trong cpp

void Node::changeValue() const { 
    this->value = 3; // This will error out because it is modifying member variables 
} 

Có một ngoại lệ cho quy tắc này. Nếu bạn khai báo rằng một biến dữ liệu thành viên có thể thay đổi, thì nó có thể được thay đổi bất kể nếu hàm được khai báo là const. Sử dụng có thể thay đổi được cho tình huống hiếm hoi khi một đối tượng được khai báo không đổi, nhưng trong thực tế có các biến dữ liệu thành viên cần tùy chọn để thay đổi. Một ví dụ tiềm năng về việc sử dụng nó là lưu vào bộ nhớ đệm một giá trị mà bạn có thể không muốn lặp lại phép tính ban đầu. Điều này thường hiếm gặp ... Nhưng tốt hơn là hãy nhận biết về nó.

Ví dụ cho lớp này,

// In header 
class Node { 

public: 

Node(); 

void changeValue() const; 

~Node(); 

private: 

mutable int value; 

}; 

// trong cpp

void Node::changeValue() const { 
    this->value = 3; // This will not error out because value is mutable 
} 
+0

Các hiệu ứng phụ bao gồm đầu ra, vì vậy điều đó không hoàn toàn đúng. – chris

+0

@chris: Bạn nói đúng. Đã thay đổi bài đăng gốc –

+0

Thật tuyệt vời! Hiểu rồi. Cảm ơn :) – itsols

7

const cho biết chức năng sẽ không thay đổi bất kỳ thành viên dữ liệu nào của this trừ khi chúng được đánh dấu là có thể thay đổi.
Chỉ một hàm thành viên có thể được đánh dấu const, điều này có nghĩa là không có thành viên nào được thay đổi bên trong hàm.

+0

/** ** này? cái nào – itsols

+0

luôn là hàm thành viên được đánh dấu const – aaronman

4

Đó là một "chương trình phòng thủ" kỹ thuật để giúp bảo vệ chống lại các lỗi lập trình của riêng bạn. Với const đối với tham số hàm, bạn đang nói rằng hàm không nên sửa đổi tham số đó và thêm const làm cho trình biên dịch ngăn bạn vô tình làm như vậy. Tương tự, nếu bạn viết hàm thành viên không nên thay đổi bất kỳ biến số thành viên thành viên nào của lớp, thì bạn có thể khai báo toàn bộ hàm const như vậy và điều đó sẽ ngăn bạn làm như vậy.

Nó cũng giúp làm cho mã của bạn tự ghi lại tài liệu. Thêm const vào tham số cho người dùng biết rằng 'chức năng này không sửa đổi tham số này'. Thêm const vào một hàm thành viên cho người dùng biết rằng 'chức năng này không sửa đổi bất kỳ thành viên nào của lớp' (trừ những thành viên có thể thay đổi rõ ràng).

Hạn chế quyền truy cập vào nội dung nào đó ngoại trừ những trường hợp bạn thực sự cần nó thường được coi là một điều tốt. Đó là lý do chính xác tại sao bạn không thường xuyên đăng nhập vào hệ thống của riêng bạn như là người chủ, mặc dù bạn có thể, và bạn sẽ có nhiều quyền lực hơn nếu bạn đã làm.

+0

Tôi thích điều đó - lập trình 'phòng thủ' và tự ghi lại tài liệu. 1 cho các mẹo – itsols

+0

công việc tốt để thực sự nói tại sao const được sử dụng – aaronman

2

Từ khóa const sau phương thức có nghĩa là tham số ngụ ý this (được đặt thành địa chỉ của đối tượng được sử dụng để gọi phương thức) trỏ đến đối tượng cố định.

Trong C++. một hàm thành viên có thể trông giống như:

class Foo { 
    int x; 
    mutable int y; 
public: 
    void bar()  { 
     Foo *me = this;   // * this is an implicit parameter 
           // that points to the instance used 
           // to call bar() 
     assert(&x == &this->x); // * accesses to class members are 
           // implicitly taken from this 
     x = 1;     // * can modify data members 
    } 
    void bar() const { 
     // Foo *me = this;  // * error, since "bar() const" means 
           // this is a "const Foo *" 
     const Foo *me = this; // * ok 
     // x = 1;    // * error, cannot modify non-mutable 
           // members of a "const Foo" 
     y = 0;     // * ok, since y is mutable 
    } 
}; 

Các analog trong C sẽ là chức năng để truy cập vào một struct Foo *const struct Foo *, tương ứng:

struct Foo { 
    int x; 
    int y; 
}; 

void Foo_bar (Foo *this)  { /* ... */ } /* can modify this->x and this->y */ 
void cFoo_bar (const Foo *this) { /* ... */ } /* cannot modify this->x nor this->y */ 

Không có mutable analog trong C.

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