Const trong C++

0
69
Rate this post

{ width=400px }

Trong ngôn ngữ lập trình C++, từ khóa “const” được sử dụng để định nghĩa một hằng số trong chương trình. Tuy nhiên, const không chỉ đơn giản là một từ khóa định nghĩa hằng số mà còn đi kèm với nhiều quy tắc và cách sử dụng khác nhau. Bài viết này sẽ giới thiệu đến bạn những điều cần biết về const trong C++, giúp bạn hiểu rõ hơn về cách sử dụng và ứng dụng của từ khóa này.

1. Định nghĩa

Từ khóa “const” trong C++ được sử dụng để định nghĩa một hằng số trong chương trình. Hằng số được khai báo bằng const sẽ không thay đổi giá trị trong quá trình chạy chương trình. Điều này giúp rất nhiều trong việc sử dụng giá trị mà không cần quan tâm tại một vị trí nào đó sẽ có người thay đổi giá trị của biến.

2. Cách sử dụng

Cú pháp

Trong chương trình, khi cần khai báo một biến với giá trị không đổi trong quá trình chạy chương trình, bạn có thể sử dụng từ khóa “const” như sau:

const type name = value;

Ví dụ:

const int age = 3;

Sử dụng từ khóa const với biến, bạn sẽ không cần quan tâm tới việc thay đổi giá trị của biến. Điều này khiến việc sử dụng giá trị của biến dễ dàng hơn mà không cần phải quan tâm tại một vị trí nào đó sẽ có người thay đổi giá trị của biến.

Sử dụng const với con trỏ

Thông thường khi sử dụng con trỏ trong C++, bạn có thể thay đổi giá trị của đối tượng thông qua con trỏ hoặc thay đổi đối tượng mà nó trỏ đến. Tuy nhiên, trong nhiều trường hợp không cho phép điều này xảy ra. Từ khóa “const” cho phép bạn định nghĩa một con trỏ mà không thể thay đổi giá trị của đối tượng thông qua con trỏ, và một con trỏ cố định (chỉ trỏ tới một đối tượng duy nhất).

Để định nghĩa một con trỏ không thể thay đổi giá trị của đối tượng thông qua con trỏ, bạn có thể sử dụng cú pháp sau:

const type* pa = &a;

Ví dụ:

const int* pa = &a; // (*pa)++; -> error!

Để định nghĩa một con trỏ cố định (chỉ trỏ tới một đối tượng duy nhất), bạn có thể sử dụng cú pháp sau:

type* const pa = &a;

Ví dụ:

int* const pa = &a; // pa = &b; -> error!

Sử dụng const với con trỏ giúp bạn không cần quan tâm tới việc thay đổi giá trị của con trỏ hay đối tượng mà con trỏ sẽ trỏ đến. Điều này rất thuận tiện cho việc code, bảo trì và sửa đổi code trong dự án.

Sử dụng const với hàm

– Const với param của function

Khi bạn muốn truyền tham chiếu đến một hằng const vào một hàm, cần định nghĩa param được truyền vào là const. Ví dụ:

int sum(const int& a, int b){ return a+b; }

Giải thích: khi một biến được khai báo là const, thì giá trị tại địa chỉ được khai báo là một hằng số. Trong khi ở hàm được khai báo là địa chỉ của một đối tượng có thể thay đổi được giá trị. Điều này là không đúng với tham số truyền vào hàm.

Lưu ý:

  • Đối với các biến tham trị trong hàm, không cần khai báo const để truyền biến const vào hàm.
  • Đối với các biến tham chiếu, khi muốn truyền biến const vào hàm, cần khai báo const cho biến đó.

Trong trường hợp cần truyền một const vào một biến tham chiếu của hàm nhưng biến không được khai báo const, có thể sử dụng từ khóa const_cast như sau:

int func(int& a){ return (number += 100); }
int main(){
  const int a = 5;
  int x = func(a); //-> error!
  int y = func(const_cast<int&>(x));
}

Lưu ý: từ khóa const_cast cho phép truyền một biến const vào hàm giống như một biến thông thường và giá trị của const sẽ được thay đổi như biến bình thường. Tuy nhiên, khi kết thúc lời gọi hàm, giá trị của const lại được trả về như cũ. Cần lưu ý đến việc sử dụng giá trị của biến const trong thân hàm.

– Const với giá trị trả về của hàm

Khi khai báo const giá trị trả về của một hàm, hằng số const không có tác dụng vì hàm trả về một giá trị không đổi, trong khi biến chỉ nhận giá trị của hàm. Tương tự việc gán giá trị của một hằng cho một biến.

Ví dụ:

const int a = 8;
int b = 8; //giá trị của b vẫn có thể thay đổi.

Khi cần trả về một giá trị là hằng con trỏ, có thể sử dụng cú pháp sau:

const int* const func();

Lưu ý: trong trường hợp const ở sau dấu *, việc đặt const là vô nghĩa vì con trỏ được trả về sẽ chỉ trỏ tới một địa chỉ duy nhất và giá trị của con trỏ không chủ động được giá trị cấp phát cho con trỏ.

Sử dụng const với class

Khi khai báo một class const, các giá trị của class tại thời điểm khai báo sẽ không bị thay đổi trong quá trình chạy trương trình.

Ví dụ:

class Test{
  private:
    int a;
  public:
    void count(){
      a++;
    }
};

int main{
  const Test* t = new Test();
  t->count(); //-> error!
}

Trong trường hợp muốn tạo class kiểu const, nhưng vẫn muốn một số giá trị có thể thay đổi, có thể sử dụng từ khóa “mutable”. Từ khóa này được sử dụng để định nghĩa một biến mà có thể thay đổi giá trị của biến này ngay cả khi class được khai báo const.

Ví dụ:

class Test{
  private:
    mutable int a;
  public:
    void count(){
      a++;
    }
};

int main{
  const Test* t = new Test();
  t->count();
}

Lưu ý: từ khóa mutable có thể được sử dụng trong class, vì vậy khi khai báo class const, cần kiểm tra xem các biến được khai báo mutable để có thể sử dụng chúng một cách hợp lý.

Sử dụng “const” với hàm trong class: Khi một hàm được khai báo const tại vị trí sau khi định nghĩa hàm, nó có thể được gọi trên bất kỳ loại đối tượng nào. Các hàm không phải const chỉ có thể được gọi bởi các đối tượng không phải const.

Ví dụ:

#include <iostream>
using namespace std;

class Test {
  int value;
  public:
    Test(int v = 0) {value = v;}
    int get1() const {return value;}
    int get2(){ return value;}
};

int main() {
  Test t1(20);
  cout << t1.get1() << endl;
  cout << t1.get2() << endl;
  const Test t2(20);
  cout << t2.get1() << endl;
  cout << t2.get2() << endl; // compile error!
  return 0;
}

Giải thích: class được khai báo const, giá trị của đối tượng của class sẽ không bị thay đổi. Vì thế không thể gọi đến một hàm không phải hàm hàm hằng, vì trong trường hợp này có thể sẽ làm thay đổi giá trị của các đối tượng trong class.

Chú ý:

  • Khi khai báo class const, các biến trong class vẫn được gọi như đối với các class không được khai báo const.
  • Sử dụng từ khóa const để các biến thành viên của class được sử dụng trong hàm không bị thay đổi.

Tổng quát về const:

  • const type (*/&) const name = value;

Đó là những điều cơ bản về const trong C++. Hy vọng rằng thông qua bài viết này, bạn đã hiểu rõ hơn về cách sử dụng và ứng dụng của từ khóa const trong lập trình C++. Để tìm hiểu thêm thông tin chi tiết về const và các khái niệm liên quan khác, hãy truy cập Dnulib.