Wednesday, March 2, 2016

Thành viên Static của lớp trong C++

Trong phần này., thay vì nói riêng cho mỗi biến kiểu static. tôi xin phép trích cách giải thích và cho toàn bộ các kiểu biến hay dùng trong lập trình C/C++

ta lam quen tới khái niệm "lớp lưu trữ".

Cú pháp khai báo hàm:
 <Lớp lưu trữ> <Kiểu trả về> <Tên hàm>(<Kiểu tham số 1><tên tham số 1>, Kiểu tham số 2><tên tham số 2>,... );

Trong C/C++ có 4 lớp lưu trữ:
 

- Auto
- Extern(al)
- Static
- Register
1. Auto
Biến tự động thật ra là biến mà chúng ta hay dùng.
Khi ta viết: 
int a; nó hiểu auto int a;
-> Tính chất nó thế nào thì ai cũng rõ rùi, hi hi, mình hem cần nói nhiều nữa 
2. Extern
Extern là cú pháp, tên đầy đủ của nó là External hay còn gọi là biến ngoại.
Trong C/C++, một chương trình lớn có thể được chia thành các module nhỏ hơn, các module này có thể được biên dịch riêng lẻ và được liên kết lại với nhau. Điều này thực hiện nhằm tăng tốc độ biên dịch các chương trình lớn. Tuy nhiên, khi các module được lên kết , các tập tin phải được chương trình thông báo các biến toàn cục được yêu cầu. Một biến toàn cục chỉ có thể được khai báo 1 lần. Nếu vi phạm, sẽ thông báo lỗi "Duplicate variable name" (Trùng tên biến). Nếu trong các tập tin liên kết nhau có biến trùng thì nó sẽ thông báo lỗi "Duplicate lable" (Nhãn trùng nhau).
=> Người ta sẽ sử dụng lớp lưu trữ extern để giải quyết vấn đề này:
vd:
- file 1:

Code:
int i, j;
char a;
main()
{
....
}
file 2
Code:
extern int i, j;
extern char a;
void abc()
{
....
}
file 2 có các biến toàn cục giống file 1, ngoại trừ một điểm là các biến này có từ khóa extern được them vào sự khai báo của chúng. Từ khóa này nói với trình biên dịch là tên và kiểu của biến toàn cục được sử dụng mà không phải tạo lại sự lưu trữ cho chúng. Khi 2 module được liên kết, các tham chiếu đến các biến ngoại được giải quyết.

Chú ý điểm này: Nếu một biến không được khai báo trong một hàm nào đó, trình biên dịch sẽ so nó với bất kỳ biến toàn cục nào trong tất cả các file. Nếu khớp với biến toàn cục nào, trình biên dịch sẽ xem như 1 biến toàn cục đang được tham chiếu đến. 
3. Static
Các biến static hay còn gọi là các biến tĩnh là các biến cố định bên trong các hàm hoặc tập tin. Không giống như các biến toàn cục, chúng không được biết đến bên ngoài hàm hoặc tập tin của chúng, nhưng điểm hay ở chỗ, chúng giữ được giá trị giữa các lần gọi. Hay nói cách khác, nếu một hàm kết thúc và sau đó được gọi lại, các biến tĩnh định nghĩa trong hàm đó vẫn giữ được giá trị. Biến tĩnh có sự ưu tiên cáo hơn các biến ngoại.

VD về biến tĩnh:

TH1: Không sử dụng biến tĩnh

Code:
#include<iostream.h>
#include<conio.h>
#include<stdio.h>

void HAM();

main()
{
    HAM();
    HAM();
    HAM();
    getch();
}

void HAM()
{
    char a =  65;
    cout<<a++<<"\n";
}
Kết quả:
A
A
A

TH2: Sử dụng biến tĩnh

Code:
#include<iostream.h>
#include<conio.h>
#include<stdio.h>

void HAM();

main()
{
    HAM();
    HAM();
    HAM();
    getch();
}

void HAM()
{
    static char a =  65;
    cout<<a++<<"\n";
}
Kết quả:
A
B
C
4. Register
Phần này mình ko nhớ rõ lắm vì ít dùng. Tạm hiểu, khi ta khai báo nó với lớp lưu trữ là register thì chương trình sẽ kiểm tra xem các thanh ghi trên CPU còn thừa tài nguyên ko, nếu thừa thì nó sẽ lưu giá trị của biến vào thanh ghi mà không lưu vào RAM, tốc độ sẽ nhanh hơn rất nhiều. Nếu chương trình kiểm tra thấy tài nguyên thanh ghi không đủ thì chương trình sẽ hiểu biến này là biến Auto.

0 comments :

Post a Comment