Hàm static
Thuộc phần Lập trình hướng đối tượng trong hành trình C của Coddy. Bài học 4 trên 61.
Khi chia code thành nhiều tệp, theo mặc định, mọi hàm được định nghĩa trong một tệp mã nguồn đều hiển thị với các tệp khác. Nhưng đôi khi bạn cần những hàm trợ giúp chỉ dùng nội bộ, tức là các hàm mà những tệp khác không nên truy cập hoặc thậm chí biết đến.
Từ khóa static, khi áp dụng cho một hàm, giới hạn khả năng hiển thị của hàm trong tệp nơi hàm được định nghĩa. Điều này tạo ra một hàm private mà các tệp mã nguồn khác không thể gọi, ngay cả khi có người cố khai báo hàm đó.
// math_utils.c
#include "math_utils.h"
// Hàm hỗ trợ riêng (function), chỉ dùng trong tệp này
static int square(int x) {
return x * x;
}
// Hàm công khai, có thể gọi từ main.c
int sum_of_squares(int a, int b) {
return square(a) + square(b);
}
Trong ví dụ này, sum_of_squares được khai báo trong tệp tiêu đề và có thể dùng ở bất cứ đâu. Tuy nhiên, square được đánh dấu là static, nên chỉ tồn tại trong math_utils.c. Nếu main.c cố gọi trực tiếp square(), trình liên kết sẽ báo lỗi: hàm này đơn giản là không tồn tại bên ngoài tệp của nó.
Đây là cách C thực hiện tính đóng gói ở cấp độ tệp. Các hàm static giúp bạn ẩn chi tiết triển khai, giữ cho giao diện công khai gọn gàng, đồng thời cho phép bạn dùng mọi logic hỗ trợ cần thiết bên trong.
Thử thách
DễHãy xây dựng một chương trình tính khoảng cách, sử dụng một hàm trợ giúp riêng để tính bình phương của một số: đây là chi tiết cần được ẩn khỏi phần còn lại của chương trình.
Bạn sẽ tạo ba tệp:
distance.h: Tệp tiêu đề khai báo một hàm công khai duy nhất làdistance_squared. Hàm này nhận bốn số nguyên (x1, y1, x2, y2) biểu thị hai điểm và trả về một số nguyên. Thêm các chỉ thị bảo vệ tệp tiêu đề bằng ký hiệuDISTANCE_H.distance.c: Tệp mã nguồn chứa phần triển khai. Tạo một hàm trợ giúpstaticcó tênsquare, nhận một số nguyên và trả về bình phương của số đó. Chỉ có thể gọi hàm trợ giúp này bên trongdistance.c. Sau đó, triển khaidistance_squaredbằng cách dùng hàm trợ giúp static để tính (x2-x1)² + (y2-y1)².main.c: Tệp chính, có khai báo tệp tiêu đề và dùng hàm công khai. Không thể truy cập hàm trợ giúpsquaretại đây, chỉ có thể dùngdistance_squared.
Hàm distance_squared tính bình phương khoảng cách Euclid giữa hai điểm. Khi khai báo hàm square là static, bạn ẩn chi tiết triển khai này khỏi mọi code bên ngoài distance.c.
Bạn sẽ nhận bốn đầu vào là số nguyên: x1, y1, x2 và y2.
In bình phương khoảng cách theo định dạng sau:
Squared distance: {result}Ví dụ, với hai điểm (0, 0) và (3, 4), đầu ra sẽ là:
Squared distance: 25Tự làm thử
#include <stdio.h>
#include "distance.h"
int main() {
int x1, y1, x2, y2;
scanf("%d", &x1);
scanf("%d", &y1);
scanf("%d", &x2);
scanf("%d", &y2);
// TODO: Gọi hàm (function) distance_squared với các tọa độ đầu vào
// và in kết quả theo định dạng: "Squared distance: {result}"
return 0;
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Kiến thức cơ bản về lập trình mô-đun
Tệp tiêu đềInclude guardTệp mã nguồnHàm staticÔn tập: Máy tính mô-đun4Tính đóng gói
Khái niệm con trỏ mờĐịnh nghĩa struct mờHàm truy xuất và hàm gánKiểm tra tính hợp lệ trong hàm gánÔn tập: Hộp bí mật2Đối tượng và phương thức
Struct dưới dạng đối tượngCon trỏ 'Self'Tính đúng đắn của constCon trỏ và giá trịPhương thức hỗ trợÔn tập: trình quản lý Point5Dự án: Tài khoản ngân hàng đơn giản
Thiết lập dự ánTriển khai tài khoản3Vòng đời đối tượng
Mẫu hàm khởi tạoMẫu hàm hủyKhởi tạo trên ngăn xếpSao chép sâuÔn tập: lớp bao bọc chuỗi6Kế thừa bằng cách kết hợp
Nhúng structQuy tắc thành viên đầu tiênTruy cập thành viên lớp chaUpcastingÔn tập: hệ phân cấp hình dạngTự luyện tập: Trình biên dịch C online