【带头学C++】----- 九、类和对象 ---- 9.9 静态成员

看完记得点赞、收藏+关注啊!谢谢大佬们支持!!!

目 录

9.9 静态成员

9.9.1 静态成员变量

9.9.2 静态成员函数


9.9 静态成员

      C++ 中的静态成员是属于类本身而不是类的实例的成员。静态成员可以是静态变量或静态函数。使用关键字 static 修饰声明为静态的,称为静态成员,那么无论这个类创建了多少个对象静态成员只有一个拷贝,这个拷贝是被所以属于这个类的对象进行共享。

以下是关于 C++ 静态成员的一些重要特点:

  1. 静态变量(静态数据成员):静态变量被所有类的实例共享,它们在程序执行期间只分配一次内存。可以通过类名直接访问静态变量,也可以在类的静态成员函数中访问。静态变量需要在类的定义外进行初始化,一般在类的实现文件中进行。
  2. 静态函数(静态成员函数):静态函数不属于任何特定的实例,它们可以在不创建类实例的情况下被调用。静态函数只能访问静态成员(包括静态变量和静态函数),不能访问非静态成员。

9.9.1 静态成员变量

static修饰的静态成员,属于类而不属于对象。(所有对象共享一份静态成员数据)

【带头学C++】----- 九、类和对象 ---- 9.9 静态成员_第1张图片

        静态成员在内存中只有一份副本,并且在程序执行期间只分配一次内存。无论创建多少个类的实例,它们都共享相同的静态成员。这与非静态成员不同,非静态成员是每个对象独有的,每个对象都有自己的一份副本。

        通过静态成员,可以在不创建类的实例的情况下共享数据或功能,或者作为类级别的计数器等用途。可以通过类名直接访问静态成员,而不需要创建类的实例。

  •  static修饰的成员定义类的时候必须分配空间
  • static修饰的静态成员数据必须类中定义类外初始化

例:可以统计对象的个数如下例代码中所示:

class MyClass {    //class 修饰的叫类
public:
    static int count; // 静态变量声明

    MyClass() {
        count++; // 在构造函数中增加计数
    }
};

int MyClass::count = 0; // 静态变量定义和初始化

int main() {
    MyClass obj1; // 类创建的obj1对象,这里叫对象
    MyClass obj2;

    cout << "Count: " << MyClass::count << endl; // 输出 2

    return 0;
}

      注意类外初始化静态成员变量的时候,需要使用作用域限定符  “ :: ”去访问对象的静态成员名称,进行初始化的定义和赋值。 在上面的示例中,count 是一个静态成员变量,它在类的多个对象之间共享。每次创建 MyClass 的对象时,构造函数会增加 count 的值。在 main() 函数中,我们可以直接通过 MyClass::count 访问静态成员变量,而不需要引用特定的对象。

拓展:c++11以上支持在类中初始化static修饰的静态变量

例:除了在类外使用作用域限定符初始化静态成员之外,C++11以上提供了一下方法在类中初始化。

1.使用----- const ---内联初始化(Inline Initialization):在类声明中直接给静态成员变量赋初始值

class MyClass {
public:
    static const int count = 0; // 内联初始化

    // ...
};

2.使用constexpr修饰的所有静态变量

    static constexpr int num1 = 100;
    static constexpr float num2 = 100.00;
    static constexpr double num3 = 100.01;

 案例:统计对象个数

【带头学C++】----- 九、类和对象 ---- 9.9 静态成员_第2张图片

代码:

class Data4{
public:
    int mA;
    static int count;
public:
    Data4(){
        count++;
    }
    Data4(int a){
        mA = a;
        count++;
    }

    Data4(const Data4 &ob)
    {
        count++;
    }
    ~Data4(){
        count--;
    }
};
int Data4::count = 0;
void test05(){
   Data4 ob1;
   Data4 ob2(10);
   Data4 ob3 = ob2;
   cout << "对象数量为:"<

9.9.2 静态成员函数

 静态成员函数是属于类,而不是单独属于某个对象(所有对象共享静态成员函数);

 静态成员函数 可以直接通过类名称访问私有的静态成员变量

【带头学C++】----- 九、类和对象 ---- 9.9 静态成员_第3张图片

 静态成员函数只能操作静态成员变量,不能操作普通成员变量。

【带头学C++】----- 九、类和对象 ---- 9.9 静态成员_第4张图片

看完记得点赞、收藏+关注啊!谢谢大佬们支持!!!

 看完记得点赞、收藏+关注啊!谢谢大佬们支持!!!

看完记得点赞、收藏+关注啊!谢谢大佬们支持!!!

看完记得点赞、收藏+关注啊!谢谢大佬们支持!!!

看完记得点赞、收藏+关注啊!谢谢大佬们支持!!!

你可能感兴趣的:(C++从基础到抗大旗,c++,开发语言,链表,算法,学习)