【C++】静态成员变量和静态成员函数

一、静态成员概念

 声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量static修饰成员函数,称之为静态成员函数静态成员变量一定要在类外进行初始化

1. 静态成员 所有类对象所共享 ,不属于某个具体的对象,存放在静态区
2. 静态成员变量 必须在 类外定义 ,定义时不添加 static 关键字,类中只是声明
3. 类静态成员即可用 类名 :: 静态成员 或者 对象 . 静态成员 来访问
4. 静态成员函数 没有 隐藏的 this 指针 ,不能访问任何非静态成员
5. 静态成员也是类的成员,受 public protected private 访问限定符的限制

 

二、静态成员变量

例题:实现一个类,计算程序中创建出了多少个类对象。
class A
{
public:
	A() 
    { 
        ++_scount; 
    }

	A(const A& t) 
    { 
        ++_scount; 
    }

	~A() 
    { 
        --_scount; 
    }

	static int GetACount() 
    { 
        return _scount; 
    }

private:
	static int _scount;
};

int A::_scount = 0;

int main()
{
	cout << A::GetACount() << endl;
	A a1, a2;
	A a3(a1);
	cout << A::GetACount() << endl;
}

三、静态成员函数

当我们在C++中使用静态函数(也称为静态方法)时,它们具有以下特点和用途:

  1. 与类本身相关联:静态函数是与类本身相关联的函数,而不是与类的实例对象相关联的。它们属于类的命名空间,而不是类的实例对象。

  2. 调用时可以不创建实例对象:与非静态成员函数不同,你可以不创建类的实例对象就可以直接使用静态函数。你可以使用类名和范围解析运算符(::)来调用静态函数,例如ClassName::staticFunction()当然也可以通过实例对象对静态函数进行调用。类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问。

  3. 无法直接访问非静态成员:静态函数没有隐式的this指针,因此无法直接访问非静态成员变量或非静态成员函数。如果需要访问非静态成员,你可以使用类的静态成员变量来存储或传递非静态对象的信息。

  4. 只能直接调用静态成员函数:由于静态函数没有this指针,它只能直接调用类的静态成员函数。如果需要调用非静态成员函数,你需要通过创建类的实例对象来调用。

  5. 非静态函数可以直接调用静态函数。静态成员函数属于类本身,而不是类的实例。静态成员函数在调用时无需引用类的实例,因此可以在非静态成员函数中直接调用静态成员函数。

  6. 静态函数可以直接访问静态成员但不可以直接访问非静态成员:静态函数可以直接访问和操作静态成员变量和静态成员函数。它们可以访问类的静态成员变量,对其进行修改或使用其值。

  7. 适用于工具函数和辅助函数:静态函数通常用于实现一些工具函数或辅助函数,这些函数不需要访问特定的对象状态,只需执行某些功能或返回某些结果。

#include 

class MyClass {
public:
    static int staticVar; // 静态成员变量

    static void staticFunc() {
        std::cout << "This is a static function." << std::endl;
        std::cout << "Static variable: " << staticVar << std::endl;
        // 访问静态成员变量和调用静态成员函数
        anotherStaticFunc();
    }

    static void anotherStaticFunc() {
        std::cout << "This is another static function." << std::endl;
    }
};

// 静态成员变量定义
int MyClass::staticVar = 10;

int main() {
    MyClass::staticVar = 20; // 直接访问静态成员变量

    MyClass::staticFunc(); // 调用静态函数

    return 0;
}

总结来说,静态函数是与类本身相关联的函数,无需创建实例对象即可使用。它们无法访问非静态成员变量和非静态成员函数,只能调用静态成员函数。静态函数可以访问和操作静态成员,适用于实现工具函数和辅助函数。

你可能感兴趣的:(c++,开发语言)