- vừa được xem lúc

Biến Static trong C++

0 0 8

Người đăng: Nguyen Khac Manh

Theo Viblo Asia

Biến Static trong C++

1. Nội dung

Biến static: Biến trong hàm, Biến trong lớp. Các thành viên static của class: Các đối tượng và hàm của lớp trong một lớp.

2. Biến static

Biến static trong Hàm: Khi một biến được khai báo với từ khóa static, vùng nhớ cho nó tồn tại theo vòng đời của chương trình. Ngay cả khi hàm được gọi nhiều lần, vùng nhớ cho biến static chỉ được cấp nhát một lần và giá trị của biến trong những lần gọi trước đó được lưu lại và được sử dụng để thực hiện thông qua các lượt gọi hàm tiếp theo. Điều này rất hữu ích để triển khai các ứng dụng nào khác mà trạng thái chức năng trước đó cần được lưu trữ.

#include <iostream> #include <string> using namespace std; void demo() { static int count = 0; cout << count << " "; count++; } int main() { for (int i=0; i<5; i++) demo(); return 0; } 

Kết quả:

0 1 2 3 4

Bạn có thể thấy trong chương trình trên, biến count được khai báo là tĩnh. Vì vậy, giá trị của nó được thực hiện thông qua các cuộc gọi chức năng. Biến count không được khởi tạo lại cho mỗi lần gọi hàm.

Các biến static trong class: Vì các biến được khai báo là tĩnh chỉ được khởi tạo một lần khi chúng được cấp phát một địa chỉ trong bộ lưu trữ tĩnh riêng biệt, do đó, các biến tĩnh trong một lớp được chia sẻ bởi các đối tượng. Chúng ta không tạo ra các bản sao cho cùng một biến tĩnh của các đối tượng khác nhau. Cũng vì lý do này mà các biến tĩnh không thể được khởi tạo bằng cách sử dụng các hàm khởi tạo (hàm constructor()).

#include<iostream> using namespace std; class GfG { public: static int i; GfG() { }; }; int main() { GfG obj1; GfG obj2; obj1.i =2; obj2.i = 3; cout << obj1.i<<" "<<obj2.i;
} 

---> chương trình lỗi, không chạy được.

Bạn có thể thấy trong chương trình trên, mình thử tạo ra nhiều bản sao của biến static i của các đối tượng. Nhưng việc này là không thể. Vì vậy, một biến static bên trong một class nên được khởi tạo bằng cách sử dụng toán tử tên và toán tử phân giải phạm vi bên ngoài class như dưới đây:

#include<iostream> using namespace std; class GfG { public: static int i; GfG() {}; }; int GfG::i = 1; int main() { GfG obj; cout << obj.i; } 

Kết quả:

1

3. Thành viên static của class

Các đối tượng của class là static: Cũng giống như các biến, các đối tượng cũng khi được khai báo là static có thời gian tồn tại bằng với thời gian tồn tại của chương trình. Xét ví dụ sau:

#include<iostream> using namespace std; class GfG { int i = 0; public: GfG() { i = 0; cout << "Inside Constructor\n"; } ~GfG() { cout << "Inside Destructor\n"; } }; int main() { int x = 0; if (x==0) { GfG obj; } cout << "End of main\n"; } 

Kết quả:

Inside Constructor
Inside Destructor
End of main

Trong chương trình trên, đối tượng được khai báo bên trong khối lệnh if là không phải là biến static. Vì vậy, phạm vi của biến chỉ nằm trong khối if. Vì vậy, khi đối tượng được tạo, hàm tạo được gọi và ngay khi kết thúc điều câu lệnh if hàm hủy được gọi ngay lập tức vì phạm vi của đối tượng nằm trong khối lệnh if. Theo dõi một ví dụ khi khai báo đối tượng là static.

#include<iostream> using namespace std; class GfG { int i = 0; public: GfG() { i = 0; cout << "Inside Constructor\n"; } ~GfG() { cout << "Inside Destructor\n"; } }; int main() { int x = 0; if (x==0) { static GfG obj; } cout << "End of main\n"; } 

Kết quả:

Inside Constructor
End of main
Inside Destructor

Có thể thấy rõ sự khác biệt trong kết quả. Bây giờ hàm hủy được gọi sau khi kết thúc main. Điều này xảy ra bởi vì thời gian tồn tại của đối tượng static là cùng với thời gian tồn tại của chương trình. Các hàm static trong class: Giống như các thành viên kiểu static hoặc các biến static bên trong class, các hàm static cũng không phụ thuộc vào đối tượng của class. Cho phép gọi một hàm thành viên static bằng cách sử dụng đối tượng và toán tử "." . Nhưng nên gọi các thành viên static bằng cách sử dụng tên lớp và toán tử phân giải phạm vi. Các hàm thành viên tĩnh chỉ được phép truy cập các thành viên dữ liệu kiểu static hoặc các hàm thành viên static khác, chúng không thể truy cập các thành viên không phải kiểu static của class.

#include<iostream> using namespace std; class GfG { public: // static member function static void printMsg() { cout<<"Welcome to GfG!"; } }; // main function int main() { // invoking a static member function GfG::printMsg(); } 
Welcome to GfG!

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 528

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 409

- vừa được xem lúc

Đặt tên commit message sao cho "tình nghĩa anh em chắc chắn bền lâu"????

. Lời mở đầu. .

1 1 775

- vừa được xem lúc

Tìm hiểu về Resource Controller trong Laravel

Giới thiệu. Trong laravel, việc sử dụng các route post, get, group để gọi đến 1 action của Controller đã là quá quen đối với các bạn sử dụng framework này.

0 0 373

- vừa được xem lúc

Phân quyền đơn giản với package Laravel permission

Như các bạn đã biết, phân quyền trong một ứng dụng là một phần không thể thiếu trong việc phát triển phần mềm, dù đó là ứng dụng web hay là mobile. Vậy nên, hôm nay mình sẽ giới thiệu một package có thể giúp các bạn phân quyền nhanh và đơn giản trong một website được viết bằng PHP với framework là L

0 0 462

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 436