static成员
- 前言
- 一、static成员
- 概念
- 例题
- 二、 static成员的特性
- 特性
- 例题
- 静态成员函数可以调用非静态成员函数吗
- 非静态成员函数可以调用类的静态成员函数吗
前言
一、static成员
概念
声明为static
的类成员称为类的静态成员,用static
修饰的成员变量,称之为静态成员变量;用static
修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。
静态成员是指属于类而不属于类的任何对象的成员。静态成员在类的所有对象之间共享,并且可以在不创建对象的情况下被访问。静态成员包括静态变量和静态方法。
静态变量是类的所有对象之间共享的变量。它们在内存中只有一份拷贝,并且可以直接通过类名访问。静态变量在类的任何对象被创建之前就被初始化,它们的值在所有对象之间是一致的。
静态方法是属于类而不属于任何对象的方法。它们可以直接通过类名调用,而不需要创建类的对象。静态方法通常用于执行与类相关的操作,而不涉及特定对象的状态。
静态成员在类的定义中使用static
关键字进行声明。例如,以下是一个使用静态变量和静态方法的示例:
class MyClass {
public:static int staticVar; // 静态变量声明static void staticMethod(); // 静态方法声明
};int MyClass::staticVar = 0; // 静态变量定义和初始化void MyClass::staticMethod() {// 静态方法的实现cout << "This is a static method." << endl;
}int main() {MyClass::staticVar = 10; // 静态变量的访问MyClass::staticMethod(); // 静态方法的调用return 0;
}
在上述示例中,静态变量staticVar
和静态方法staticMethod
属于类MyClass
,可以直接通过类名进行访问和调用。
例题
实现一个类,计算程序中创建出了多少个类对象。
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;void TestA()
{cout << A::GetACount() << endl;A a1, a2;A a3(a1);cout << A::GetACount() << endl;
}
以上代码定义了一个名为A
的类,该类包含一个私有的静态成员变量_scount
,一个默认构造函数,一个拷贝构造函数和一个析构函数。在main
函数中,调用TestA
函数。
TestA
函数中,首先调用A::GetACount()
函数获取当前A
类的对象数量,然后创建了两个A
类的对象a1
和a2
,并将a1
传递给a3
的拷贝构造函数。再次调用A::GetACount()
函数获取当前A类的对象数量。
_scount
是一个静态成员变量,它在类定义外进行初始化,并在类定义中被声明为私有。该变量用于记录A
类的对象数量。默认构造函数和拷贝构造函数都会在对象创建时将_scount
自增1,析构函数会在对象销毁时将_scount
自减1。
因此,输出结果将显示A类对象的数量。首先是0
,因为还没有创建任何A
类的对象。然后是3
,因为在TestA函数中创建了两个对象(a1
和a2
),并进行了一次拷贝构造(a3
)。最后,在TestA
函数结束后,对象被销毁,_scount
减少到0。
二、 static成员的特性
特性
- 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
- 静态成员变量必须在类外定义,定义时不添加
static
关键字,类中只是声明 - 类静态成员即可用 类名
::
静态成员 或者 对象.
静态成员 来访问 - 静态成员函数没有隐藏的
this
指针,不能访问任何非静态成员 - 静态成员也是类的成员,受
public
、protected
、private
访问限定符的限制
例题
静态成员函数可以调用非静态成员函数吗
静态成员函数可以调用非静态成员函数,但需要通过对象或者指针来调用。因为非静态成员函数是依赖于具体的对象或者实例的,而静态成员函数是独立于对象或者实例的,所以在静态成员函数中不能直接访问非静态成员变量和非静态成员函数。但可以通过将对象作为参数传递进来或者通过对象指针来调用非静态成员函数。
非静态成员函数可以调用类的静态成员函数吗
非静态成员函数可以调用类的静态成员函数。在非静态成员函数中,可以使用类名和作用域解析操作符(::
)来调用静态成员函数。