C++: Bài 9. Lớp lưu trữ


Đăng ký nhận thông báo về những video mới nhất

Một lớp lưu trữ xác định phạm vi (khả năng hiển thị - visibility) và thời gian tồn tại của các biến và/hoặc hàm trong chương trình C++. Các chỉ định này đứng trước kiểu mà chúng sửa đổi. Dưới đây là các lớp lưu trữ có thể được sử dụng trong Chương trình C++:

  • auto
  • register
  • static
  • extern
  • mutable

Lớp lưu trữ auto

Đây là lớp lưu trữ mặc định cho tất cả các biến cục bộ.

{
  int mount;
  auto int month;
}

Ví dụ trên định nghĩa hai biến có cùng lớp lưu trữ là auto và chỉ có thể được sử dụng trong các hàm, tức là các biến cục bộ.

Lớp lưu trữ register

Lớp lưu trữ register được sử dụng để xác định các biến cục bộ cần được lưu trữ trong thanh ghi thay vì RAM. Điều này có nghĩa là biến có kích thước tối đa bằng kích thước thanh ghi (thường là một từ) và không thể áp dụng toán tử '&' cho nó (vì nó không có vị trí bộ nhớ).

{
  register int  miles;
}

Thanh ghi chỉ nên được sử dụng cho các biến yêu cầu truy cập nhanh như bộ đếm. Cũng cần lưu ý rằng việc xác định 'register' không có nghĩa là biến sẽ được lưu trữ trong một thanh ghi. Nó có nghĩa là nó CÓ THỂ được lưu trữ trong một thanh ghi tùy thuộc vào phần cứng và các hạn chế triển khai.

Lớp lưu trữ static

Lớp lưu trữ static hướng dẫn trình biên dịch giữ một biến cục bộ tồn tại trong thời gian tồn tại của chương trình thay vì tạo và phá hủy nó mỗi khi nó xuất hiện và đi ra khỏi phạm vi sử dụng. Do đó, việc làm cho các biến cục bộ trở nên tĩnh cho phép chúng duy trì giá trị giữa các lần gọi hàm.

Bổ từ static cũng có thể được áp dụng cho các biến toàn cục. Khi điều này được thực hiện, nó khiến phạm vi của biến đó bị hạn chế đối với tệp mà nó được khai báo.

Trong C ++, khi static được sử dụng trên một thành viên dữ liệu của lớp, nó khiến chỉ một bản sao của thành viên đó được chia sẻ bởi tất cả các đối tượng của lớp nó.

#include <iostream>
using namespace std;

// khai báo hàm
void func(void);

static int count = 10; /* biến toàn cc */

main() {
  while(count--) {
    func();
  }

  return 0;
}

// đnh nghĩa hàm
void func( void ) {
  static int i = 5; // biến static cc b  i++;
  std::cout << "i = " << i ;
  std::cout << ", count = " << count << std::endl;
}

Kết quả:

i = 7, count = 8
i = 8, count = 7
i = 9, count = 6
i = 10, count = 5
i = 11, count = 4
i = 12, count = 3
i = 13, count = 2
i = 14, count = 1
i = 15, count = 0

Lớp lưu trữ extern

Lớp lưu trữ extern được sử dụng để cung cấp một tham chiếu của một biến toàn cục hiển thị cho TẤT CẢ các tệp chương trình. Khi bạn sử dụng 'extern', biến không thể được khởi tạo vì tất cả những gì nó làm là trỏ tên biến vào vị trí lưu trữ đã được xác định trước đó.

Khi bạn có nhiều tệp và bạn xác định một biến hoặc hàm toàn cục, biến này cũng sẽ được sử dụng trong các tệp khác, thì extern sẽ được sử dụng trong tệp khác để cung cấp tham chiếu của biến hoặc hàm đã xác định. Chỉ để hiểu extern được sử dụng để khai báo một biến hoặc hàm toàn cục trong một tệp khác.

Bổ từ extern thường được sử dụng nhất khi có hai hoặc nhiều tệp chia sẻ cùng các biến hoặc hàm toàn cục như được giải thích ở ví dụ dưới.

File 1: main.cpp

#include <iostream>
using namespace std;
int count ;
extern void write_extern();

main() {
  count = 5;
  write_extern();
}

File 2: support.cpp

#include <iostream>
using namespace std;

extern int count;

void write_extern(void) {
  cout << "Count is " << count << endl;
}

Ở đây, từ khóa extern đang được sử dụng để khai báo biến count trong tệp khác. Bây giờ biên dịch hai tệp này như sau:

$g++ main.cpp support.cpp -o write

Điều này sẽ tạo ra chương trình thực thi ghi (write), hãy thử thực hiện ghi và kiểm tra kết quả như sau:

$./write
5

Lớp lưu trữ mutable

Bộ chỉ định mutable chỉ áp dụng cho các đối tượng lớp, ta sẽ tìm hiểu sau trong phần hướng đối tượng. Nó cho phép một thành phần của một đối tượng ghi đè hàm thành viên const. Nghĩa là, một thành viên mutable có thể được sửa đổi bởi một hàm thành viên const.


Nếu bạn có điều thắc mắc, bạn hãy comment cho V1Study để được giải đáp.
Bài viết này được chia sẻ bởi LongDT. Nếu bạn muốn chia sẻ bài viết, bạn hãy Đăng ký làm thành viên!
« Prev
Next »
Copied !!!