Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Ý nghĩa const ở cuối khai báo hàm trong C++

Khi const đứng sau danh sách tham số của hàm thành viên (member function), nó đánh dấu hàm là hàm const (const member function) — cam kết không sửa đổi trạng thái đối tượng (non-mutable members).

Cú pháp


class MyClass {
    int value;
public:
    int getValue() const {  // const ở cuối
        // value = 10;  // LỖI: không thể sửa member non-mutable
        return value;
    }
};

Ví dụ: Const member function


#include <iostream>

class MyClass {
    int value;
public:
    MyClass(int v = 0) : value(v) {}
    
    // Const member function
    int getValue() const {
        // value = 10;  // LỖI BIÊN DỊCH: assignment of member in read-only object
        return value;
    }
    
    // Non-const member function
    void setValue(int v) {
        value = v;  // OK
    }
};

int main() {
    const MyClass obj(80);  // Const object
    std::cout << "Gia tri: " << obj.getValue() << std::endl;  // OK
    
    // obj.setValue(100);  // LỖI: không thể gọi non-const trên const object
}

Kết quả

Gia tri: 80

Quy tắc Const Correctness

Loại đối tượngGọi const funcGọi non-const func
Const object✅ OK❌ LỖI
Non-const object✅ OK✅ OK
Const reference/pointer✅ OK❌ LỖI

Ví dụ: Lỗi khi gọi non-const trên const object


class MyClass {
    int value;
public:
    MyClass(int v) : value(v) {}
    int getValue() { return value; }  // THIẾU const!
};

int main() {
    const MyClass obj(80);
    std::cout << obj.getValue();  // LỖI: passing 'const MyClass' as 'this' discards qualifiers
}

Kết quả lỗi

[Error] passing 'const MyClass' as 'this' argument of 'int MyClass::getValue()' discards qualifiers

mutable: Ngoại lệ cho const

Thành viên đánh dấu mutable có thể sửa đổi trong const function:


class Cache {
    mutable int hitCount = 0;  // Có thể sửa trong const func
    int data;
public:
    int getData() const {
        hitCount++;  // OK: mutable
        return data;
    }
};

Const Overloading

Có thể nạp chồng hàm dựa trên const:


class Buffer {
    char* data;
public:
    // Non-const version: cho phép sửa
    char& operator[](size_t i) { return data[i]; }
    
    // Const version: chỉ đọc
    const char& operator[](size_t i) const { return data[i]; }
};

int main() {
    Buffer buf;
    buf[0] = 'A';        // Gọi non-const version
    
    const Buffer cbuf;
    char c = cbuf[0];    // Gọi const version
}

Tóm tắt

  • const sau tham số = const member function
  • Cam kết: Không sửa non-mutable members
  • Cho phép gọi trên const object
  • Khuyến nghị: Mặc định dùng const cho getter, chỉ bỏ khi cần sửa
  • mutable cho cache, mutex, lazy init trong const context