Hàm thành viên tĩnh trong C++ (Ví dụ)
Hàm tĩnh trong C++?
In C++ các lớp, thành viên tĩnh là thành viên lớp thuộc về lớp chứ không phải thuộc về đối tượng của nó. Bạn sẽ chỉ có một bản sao của tư cách thành viên. Đây là trường hợp bất kể số lượng đối tượng bạn tạo.
Khi một hàm lớp được định nghĩa là tĩnh, tất cả các đối tượng lớp đều có chung một thành viên lớp tĩnh. Do đó, hàm tĩnh có thể được truy cập mà không cần tạo bất kỳ đối tượng lớp nào và trở nên độc lập với đối tượng lớp. Một thành viên dữ liệu tĩnh trong C++ có thể truy cập các hàm tĩnh khác, chỉ bên ngoài lớp.
Tại sao nên sử dụng hàm tĩnh?
Không giống như C++ các hàm toàn cục, các hàm tĩnh chỉ có thể truy cập được từ tệp khai báo. Nếu cần hạn chế quyền truy cập vào một chức năng, hãy đặt nó ở trạng thái tĩnh.
Sử dụng hàm tĩnh để hạn chế việc sử dụng lại cùng tên hàm trong một tệp khác.
Xác định hàm tĩnh trong C++
Cú pháp:
static int myfunc(void)
{
cout("Example of C++ static function ");
}
Trong ví dụ trên, chúng ta đang định nghĩa một hàm tĩnh có tên myfunc. Lưu ý việc sử dụng từ khóa tĩnh trong định nghĩa. Từ khóa xuất hiện trước tên hàm.
Hàm thành viên tĩnh trong C++
Khi một thành viên hàm được khai báo tĩnh, nó sẽ trở nên độc lập với các đối tượng khác trong lớp. Bạn có thể gọi hàm thành viên tĩnh ngay cả khi không có đối tượng lớp nào khác tồn tại.
Để truy cập tên lớp, bạn nên sử dụng tên của lớp và toán tử phân giải phạm vi (::). Một hàm tĩnh chỉ có thể truy cập các hàm tĩnh khác, các thành viên dữ liệu tĩnh và các hàm khác bên ngoài lớp. Phạm vi của các hàm thành viên tĩnh nằm trong lớp và chúng không thể truy cập con trỏ lớp này.
Ví dụ 1
#include<iostream>
using namespace std;
class BoxClass {
public:
static int count;
BoxClass(double l = 2.0, double b = 2.0, double h = 2.0) {
cout << "Class constructor called." << endl;
length = l;
breadth = b;
height = h;
count++;
}
double getVolume() {
return length * breadth * height;
}
static int getCount() {
return count;
}
private:
double length;
double breadth;
double height;
};
int BoxClass::count = 0;
int main(void) {
cout << "Inital value of count is : " << BoxClass::getCount() << endl;
BoxClass Box1(3.2, 1.4, 1.8);
BoxClass Box2(7.5, 4.0, 4.0);
cout << "Final value of count is : " << BoxClass::getCount() << endl;
return 0;
}
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Giải thích mã:
- Bao gồm tệp tiêu đề iostream trong C++ chương trình sử dụng nó chức năng.
- Bao gồm không gian tên std trong mã để sử dụng các lớp của nó mà không cần gọi nó.
- Tạo một lớp có tên BoxCả lớp.
- Sử dụng công cụ sửa đổi truy cập công khai để đánh dấu một thành viên lớp có thể truy cập công khai.
- Việc khai báo một thành viên lớp tĩnh có tên là count.
- Sử dụng hàm tạo lớp để khởi tạo ba biến có kiểu double.
- In một số văn bản trên bảng điều khiển. Hàm endl (dòng cuối) di chuyển con trỏ chuột sang dòng tiếp theo.
- Khởi tạo giá trị của l thành độ dài thay đổi.
- Khởi tạo giá trị của b thành chiều rộng thay đổi.
- Khởi tạo giá trị của h theo chiều cao thay đổi.
- Sau đó, tăng giá trị của biến count lên 1 mỗi lần tạo đối tượng mới.
- Kết thúc phần thân của hàm tạo.
- Tạo một hàm có tên là doublevolume().
- Xác định hàm doubleVolume() sẽ trả về kết quả gì. Nó sẽ trả về phép nhân của các biến length, width và height.
- Kết thúc thân hàm doubleVolume().
- Khai báo một hàm tĩnh có tên getCount().
- Hàm getCount() sẽ trả về giá trị của biến đếm.
- Phần cuối của hàm getCount().
- Sử dụng công cụ sửa đổi quyền truy cập riêng tư để đánh dấu thành viên lớp là có thể truy cập công khai.
- Khai báo một thành viên lớp có tên là length của kiểu dữ liệu double. Nó sẽ có thể truy cập riêng tư.
- Khai báo một thành viên lớp khác có tên là widthth của kiểu dữ liệu double. Nó sẽ có thể truy cập riêng tư.
- Khai báo một thành viên lớp có tên height thuộc kiểu dữ liệu double. Nó sẽ có thể truy cập riêng tư.
- Phần cuối của cơ thể BoxLớp lớp.
- Sau đó khởi tạo một thành viên tĩnh của BoxLớp lớp.
- Gọi hàm main(). các C++ logic chương trình nên được thêm vào trong phần thân của hàm đó.
- In một số văn bản trên bảng điều khiển cho biết số lượng đối tượng hiện tại trước khi các đối tượng mới được tạo.
- Khai báo một đối tượng có tên Box1, là một trong những thể hiện của lớp BoxLớp học. Các giá trị chiều rộng, chiều dài và chiều cao phải được chỉ định trong dấu ngoặc đơn.
- Khai báo một đối tượng có tên Box2, là một thể hiện của lớp BoxLớp học. Các giá trị chiều rộng, chiều dài và chiều cao đã được chỉ định trong dấu ngoặc đơn.
- In một số văn bản trên bảng điều khiển cho biết số lượng đối tượng hiện tại sau khi tạo đối tượng mới.
- C++ chương trình phải trả về giá trị sau khi hoàn thành thành công.
- Kết thúc phần thân của hàm main().
Truy cập các hàm tĩnh
Bạn không cần tạo đối tượng lớp để truy cập hàm tĩnh. Thay vào đó, bạn có thể sử dụng tên lớp và toán tử phân giải phạm vi (::).
Cú pháp:
className::funcName
Ở trên, className là tên của lớp nơi hàm tĩnh đã được xác định. funcName là tên được gán cho hàm tĩnh.
Ví dụ 2
#include<iostream>
using namespace std;
class MyClass {
public:
static void msgFunc() {
cout << "Welcome to Guru99!";
}
};
int main() {
MyClass::msgFunc();
}
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Giải thích mã:
- Bao gồm tệp tiêu đề iostream trong chương trình của chúng tôi để sử dụng các chức năng của nó.
- Bao gồm không gian tên std trong mã của bạn để sử dụng các lớp của nó mà không cần gọi nó.
- Tạo một lớp có tên MyClass.
- Sử dụng công cụ sửa đổi truy cập công khai để đánh dấu một thành viên trong lớp là có thể truy cập công khai.
- Khai báo một hàm tĩnh có tên msgFunc(). Từ khóa tĩnh làm cho hàm tĩnh.
- Chỉ định văn bản sẽ in trên bảng điều khiển sau khi hàm trên được gọi/gọi.
- Phần cuối của hàm msgFunc().
- Kết thúc phần thân lớp.
- Gọi hàm main().
- Gọi hàm tĩnh có tên msgFunc().
- Kết thúc phần thân của hàm main().
Truy cập các biến tĩnh
Các biến tĩnh thuộc về một lớp chứ không phải thuộc về các đối tượng của lớp. Nếu một biến tĩnh là công khai, thì nó có thể truy cập được bằng tên lớp và sử dụng toán tử phân giải phạm vi. Tuy nhiên, điều này là không thể nếu thành viên tĩnh là riêng tư.
Thông thường, các biến riêng tư được truy cập bằng các hàm công khai. Tuy nhiên, một thể hiện/đối tượng lớp phải được tạo. Giải pháp là sử dụng hàm tĩnh.
Ví dụ 3: Biến tĩnh trong C++ tốt nghiệp lớp XNUMX
#include<iostream>
using namespace std;
class AClass {
private:
static int myvar;
public:
static int getVar() {
return myvar;
}
};
int AClass::myvar = 23;
int main() {
cout <<"The value of myvar is: "<< AClass::getVar() << '\n';
}
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Giải thích mã:
- Bao gồm tệp tiêu đề iostream trong chương trình của chúng tôi.
- Bao gồm không gian tên std trong chương trình này để sử dụng các lớp của nó mà không cần gọi.
- Tạo một lớp có tên AClass.
- Sử dụng công cụ sửa đổi quyền truy cập riêng tư để làm cho biến myvar có thể truy cập riêng tư.
- Tạo một biến số nguyên tĩnh có tên myvar.
- Sử dụng công cụ sửa đổi truy cập công khai để đánh dấu hàm getVar() là có thể truy cập công khai.
- Tạo một hàm tĩnh có tên getVar().
- Hàm getVar() có thể trả về giá trị của biến myvar.
- Kết thúc phần thân của hàm getVar().
- Phần cuối của lớp AClass.
- Gán biến myvar giá trị 23. Chúng tôi đã sử dụng tên lớp và toán tử phân giải phạm vi cho việc này.
- Gọi hàm main().
- In giá trị của biến myVar trên bảng điều khiển cùng với văn bản khác. Chúng tôi đã sử dụng tên lớp, hàm tĩnh và toán tử phân giải phạm vi để truy cập giá trị của biến này.
- Phần cuối của thân hàm main().
con trỏ này trong hàm tĩnh
Một hàm tĩnh không được gắn vào một đối tượng. Đó là lý do tại sao các hàm tĩnh không có con trỏ này. Con trỏ của đối tượng thường trỏ đến đối tượng mà nó hiện đang làm việc. Vì các hàm tĩnh không hoạt động với các đối tượng nên không cần con trỏ này.
Các hàm tĩnh có quyền truy cập trực tiếp vào các thành viên tĩnh khác. Tuy nhiên, đây không phải là trường hợp với các thành viên không có tĩnh. Lý do là các thành viên không tĩnh phải thuộc về một đối tượng, còn các hàm tĩnh không có đối tượng để làm việc.
Ví dụ 4
Có thể định nghĩa một hàm tĩnh bên ngoài khai báo lớp. Hãy để chúng tôi chứng minh điều này:
#include<iostream>
using namespace std;
class NumGenerator {
private:
static int nextNum;
public:
static int getNextNum();
};
int NumGenerator::nextNum = 1;
int NumGenerator::getNextNum() {
return nextNum++;
}
int main() {
for (int count = 0; count < 5; ++count)
std::cout << "The next number is: " << NumGenerator::getNextNum() << '\n';
return 0;
}
Đầu ra:
Đây là ảnh chụp màn hình mã của bạn:
Giải thích mã:
- Bao gồm tệp tiêu đề iostream trong mã của chúng tôi để sử dụng các chức năng của nó.
- Bao gồm không gian tên std trong mã của chúng tôi để sử dụng các lớp của nó mà không cần gọi nó.
- Tạo một lớp có tên NumGenerator.
- Sử dụng công cụ sửa đổi quyền truy cập riêng tư để đánh dấu biến, chúng tôi sắp tạo biến có thể truy cập riêng tư.
- Tạo một biến số nguyên tĩnh có tên nextNum.
- Sử dụng công cụ sửa đổi quyền truy cập công khai giúp bạn đánh dấu biến mà chúng tôi sắp tạo là có thể truy cập công khai.
- Khai báo một hàm tĩnh có tên getNextNum().
- Kết thúc thân lớp.
- Gán biến nextNum giá trị là 1. Chúng tôi đã thực hiện việc này bằng cách sử dụng tên lớp, tên biến và toán tử phân giải phạm vi.
- Xác định hàm tĩnh getNextNum() bên ngoài lớp.
- Chỉ định hành động được thực hiện khi hàm trên được gọi/gọi. Nó sẽ tăng giá trị của biến nextNum lên 1.
- Kết thúc định nghĩa hàm getNextNum().
- Gọi hàm main(). các C++ logic chương trình nên được thêm vào trong phần thân của hàm này.
- Sử dụng vòng lặp for để tạo một biến có tên là count. Giá trị của biến này sẽ tăng từ 0 đến 4. Sau mỗi lần lặp, giá trị của biến sẽ tăng thêm 1.
- In giá trị của biến nextNum cùng với văn bản khác trên bảng điều khiển ở mỗi lần lặp. Giá trị được truy cập bằng hàm getNextNum().
- T C++ chương trình phải trả về giá trị sau khi hoàn thành thành công.
- Kết thúc hàm main().
Tổng kết
- C++ thành viên tĩnh là thành viên lớp thuộc về lớp chứ không phải đối tượng của nó.
- Bạn sẽ chỉ có một bản sao của thành viên tĩnh bất kể số lượng đối tượng bạn tạo.
- Tất cả các đối tượng lớp chia sẻ từng thành viên lớp tĩnh.
- Sau khi định nghĩa một hàm lớp là tĩnh, nó trở nên độc lập với các đối tượng lớp.
- Một hàm tĩnh có thể được truy cập ngay cả khi bạn không tạo bất kỳ đối tượng lớp nào.
- Tuy nhiên, các hàm tĩnh không có đối tượng này, nó trỏ đến các đối tượng lớp.






