静态成员是指属于类而不属于类的任何对象的成员。静态成员在类的所有对象之间共享,并且可以在不创建对象的情况下被访问。静态成员包括静态变量和静态方法。
静态变量是类的所有对象之间共享的变量。它们在内存中只有一份拷贝,并且可以直接通过类名访问。静态变量在类的任何对象被创建之前就被初始化,它们的值在所有对象之间是一致的。
实现一个类,计算程序中创建出了多少个类对象。
classA{public:A(){++_scount;}A(constA&t){++_scount;}~A(){--_scount;}staticintGetACount(){return_scount;}private:staticint_scount;};intA::_scount=0;voidTestA(){cout< TestA函数中,首先调用A::GetACount()函数获取当前A类的对象数量,然后创建了两个A类的对象a1和a2,并将a1传递给a3的拷贝构造函数。再次调用A::GetACount()函数获取当前A类的对象数量。 因此,输出结果将显示A类对象的数量。首先是0,因为还没有创建任何A类的对象。然后是3,因为在TestA函数中创建了两个对象(a1和a2),并进行了一次拷贝构造(a3)。最后,在TestA函数结束后,对象被销毁,_scount减少到0。 静态成员函数可以调用非静态成员函数,但需要通过对象或者指针来调用。因为非静态成员函数是依赖于具体的对象或者实例的,而静态成员函数是独立于对象或者实例的,所以在静态成员函数中不能直接访问非静态成员变量和非静态成员函数。但可以通过将对象作为参数传递进来或者通过对象指针来调用非静态成员函数。 非静态成员函数可以调用类的静态成员函数。在非静态成员函数中,可以使用类名和作用域解析操作符(::)来调用静态成员函数。 其中一个原因是缺省值是要走初始化列表的,而static是不会走初始化列表。 除此之外,因为静态成员变量在编译阶段就已经被分配了内存空间(即在静态区),并没有被放置在对象的内存空间中。静态成员变量是属于整个类而不是某个具体对象的,它的生命周期独立于任何对象的创建和销毁。 如果允许为静态成员变量设置缺省值,那么在编译阶段就需要为所有的静态成员变量分配空间并为其赋值。这将引入额外的开销和复杂性,因为静态成员变量的初始值可能会依赖于其他静态成员变量或静态函数的结果。 为了避免这种复杂性和性能开销,C++规定了静态成员变量不能直接设置缺省值。可以在类外部定义静态成员变量,并在类外部进行初始化赋值: classMyClass{staticintmyStaticVariable;};intMyClass::myStaticVariable=0;//在类外部进行初始化赋值需要注意的是,如果不在类外部进行初始化赋值,静态成员变量的初始值将是未定义的。因此,为了保证静态成员变量的可靠性,最好在类外部进行初始化赋值。 C++中,static关键字可以用于修饰变量和函数,并且在两者之间有一些区别。 当我们在C++中定义了一个静态函数后,可以通过以下方式进行调用: 输出结果将会是"Thisisastaticfunction."。 需要注意的是,因为静态函数不依赖于对象实例,所以可以通过类名直接访问。而不需要先创建对象实例。