Static Trong C++ – Techacademy

Chúng ta hoàn toàn có thể định nghĩa những thành viên lớp là static bởi dùng từ khóa static trong C + +. Khi tất cả chúng ta khai báo 1 thành viên của 1 lớp là static, lúc đó dù cho có bao nhiêu đối tượng người tiêu dùng của lớp được tạo, thì sẽ chỉ mang 1 bản sao của thành viên static .Một thành viên static chỉ buộc phải khởi tạo 1 lần và được san sẻ cho tổng thể đối tượng người tiêu dùng của lớp. Tất cả tài liệu static được khởi tạo về 0 khi đối tượng người tiêu dùng tiên phong được tạo .
Chúng ta không hề khởi tạo thành viên static trong định nghĩa lớp, nhưng nó hoàn toàn có thể được định nghĩa bên ngoài lớp đó bởi việc khai báo lại biến static như trong ví dụ sau, sử dụng toán tử phân giải khoanh vùng phạm vi :: để nhận diện lớp nào chiếm hữu nó. Hãy cùng Techacademy tìm hiểu và khám phá cụ thể qua bài viết dưới đây nhé .

I. Định Nghĩa Static C + +

Static trong c++ là dữ liệu của lớp không phải là dữ liệu của đối tượng. Static trong c++ tồn tại như 1 biến toàn cục. Hay nói cách khác dữ liệu static xuất hiện trước lúc bạn khởi tạo đối tượng của lớp, và nó chỉ tồn tại duy nhất.

Bạn đang đọc: Static Trong C++ – Techacademy

Các thành viên static hoàn toàn có thể là public, private hoặc protected .
Static ngoài khai báo biến còn hoàn toàn có thể khai báo hàm .

Đối với class, static sử dụng để khai báo thành viên dữ liệu dùng chung cho mọi thể hiện của lớp:

  • Một bản duy nhất tồn tại trong suốt quá trình chạy của chương trình.
  • Dùng chung cho tất cả các thể hiện của lớp.
  • Bất kể lớp đó có bao nhiêu thể hiện.

Định Nghĩa Static C++

II. Biến Static Trong Hướng Đối Tượng C + +

Ví dụ mình sẽ khai báo một biến static, int count, biến này dùng để đếm số lượng những hình chữ nhật đã được tạo ra .

class Rectangle {
  private: int width;
  int length;
  static int count;
  public: void set(int w, int l);
  int area();
  Rectangle() {
    count++;
  }
  Rectangle(int x, int y) {
    count++;
    set(x, y);
  }
}

class Rectangle {
  private:
    int width;
  int length;
  static int count;
  public:
    void set(int w, int l);
  int area();
  Rectangle() {
    count++;
  }
  Rectangle(int x, int y) {
    count++;
    set(x, y);
  }
}

Như vậy khi một đối tượng người dùng được tạo tất cả chúng ta sẽ tăng count lên để triển khai đúng ý đồ đếm hình chữ nhật .
Tuy nhiên tất cả chúng ta không hề gán trước giá trị bắt đầu của static trong class mà tất cả chúng ta phải gán giá trị cho nó ở ngoài class .
ví dụ

int main() {
    int Rectangle::count = 0; // Sau khi khởi tạo giá trị đầu mình tạo minh họa 3 hình chữ nhật Rectangle r1(2,4); Rectangle r2(1,2); Rectangle r3;}

    int main() {
      int Rectangle::count = 0;
      // Sau khi khởi tạo giá trị đầu mình tạo minh họa 3 hình chữ nhật
      Rectangle r1(2, 4);
      Rectangle r2(1, 2);
      Rectangle r3;
    }

Biến Static Trong Hướng Đối Tượng C++
Ví dụ về static trong c + +
Ví dụ bên trên chỉ rõ biến static count không phải là tài liệu của đối tượng người tiêu dùng như width và length mà nó là tài liệu của class và chỉ sống sót duy nhất .
Để sử dụng, gán hoặc lấy giá trị của static bạn sử dụng khoanh vùng phạm vi truy xuất để gọi nó

//Ví dụ khởi tạo ban đầu
int Rectangle::count = 0;
 
//Gọi biến static:
Rectangle::count

Lưu ý thêm ở phần khai báo mình để static count ở private, nên bên ngoài class không hề dùng khoanh vùng phạm vi truy xuất đến truy vấn ( Như cách gọi Rectangle :: count ) Nhưng việc khai báo và gán giá trị bắt đầu như int Rectangle :: count = 0 ; là được phép .
Để dùng Rectangle :: count bạn hoàn toàn có thể khai báo biến static này ở public hoặc viết thêm hàm static get giá trị count này .

III. Hàm Static Trong Hướng Đối Tượng C + +

Hàm static có vai trò cũng như biến static. Nghĩa là khi bạn đã khai báo class nhưng chưa tạo ra đối tượng người dùng như Rectangle r1 ( 2,4 ) thì tất cả chúng ta vẫn truy vấn được biến count như ví dụ trên. Vậy ở phần hàm static cũng có vai trò như vậy, hàm này sẽ là sống sót duy nhất của class .
Mình sẽ khai báo thêm static int getCount ( ) ở thuộc tính public
a. Code đơn cử về static

class Rectangle
{
    private:
        int width;
        int length;
        static int count;
    public:
        void set(int w, int l);
 
        static int getCount()
        {
            return count;
        }
 
        int area();
        Rectangle()
        {
            count++;
        }
        Rectangle(int x, int y) 
        { 
            count++; 
            set(x,y);
        }
}

b. Gọi hàm static
Bạn hoàn toàn có thể gọi hàm static bằng cách sau :

  • Gọi Rectangle::getCount() ở ngoài class hoặc bên trong class
  • Gọi getCount() Bên trong class.

Hàm Static Trong Hướng Đối Tượng C++

IV. Thành Viên Static Của Class

Hàm thành viên static trong C++

Bằng việc khai báo 1 hàm thành viên là static trong C + +, bạn làm nó độc lập với bất kể đối tượng người tiêu dùng đơn cử nào của lớp. Một hàm thành viên static hoàn toàn có thể được gọi ngay cả lúc không có đối tượng người dùng nào của lớp sống sót và những hàm static được truy vấn chỉ bởi dùng tên lớp và toán tử phân giải khoanh vùng phạm vi :: trong C + + .
Một hàm thành viên chỉ hoàn toàn có thể truy vấn thành viên tài liệu static, những hàm thành viên static khác và bất kể hàm khác từ bên ngoài lớp đó .
Các hàm thành viên static có một khoanh vùng phạm vi lớp và chúng không có sự truy vấn đến con trỏ this của lớp trong C + +. Bạn hoàn toàn có thể sử dụng 1 hàm thành viên để xác lập có hay không một số ít đối tượng người tiêu dùng của lớp đã được tạo .
Bạn thử ví dụ sau để hiểu khái niệm của hàm thành viên static trong C + + :

#include 
 
using namespace std;

class Box
{
   public:
      static int biendemDT;
      // phan dinh nghia Constructor
      Box(double dai=1.0, double rong=1.0, double cao=1.0)
      {
         cout <<"Constructor duoc goi." << endl;
         chieudai = dai;
         chieurong = rong;
         chieucao = cao;
         // gia tri cua biendemDT tang len moi khi doi tuong duoc tao
         biendemDT++;
      }
      double theTich()
      {
         return chieudai * chieurong * chieucao;
      }
      static int layBienDem()
      {
         return biendemDT;
      }
   private:
      double chieudai;     // Chieu dai cua mot box
      double chieurong;    // Chieu rong cua mot box
      double chieucao;     // Chieu cao cua mot box
};

// khoi tao thanh vien static cua lop Box
int Box::biendemDT = 0;

int main(void)
{
  
   // in tong so doi tuong duoc tao truoc khi tao cac doi tuong.
   cout << "So doi tuong ban dau la: " << Box::layBienDem() << endl;

   Box Box1(2.4, 4.2, 2.2);    // khai bao box1
   Box Box2(4.5, 2.0, 3.2);    // khai bao box2

   // in tong so doi tuong duoc tao sau khi tao cac doi tuong.
   cout << "Tong so doi tuong sau khi tao la: " << Box::layBienDem() << endl;

   return 0;
}

Biên dịch và chạy chương trình C + + trên sẽ cho tác dụng sau :
Hàm Static Trong Hướng Đối Tượng C++

V. Khi Nào Nên Sử Dụng Biến Static

Biến static được dùng lúc chỉ cần một bản sao của biến. thế cho nên trường hợp bạn khai báo biến bên trong phương pháp thì không dùng biến như vậy, nó sẽ trở thành cục bộ chỉ hoạt động giải trí ..
Các biến được khai báo static thường được san sẻ trên toàn bộ những trường hợp của một lớp .
Các biến được khai báo static thường được san sẻ trên toàn bộ những trường hợp của một lớp. Khi bạn tạo phong phú phiên bản của lớp VariableTest Biến này vĩnh viễn được san sẻ trên toàn bộ chúng. Do đó, tại bất kể thời gian nhất định nào, sẽ chỉ có 1 giá trị chuỗi được chứa trong biến vĩnh viễn .

Vì chỉ có 1 bản sao của biến có sẵn cho tất cả các trường hợp, mã this.permament sẽ dẫn đến lỗi biên dịch vì có thể nhớ lại rằng this.variablename tham chiếu đến tên biến cá thể. Do đó, những biến tĩnh phải được truy cập trực tiếp, như được chỉ ra trong mã.

Khi Nào Nên Sử Dụng Biến Static

VI. Const Static ’ Có Nghĩa Là Gì Trong C Và C + + ?

Const static ’ có nghĩa là gì trong C và C + +
Tôi đã thấy điều này trong 1 số mã ở đây trên StackOverflow và tôi không hề tìm ra nó làm gì. Sau đó, tôi thấy 1 số câu vấn đáp nhầm lẫn trên những forum khác. Tôi đoán tốt nhất là nó được dùng trong C để ẩn hằng số fookhỏi những mô-đun khác. Điều này có đúng không ? Nếu vậy, tại sao mọi người sẽ dùng nó trong toàn cảnh C + + nơi bạn hoàn toàn có thể tạo ra nó private ?
Câu vấn đáp :
+ Nó có dùng trong cả C và C + + .
Như bạn đã đoán, staticphần số lượng giới hạn khoanh vùng phạm vi của nó cho đơn vị chức năng biên dịch đó. Nó cũng cung ứng cho khởi tạo tĩnh. constchỉ nói với trình biên dịch để không được cho phép bất kỳ ai sửa đổi nó. Biến này được đặt trong phân đoạn tài liệu hoặc bss tùy thuộc vào kiến ​ ​ trúc và hoàn toàn có thể nằm trong bộ nhớ được lưu lại chỉ đọc .
Tất cả đó là cách C giải quyết và xử lý những biến này ( hoặc giải pháp C + + giải quyết và xử lý những biến khoảng trống tên ). Trong C + +, một thành viên được ghi lại staticđược san sẻ bởi tổng thể những phiên bản của một lớp nhất định. Cho dù đó là riêng tư hay không không tác động ảnh hưởng đến trong thực tiễn là một biến được san sẻ bởi nhiều trường hợp. Có consttrên đó sẽ cảnh báo nhắc nhở bạn nếu có bất kể mã nào sẽ tìm mọi cách sửa đổi điều đó .
Nếu nó trọn vẹn riêng tư, thì mỗi phiên bản của lớp sẽ có phiên bản riêng ( mặc dầu trình tối ưu hóa ) .
+ Rất nhiều người đã đưa ra câu vấn đáp cơ bản nhưng không ai chỉ ra rằng trong C + + constmặc định staticở namespace Lever ( và 1 số ít đã phân phối thông tin sai ). Xem phần tiêu chuẩn C + + 98 3.5.3 .
Đầu tiên 1 số ít nền tảng :
Đơn vị dịch : Một tệp nguồn sau bộ giải quyết và xử lý trước ( đệ quy ) gồm có tổng thể những tệp gồm có .
Liên kết tĩnh : Một hình tượng chỉ có sẵn trong đơn vị dịch thuật của nó .
Liên kết ngoài : Một hình tượng có sẵn từ những đơn vị dịch thuật khác .
– Ở Lever công dụng

staticcó nghĩa là giá trị được duy trì giữa các lệnh gọi hàm.
Các ngữ nghĩa của các staticbiến chức năng tương tự như các biến toàn cục ở chỗ chúng nằm trong phân đoạn dữ liệu của chương trình (chứ không phải ngăn xếp hoặc heap), xem câu hỏi này để biết thêm chi tiết về statictuổi thọ của biến.

– Ở classcấp độ
staticcó nghĩa là giá trị được san sẻ giữa tổng thể những biểu lộ của lớp và constcó nghĩa là nó không biến hóa .
Const Static' Có Nghĩa Là Gì Trong C Và C ++

VII. Bài Tập C + + OOP Giá Trị Của Biến Static

Biến static (static variables)

Biến static được tạo ra bên trong một khối lệnh có năng lực lưu giữ giá trị của nó mặc dầu chương trình đã chạy ra bên ngoài khối lệnh chứa nó .
Biến static chỉ cần được khai báo một lần duy nhất, và liên tục được duy trì sự sống sót xuyên suốt cho đến khi chương trình kết thúc .
Dưới đây là một ví dụ đơn thuần cho thấy sự độc lạ giữa việc sử dụng biến cục bộ và biến static :

#include 
 
void incrementAndPrint()
{
    int value = 1; // automatic duration by default
    ++value;
    std::cout << value << '\n';
} // value is destroyed here
 
int main()
{
    incrementAndPrint();
    incrementAndPrint();
    incrementAndPrint();
    
    return 0;
}

Mỗi khi hàm incrementAndPrint được gọi, một biến có tên gọi “ value ” được tạo ra và được gán giá trị 1. Hàm incrementAndPrint sẽ tăng giá trị của biến “ value ” lên 1 đơn vị chức năng, giá trị in ra màn hình hiển thị là 2. Khi hàm incrementAndPrint triển khai xong tác vụ, biến “ value ” bị hủy. Cứ triển khai liên tục như vậy, tác dụng in ra màn hình hiển thị là :

2
2
2

Bây giờ, tất cả chúng ta thêm từ khóa static trước nơi biến “ value ” được khai báo :

#include 
 
void incrementAndPrint()
{
    static int s_value = 1; // static duration variable
    ++s_value;
    std::cout << s_value << '\n';
} // s_value is not destroyed here, but became inaccessible
 
int main()
{
    incrementAndPrint();
    incrementAndPrint();
    incrementAndPrint();
    
    return 0;
}

Lần này, vì biến “ s_value ” được khai báo với từ khóa static, nó sẽ chỉ được khởi tạo một lần duy nhất, dù hàm incrementAndPrint được gọi nhiều lần. Mỗi lần hàm incrementAndPrint được gọi, giá trị của biến “ s_value ” được tăng thêm 1, và còn được lưu giữ lại đó cho đến khi chương trình kết thúc. Kết quả in ra như sau :

2
3
4

Hàm static (static functions)

Từ khóa static cũng hoàn toàn có thể được sử dụng cho những hàm, thường là những hàm được đặt bên trong những struct hoặc class ( gọi là phương pháp ). Trong bài học kinh nghiệm này, mình lấy một ví dụ về việc sử dụng hàm static bên trong một struct mẫu như sau :

#include 

struct Test
{
   static void foo()
   {
      std::cout << "Called static function: foo" << std::endl;
   }
};

int main()
{
   Test::foo();
   return 0;
}

Các bạn hoàn toàn có thể thấy, hàm foo được gọi mà không cần tạo ra thực thể kiểu Test .
Điểm đáng chú ý quan tâm trong việc sử dụng hàm static trong struct / class là chúng không hề truy xuất đến non-static members trong struct / class đó :

struct Test
{
   int value;

   void nonstatic_foo()
   {
   }

   static void foo()
   {
      value = 1; // error
      nonstatic_foo(); // error
   }
};

Bài Tập C++ OOP Giá Trị Của Biến Static
Đánh Giá Chất Lượng Bài Viết

Average rating 1 / 5. Vote count : 1 No votes so far ! Be the first to rate this post.