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

Khác biệt giữa int và const int& trong C/C++

Đây là câu hỏi về kiểu tham chiếu hằng (const reference) so với kiểu giá trị (value type).

int (Giá trị)

  • Kiểu dữ liệu nguyên bản (fundamental type)
  • Truyền tham số: Copy giá trị
  • Hàm làm việc trên bản sao, không ảnh hưởng biến gốc
  • Phù hợp cho kiểu nhỏ (int, char, double...)

const int& (Tham chiếu hằng)

  • Tham chiếu (&) đến int với qualifier const
  • Truyền tham số: Không copy, bind trực tiếp đến đối tượng gốc
  • Hàm không thể sửa đổi đối tượng qua tham chiếu này
  • Phù hợp cho kiểu lớn (class, struct) hoặc khi không muốn copy

So sánh chi tiết

Đặc điểmintconst int&
Cơ chế truyềnPass by value (copy)Pass by reference (alias)
Chi phíCopy 4/8 bytesChỉ truyền địa chỉ (thường 8 bytes)
Sửa đổi trong hàmẢnh hưởng bản saoCẤM (compile error)
Binding với temporaryCopy temporaryKéo dài lifetime của temporary
Binding với literalOKOK (tạo temporary)
Binding với biểu thứcOK (tính giá trị)OK (tạo temporary)

Ví dụ: Binding với temporary


void func_val(int x) { /* ... */ }
void func_ref(const int& x) { /* ... */ }

int main() {
    func_val(10);        // OK: copy giá trị 10
    func_ref(10);        // OK: bind đến temporary int(10)
    
    func_val(5 + 3);     // OK: tính 8, copy
    func_ref(5 + 3);     // OK: tạo temporary 8, bind
    
    double d = 3.14;
    func_val(d);         // OK: ép kiểu double->int, copy
    func_ref(d);         // LỖI: không bind double& vào const int&
    // Cần: func_ref(static_cast<int>(d));
}

const int& vs int const&

Hai cách viết tương đương nhau (cách đọc từ phải sang trái):

  • const int& = reference to const int
  • int const& = reference to const int

Lưu ý về "const int&" trong tham số hàm


// Tốt cho kiểu lớn
void process(const BigObject& obj);  // Tránh copy

// KHÔNG cần thiết cho kiểu nhỏ (int, double, pointer)
void bad(int x);        // Tốt hơn
void bad2(const int& x); // Thậm chí chậm hơn do dereference

Tóm tắt

  • int: Giá trị, copy, phù hợp kiểu nhỏ
  • const int&: Tham chiếu chỉ đọc, không copy, kéo dài temporary lifetime, phù hợp kiểu lớn
  • const int& == int const&
  • Tránh const int& cho kiểu cơ bản nhỏ (int, char, double, pointer)