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个字节。