2011-08-30 27 views
8

tôi có mã như thế này ...Tại sao chúng ta cần đặt const ở cuối đầu của hàm nhưng tĩnh lúc đầu?

class Time 
{ 
    public: 
     Time(int, int, int); 
     void set_hours(int); 
     void set_minutes(int); 
     void set_seconds(int); 

     int get_hours() const; 
     int get_minutes() const; 
     int get_seconds() const; 

     static void fun() ; 

     void printu() const; 
     void prints(); 

    private: 
     int x; 
     int hours; 
     int minutes; 
     int seconds; 
     const int i; 
}; 

Tại sao tôi cần phải đặt const cuối cùng để thực hiện một hằng số loại chức năng nhưng nếu tôi cần phải thực hiện một chức năng, tôi có thể làm điều này như ...

static void Time::fun() 
{ 
    cout<<"hello"; 
} 

Chức năng trên fun() cũng nằm trong cùng một lớp. Tôi chỉ muốn biết lý do đằng sau điều này là gì?

+1

Tôi biết tại sao 'const' không thể đi trước. Tôi không biết tại sao 'tĩnh' không thể đi vào cuối ... – Beta

Trả lời

10

bằng phương pháp thể hiện const chẳng hạn như int get_hours() const;, const có nghĩa là định nghĩa của int get_hours() const; sẽ không sửa đổi this.

với phương pháp tĩnh như static void fun();, const không áp dụng vì this không khả dụng.

bạn có thể truy cập phương thức tĩnh từ lớp hoặc thể hiện do khả năng hiển thị của lớp. cụ thể hơn, bạn không thể gọi các phương thức mẫu hoặc truy cập các biến mẫu (ví dụ: x, hours) từ phương thức tĩnh vì không có một cá thể nào.

class t_classname { 
public: 
    static void S() { this->x = 1; } // << error. this is not available in static method 
    void s() { this->x = 1; } // << ok 
    void t() const { this->x = 1; } // << error. cannot change state in const method 
    static void U() { t_classname a; a.x = 1; } // << ok to create an instance and use it in a static method 
    void v() const { S(); U(); } // << ok. static method is visible to this and does not mutate this. 

private: 
    int a; 
}; 
+0

** ** này không có sẵn trong các chức năng tĩnh nhưng chúng ta vẫn có thể truy cập vào niềm vui tĩnh bằng cách sử dụng một đối tượng như thế nào? Đã cập nhật – teacher

+0

@teacher – justin

2

Đó là vì rằng nếu bạn đặt const đầu tiên nó sẽ có nghĩa rằng bạn đang trở về một điều const từ chức năng - tức là một ý nghĩa khác nhau mà các chức năng là const

+1

tại sao chúng ta không thể đặt tĩnh ở cuối? bất kỳ ý tưởng? – teacher

+0

Đó chỉ là cú pháp. – Marlon

4

Khi bạn đặt const ngay từ đầu, bạn đang áp dụng nó cho kiểu trả về. Điều này không quan trọng nếu bạn đang trả về loại nếu void, nhưng cho phép nói rằng bạn đang trở về char* mà không phải là const. Nếu bạn đặt const ngay từ đầu, bạn muốn kết thúc với

static const char* MyFunction() { ... } 

Điều đó nói với tôi rằng kiểu trả về là một const char*, không phải là một chức năng const mà trả về một char*.

Đặt nó ở cuối tránh vấn đề này.

9

const cuối cùng có nghĩa là hàm không đổi, vì vậy nó không thay đổi trạng thái của đối tượng.

Khi bạn đặt const cuối cùng, bạn không thể thay đổi trạng thái của các thành viên của đối tượng.

Khai báo hàm static có nghĩa là nó không thuộc về đối tượng, nó thuộc về loại lớp.

Đưa const vào đầu có nghĩa là giá trị kiểu trả về là hằng số.

+0

Đưa tĩnh vào cuối phương tiện? – ProgramCpp

+0

@ProgramCpp Có nghĩa là nó sẽ không biên dịch. –

0

One và khác được giải thích thêm một chút chi tiết here. Đặt const sau khi khai báo hàm làm cho hằng số hàm, có nghĩa là nó không thể thay đổi bất cứ điều gì trong đối tượng chứa hàm.

0

Đó là vấn đề ngữ pháp hoàn toàn. constcv-qualifier và khi được áp dụng cho hàm thành viên, phải được đặt sau khai báo tham số.Bạn đã cố gắng đặt nó trước tên hàm nó chỉ có thể được hiểu là đủ điều kiện kiểu trả về của hàm. Mặt khác,

static là bộ định danh lớp lưu trữ và phải xuất hiện trước người kê khai mà nó áp dụng.

Các quy tắc này chỉ xuất phát từ cách ngữ pháp C++ được xác định.

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