0

Khai báo, định nghĩa và khởi tạo

Một phần của tài liệu TEMPLATE VÀ HƯỚNG ĐỐI TƯỢNG (Trang 28-28 )

Biến tĩnh được khai báo trong một lớp. Phần định nghĩa biến tĩnh lại ở bên ngoài lớp. Do đó cần sử dụng toán tử phạm vi đi kèm với biến tĩnh.

Tất cả các biến tĩnh đều được khởi tạo bằng giá trị zero theo mặc định. Mặc khác có thể khởi tạo bằng giá trị khác.

Ví dụ 4.1

// A static member variable example. #include <iostream.h>

class myclass {

static int i;

public:

int geti() { return i; } };

// Definition of myclass::i. i is still private to myclass.

int myclass::i ;

int main() {

myclass o1, o2; o1.seti(10);

cout << "o1.i: " << o1.geti() << '\n'; // displays 10 cout << "o2.i: " << o2.geti() << '\n'; // also displays 10 return 0;

}

@ Về mặt kỹ thuật, khai báo một lớp chỉ là một sự thông báo. Vì biến tĩnh hàm ý rằng bộ nhớ được dành cho biến đó, phần định nghĩa biến cần thiết để cất lên vùng được cấp.

• Biến tĩnh có thể được truy cập một cách độc lập với đối tượng bởi vì nó có trước các đối tượng.

Ví dụ 4.2

// Use a static member variable independent of any object. #include <iostream.h>

class myclass { public:

static int i;

void seti(int n) { i = n; } int geti() { return i; } };

int main() {

myclass o1, o2; // set i directly

myclass::i = 100; // no object is referenced. cout << "o1.i: " << o1.geti() << '\n'; // displays 100 cout << "o2.i: " << o2.geti() << '\n'; // also displays 100 return 0;

}

@ Biến tĩnh i được gán gía trị 100 mà không cần tham khảo đến một đối tượng cụ thể nào.

Cách sử dụng thông thường của biến tĩnh là định vị truy cập đến một tài nguyên dùng chung như file, máy in hay server. Việc định vị này đòi hỏi một số phương tiện để sắp hàng các biến cố.

Ví dụ 4.3 Chương trình sẽ tạo ra một lớp output, dùng một biến tĩnh kiểu mảng ký tự làm vùng đệm xuất với tên là outbuf. Vùng đệm này được dùng để nhận các kết xuất sinh ra bởi hàm thành phần putbuf(). Hàm putbuf() gởi từng ký tự của nội dung biến chuổi str, cụ thể là nó đòi quyền truy cập đến vùng đệm rồi gởi tất cả các ký tự của chuổi str. Trong suốt thời gian kết xuất, hàm putbuf() khoá không cho các đối tượng khác truy cập đến vùng đệm.

// A shared resource example. #include <iostream.h>

#include <string.h> class output {

static char outbuf[255]; // this is the shared resource

static int inuse; // buffer available if 0; in use otherwise

static int oindex; // index of outbuf char str[80];

int who; // identifies the object, must be > 0 public:

output(int w, char *s) { strcpy(str, s); i = 0; who = w; } /* This function returns -1 if waiting for buffer,

it returns 0 if it is done outputting, and

it returns who if it is still using the buffer. */

int putbuf() // from str[] to outbuf[] {

if(!str[i]) { // done outputting inuse = 0; // release buffer return 0; // signal termination }

if(!inuse) inuse = who; // get buffer

if(inuse != who) return -1; // in use by someone else if(str[i]) { // still chars to output outbuf[oindex] = str[i];

i++; oindex++;

outbuf[oindex] = '\0'; // always keep null-terminated return 1;

}

return 0; }

void show() { cout << outbuf << '\n'; } };

char output::outbuf[255]; // this is the shared resource

int output::inuse = 0; // buffer available if 0; in use otherwise

int output::oindex = 0; // index of outbuf int main()

output o1(1, "This is a test"), o2(2, " of statics");

while(o1.putbuf() | o2.putbuf()) ; // output chars o1.show();

return 0; }

Kết quả chương trình ?

Bài tập IV

1. Viết lại chương trình trong ví dụ 4.3 chương 10, để có thể trình bày tên của đối tượng đang truy cập đến vùng đệm và tên các đối tượng đang bị cấm truy cập vùng đệm.

2. Biến tĩnh được ứng dụng để theo dõi số lượng các đối tượng của một lớp tồn tại ở một thời điểm bất kỳ. Bằng cách sẽ tăng trị số đếm của một biến tĩnh mỗi lúc hàm tạo của lớp được gọi, và làm giảm trị số đếm mỗi khi hàm hủy của lớp được gọi. Viết chương trình tạo một lớp test có biến tĩnh count là biến riêng, một hàm tạo, hàm hủy và hàm getcount() trả về gía trị của count. Chương trình có sử dụng 3 đối tượng và một con trỏ đối tượng p.

Một phần của tài liệu TEMPLATE VÀ HƯỚNG ĐỐI TƯỢNG (Trang 28 -28 )