📜  C++中静态数据成员中的内存分配

📅  最后修改于: 2021-05-30 03:01:34             🧑  作者: Mango

C++允许使用static关键字在类中定义静态数据成员。
当数据成员被声明为静态成员,我们必须牢记以下注意事项:

  • 不管创建的对象数量如何,在内存中仅创建静态成员的单个副本。
  • 类的所有对象共享静态成员。
  • 创建该类的第一个对象时,所有静态数据成员都将初始化为零。
  • 静态数据成员仅在该类中可见,但它们的生命周期是整个程序。

关联:
静态数据成员通常用于维护整个类通用的值。 ,例如,以跟踪已经创建了多少个特定类的对象。

存放地点:
尽管静态数据成员在类内声明,但它们不被视为对象的一部分。因此,它们在类中的声明不被视为它们的定义。静态数据成员是在类外部定义的。这意味着,即使在类范围内声明了静态数据成员,其定义也会保留在整个文件中。静态成员具有文件作用域。但是,由于在类内部声明了静态数据成员,因此只能使用类名称和作用域解析运算符来访问它们。

下面是说明静态非静态数据成员中的内存分配的程序:

程序1:说明非静态成员

// C++ program to illustrate
// non-static data members
using namespace std;
#include 
  
// Class
class GfG {
private:
    // Created a variable
    int count = 0;
  
public:
    // Member function to increment
    // value of count
    void set_count()
    {
        count++;
    }
  
    // Member function to access the
    // private members of this class
    void show_count()
    {
  
        // print the count variable
        cout << count << '\n';
    }
};
  
// Driver Code
int main()
{
    // Objects of class GfG
    GfG S1, S2, S3;
  
    // Set count variable to 1
    // for each object
    S1.set_count();
    S2.set_count();
    S3.set_count();
  
    // Function to display count
    // for each object
    S1.show_count();
    S2.show_count();
    S3.show_count();
  
    return 0;
}
输出:
1
1
1

下面是上述程序的内存分配说明:

解释:
GfG类S1,S2和S3的所有三个对象共享成员函数,但具有数据成员计数的单独副本。在main()中,显式调用set_count()以将count的值设置为1。现在,每个对象的count = 1的值。

程序2:说明静态成员:

// C++ program to illustrate
// non-static data members
using namespace std;
#include 
  
// Class
class GfG {
private:
    // Created a static variable
    static int count;
  
public:
    // Member function to increment
    // value of count
    void set_count()
    {
        count++;
    }
  
    // Member function to access the
    // private members of this class
    void show_count()
    {
  
        // print the count variable
        cout << count << '\n';
    }
};
  
int GfG::count = 0;
  
// Driver Code
int main()
{
    // Objects of class GfG
    GfG S1, S2, S3;
  
    // Increment count variable
    // by 1 for each object
    S1.set_count();
    S2.set_count();
    S3.set_count();
  
    // Function to display count
    // for each object
    S1.show_count();
    S2.show_count();
    S3.show_count();
  
    return 0;
}
输出:
3
3
3

下面是上述程序的内存分配说明:

解释:
GfG类S1,S2和S3的所有三个对象共享成员函数以及静态数据成员。内存中仅存在一个静态数据成员的副本。无需使用函数来显式设置count的值,因为静态数据成员的值已在类定义之外初始化为0。现在,每个对象都会增加count的值,从而增加输出。
注意:成员函数和静态数据成员的内存是按类而不是按对象分配的。类sample没有数据成员(静态计数除外),但这并不意味着没有内存空间将分配给Sample对象。在这种情况下,将为对象留出最少的内存。因此,S1,S2和S3的大小为1个字节。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”