.10| Phương thức tĩnh

Một phần của tài liệu Tài liệu giảng dạy kỹ thuật lập trình 2 (Trang 68 - 71)

Thơng thường tất cả thuộc tính được khai báo trong lớp sẽ có vùng nhớ riêng cho mỗi đối tượng. Tuy nhiên thỉnh thoảng có những biến mà cần dùng cho tất cả các đối tượng thuộc lớp. Nếu sử dụng biên tồn cục hay hằng số thì vẫn đáp ứng được nhu cầu dùng chung, nhưng nó sẽ khơng thuộc riêng về lớp nào cả, như vậy rất khó kiểm sốt. Để tạo ra những biến (dữ liệu) dùng chung cho tất cả các đối tượng của riêng một lớp thì C++ sử dụng từ khố static trong lớp.

Mỗi đối tượng của lớp Widget tạo ra có riêng vùng nhớ value, nhưng chỉ duy nhất biên quantity là dùng chung cho tất cả các đối tượng của lớp này.

Biến static phải được định nghĩa hoặc khởi gán giá trị biên ngoài khai báo lớp. Với lớp Widget trên, chúng ta phải viết câu lệnh:

Ví dụ:

//serialnumber.cpp #include <iostream> class Widget

{

// All Widget objects share serial_number_source static int serial_number_source;

// Each Widget object is supposed to have its own // unique serial_number

int serial_number; public:

// A Widget object's serial number is initialized from // the shared serial_number_source variable which is // incremented each time a Widget object is created Widget(): serial_number(serial_number_source++) {}

// Client's can look at the serial number but not touch int get_serial_number() const

{

return serial_number; }

};

// Initialize the initial serial number; the first // Widget made will have serial number 1

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 65

int Widget::serial_number_source = 1;

// Make some widgets and check their serial numbers int main()

{

Widget w1, w2, w3, w4;

std::cout << "w1 serial number = " << w1.get_serial_number() << '\n';

std::cout << "w2 serial number = " << w2.get_serial_number() << '\n';

std::cout << "w3 serial number = " << w3.get_serial_number() << '\n';

std::cout << "w4 serial number = " << w4.get_serial_number() << '\n'; } Kết quả: w1 serial number = 1 w2 serial number = 2 w3 serial number = 3 w4 serial number = 4

Lập trình viên C++ thường sử dụng thuộc tính static để cung cấp một biến hằng số công khai cho người dùng.

Cùng xem xét ví dụ về tín hiệu đèn giao thông:

//trafficsignal.h

#ifndef TRAFFICSIGNAL_H_ #define TRAFFICSIGNAL_H_ class TrafficSignal

{

int color; // The light's current color: RED, GREEN, or YELLOW

public:

// Class constants available to clients static const int RED = 0;

static const int GREEN = 1; static const int YELLOW = 2;

TrafficSignal(int initial_color); void change();

int get_color() const; };

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 66

Ví dụ trên sẽ giúp người dùng tiện lợi hơn, thay vì phải nhớ trạng thái là các con số thì chỉ cần nhớ RED, GREEN, YELLOW. Những hằng số này được sử dụng public, cho phép người dùng truy cập nhưng không được phép thay đổi. Với hằng số tĩnh (stactic const) thì có thể khởi gán giá trị trong than của lớp mà không cần định nghĩa lại bên ngồi lớp như biến tĩnh thơng thường khác.

Sau đây là phần định nghĩa các phương thức của lớp TrafficSignal: //trafficsignal.cpp

#include "trafficsignal.h"

// Ensures a traffic light object is in the state of // red, green, or yellow. A rogue integer value makes the

// traffic light red

TrafficSignal::TrafficSignal(int initial_color) { switch (initial_color) { case RED: case GREEN: case YELLOW: color = initial_color; break; default:

color = RED; // Red by default }

}

// Ensures the traffic light's signal sequence void TrafficSignal::change()

{

// Red --> green, green --> yellow, yellow --> red color = (color + 1) % 3;

}

// Returns the light's current color so a client can // act accordingly

int TrafficSignal::get_color() const {

return color; }

Bên trong lớp này có thể sử dụng những tên RED, GREEN và YELLOW. Ben ngồi lớp người dùng cũng có thể truy cập tới nhưng phải sử dụng tên đầy đủ như sau: TrafficSignal::RED.

Tài liệu giảng dạy Kỹ Thuật Lập Trình 2 Trang 67

Chương trình khi thực thi sẽ khởi tạo biến static trước khi gọi hàm main tức trước khi đối tượng được tạo.

C++ cho phép tạo ra các phương thức static. Một phương thức static sẽ thuộc về lớp chứ không thuộc về thể hiện của lớp (instance). Có nghĩa là phương thức tĩnh khơng thể truy cập các thuộc tính khác nếu khơng phải là thuộc tính tĩnh của lớp, nhưng có thể gọi các phương thức khác của lớp. Các phương thức (tĩnh hoặc khơng tĩnh) có thể truy cập thuộc tính tĩnh và phương thức tĩnh.

Tất cả các phương thức (non-static) của lớp đều có con trỏ this. Nhưng phương thức tĩnh thì khơng có con trỏ this.

Một phần của tài liệu Tài liệu giảng dạy kỹ thuật lập trình 2 (Trang 68 - 71)

Tải bản đầy đủ (PDF)

(143 trang)