May 2, 2012

Static: biến, hàm, các vấn đề xung quanh

Định nghĩa:

Trong khoa học máy tính, biến tĩnh (static variable) là biến được cấp phát tĩnh có thời gian sống (lifetime) xuyên suốt quá trình chạy chương trình. Các biến này chỉ được khởi tạo một lần, sau đó sẽ không mất đi.

Ví dụ:

#include <iostream>
void func() {
    static int a = 0;
    ++a;
    std::cout<< "A  = " << a << std::endl;
}
int main(int argc, char** argv) {
    func();
    func();
    func();
    //a = 7; // error.
    return 0;
}

Một điều lưu ý, tuy biến static có thời gian sống suốt cả chương trình, nhưng tầm nhìn (visibility)chỉ trong hàm, tức là chỉ có thể tính toán biến đó trong hàm.


static là một từ khóa trong C/C++ liên quan đến khái niệm lớp lưu trữ (storage class). Trong lớp lưu trữ còn có các đối từ khóa khác đó là : auto, register, extern.


Với chức năng liên quan đến khái niệm lớp lưu trữ, static còn có một số công dụng sau:



  • Static local variables: Như trên.


  • Static function: Khi có 2 hàm hoàn toàn giống nhau về tên, tham số, giá trị trả về, thì chương trình sẽ thực thi hàm chứa từ khóa static trong file đó.

Nói có vẻ khó hiểu như nếu code ví dụ thì sẽ rất rõ ràng:


ví dụ có hàm func1() trong cả 2 file.


file1.h và func1.cpp:



#ifndef _FUNC1_H
#define _FUNC1_H
void func1();
#endif


#include <iostream>
void func1() {
    std::cout << "Hello" << std::endl; 
}

Và func2.cpp



#include <iostream>
#include "func1.h"
//void func1() {
static void func1() {
    std::cout << "Goodbye" << std::endl;
}
int main(int argc, char** argv) {
    func1();
    return 0;
}

Output sẽ là "Goodbye".



  • Static in class: Khi khai báo static một thuộc tính hay phương thức của 1 class. Ta có thể sử dụng ngay mà không cần khai báo đối tượng.

Ví dụ:



#include <iostream>
class NUM {
public:
    static int a;
    int b;
    static void func() {
        std::cout<< "Hi!!" << std::endl;
    }
    void func1() {
        std::cout<< "Aloha!!" << std::endl;
    }
};
int NUM::a = 9;
int main(int argc, char** argv) {
    //NUM::b = 10; 
    //int NUM::a = 9;
    NUM::func();
    //NUM::func1();
    return 0;
}

 


Nguồn tham khảo:



  1. http://en.wikipedia.org/wiki/Static_variable .


  1. Cộng đồng C việt.

  2. Learncpp.com

  3. cprogramming.com