SLIDE1

Thursday, June 18, 2015

[oop c++] Thành viên tĩnh – static member

Trong C, static xuất hiện trước dữ liệu được khai báo trong một hàm nào đó thì giá trị của dữ liệu đó vẫn được lưu lại như một biến toàn cục.
Trong C++, nếu static xuất hiện trước một dữ liệu hoặc một phương thức của lớp thì giá trị của nó vẫn được lưu lại và có ý nghĩa cho đối tượng khác của cùng lớp này.
Các thành viên static có thể là public, private hoặc protected.

Đối với class, static dùng để khai báo thành viên dữ liệu dùng chung cho mọi thể hiện của lớp:

Một bản duy nhất tồn tại trong suốt quá trình chạy của chương trình.
Dùng chung cho tất cả các thể hiện của lớp.
Bất kể lớp đó có bao nhiêu thể hiện.

Ví dụ
class Rectangle
{
    private:
       int width;
       int length;
       static int count;
    public:
       void set(int w, int l);
       int area();
}

Ví dụ
Đếm số đối tượng MyClass:
class MyClass{
    public:
        MyClass();
        ~MyClass();
        void printCount();
    private:
        static int count;
};

int MyClass::count = 0;
MyClass::MyClass(){
    this -> count++;
}
MyClass::~MyClass(){
    this -> count--;
}
void MyClass::printCount(){
    cout << “There are currently ” << this  count << “ instance(s) of MyClass.\n”;
}
void main()
{
    MyClass* x = new MyClass;
    x -> printCount();
    MyClass* y = new MyClass;
     x -> printCount();
     y -> printCount();
    delete x;
     y -> printCount();
}


Phương thức static?

Đối với các phương thức static, ngoài ý nghĩa tương tự với dữ liệu, còn có sự khác biệt cơ bản đó là việc cho phép truy cập đến các phương thức static khi chưa khai báo đối tượng (thông qua tên lớp)
Các thành viên lớp tĩnh public có thể được truy cập thông qua bất kỳ đối tượng nào của lớp đó, hoặc chúng có thể được truy cập thông qua tên lớp sử dụng toán tử định phạm vi.
Các thành viên lớp tĩnh private và protected phải được truy cập thông qua các hàm thành viên public của lớp hoặc thông qua các friend của lớp.
Các thành viên lớp tĩnh tồn tại ngay cả khi đối tượng của lớp đó không tồn tại.
Để truy cập một thành viên lớp tĩnh public khi các đối tượng của lớp không tồn tại, đơn giản thêm vào đầu tên lớp và toán tử định phạm vi cho thành viên dữ liệu.
Để truy cập một thành viên lớp tĩnh private hoặc protected khi các đối tượng của lớp không tồn tại, một hàm thành viên public phải được cung cấp và hàm phải được gọi bởi thêm vào đầu tên của nó với tên lớp và toán tử định phạm vi.