对于某些类,我们可能需要定义1个全局对象。比如,我们想定义一个整形数据,来记录一个类的某个函数调用的次数,或者统计一共创建了多少个这个类的对象。之前只能通过全局对象来实现,但是这样做有一个明显的缺点:全局对象会破坏类的封装特性,任何代码都可以修改这个全局对象,这是很不安全的。
因此,C++中引入了类静态成员,这个成员用static修饰。有一点念需要明确:static对象并不是某个类的成员,而是这个类共有的。如果我们把它设为私有成员,那么类外的函数就不能对它访问,从而实现了封装。
先看一个简单的程序:
class Test
{
public:
Test(){cnt++;}
static void display()
{
cout<<cnt<<endl;
}
static int cnt;
static const int one = 1;
};
int Test:: cnt = 0;
const int Test::one;
int main()
{
Test tst1;
tst1.display();
Test tst2;
tst2.display();
tst2.cnt = 10;
Test tst3;
tst3.display();
Test::cnt = 100;
Test tst4;
tst4.display();
cout<<Test::one<<endl;
return 0;
}
程序中Test类声明了一个static成员cnt,可以用来记录Test对象的的个数。第一次打印结果为1,第二次为2.由于我把它设为公有有成员,所以在类外也可以修改它,让它“看起来”跟类的普通成员差不多,但是修改以后,第3次次打印的结果就变成11了,这说明上一次对类static成员的修改对于这一次使用类依然有影响。当然,我们也可以使用作用域操作符::来修改它。
对于数据,我们可以定义它为static,对于函数也可以。此时这个函数也是属于类的,而不属于某个具体的对象。所以,static成员函数没有this指针。当然,static完全可以在类内声明,而在类外定义,此时,声明时加上static,而定义时就不用加上static了。
还有一点需要注意,static数据成员必须在类外部定义,而且只能定义一次,也不能通过构造函数初始化它!所以最好把它放在对应头文件的cpp文件中,即把它与成员的非内联函数的定义放在一起!它的定义的方法跟其他的类成员相同:先定义类型,再指定是哪个类中的,最后才是定义的语句,需要注意的是定义时不能加static。
上面的定义方法有一种特例,就是整型的const static成员,它是在类的定义体中初始化:static const int one = 1;但是这里的初始化本质上还是声明,而它的定义依然在类外进行,只不过不用指定初值而已:const int Test::one;
分享到:
相关推荐
java 利用反射获取内部类静态成员变量的值操作.docx
代码详解了普通成员函数、普通类成员函数和类静态成员函数的使用方法,已测试,可直接使用
声明为 static 的类成员或者成员函数便能在类的范围内共同享,我们把这样的成员称 做静态成员和静态成员函数。
此资源包含内容:Dart中的对象 类 静态成员 操作符 类的继承。PPT讲义以及源代码
在没有讲述本章内容之前如果我们想要在一个范围内共享某一个数据,那么我们会设立全局对象,但面向对象的程序是由对象构成的,我们如何才能在类范围内共享数据呢? 这个问题便是本章的重点:
当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。各个对象都拥有类中每一个普通数据成员的副本,但静态...静态成员不可在类体内进行赋值,因为它是被所有该类的对象所
C++类中的静态成员变量和静态成员函数的作用
C++类与对象:static静态数据成员静态成员函数.doc
一般地,线程要读写类的私有成员变量,只有两种方法:将全局函数声明为类友元friend,或者使用静态的成员函数static。那非静态的成员函数呢?一般地方都说的是,不行,做不了。。。为什么不行?都是代码区的代码,...
对C++静态成员函数和静态成员变量的使用方法和内部机制进行的经验总结
c++静态成员使用实例,是在学习谭浩强老师c++课本的过程中写的
类的静态数据成员的实际应用场景之一:用来统计该类对象存在的个数;并且如果在头文件中初始化静态变量将导致obj重复定义的错误,解决办法:将静态成员的初始化放到.cpp文件中
Microsoft Visual Studio 2010做的C# winform类的静态成员及静态方法,主要代码: public class Student { private int IDBase = 20080000; private int ID; public static int StudentNumber; public string ...
易语言实现类静态数据成员的方法源码,实现类静态数据成员的方法,方法1,方法2
静态成员不是某对象私有的(所有对象共有,修改一个对象的静态成员,其他所有的都修改,同时这也是RTTI的原理),他要求在声明时初始化(不能在类作用域内初始化),并且, 这个成员也不计算在calss的大小里面(你...
指向类的静态成员的指针,通过指针访问类的静态数据成员
静态成员变量在不创建类的对象的情况下,就可以使用,它被所有该类的实例所共享。 而普通非静态成员变量只能在创建了类的对象实例后才能使用,并且不是共享,而是属于具体的
实验4 含有类的静态成员与类的友元的C++程序设计 .类的静态成员函数可以通过对象名调用吗?
静态成员与有源静态成员与有源静态成员与有源静态成员与有源静态成员与有源静态成员与有源静态成员与有源静态成员与有源静态成员与有源静态成员与有源静态成员与有源静态成员与有源静态成员与有源静态成员与有源静态...