关于静态成员

来源:互联网 发布:linux socket通信 编辑:程序博客网 时间:2024/04/28 03:34

类中的静态成员数据可以在类体中初始化的只有常量整型的成员,因为静态数据成员可以为类中的其它数据成员或函数成员所用,所以考虑到一个数组如果用静态成员作为维数的话,则应该让该成员被常量表达式初始化,所以C++允许常量整型的静态成员在类体中被初始化,而其它类型一律不允许.注意这里的整型不单止int,只要是可以用来表示数组维数的类型都是整型.同时,在类中被声明的静态成员一般要在类外中被定义(即初始化).即使是在类中初始化了的常量整型数据成员也要在类外定义一次(只不过它不用再初始化而已),这其中也包括了类数据成员.在vs2005中提供了优化,可以在类中声明了而不在类外定义.但原则上是要做这一步的.

静态数据成员可以声明自身类类型的成员,而非静态的不行,只能声明指针或引用.同样,该自身类型的成员要在类外被定义一次,而这种情况编译器不再做优化,所以如果不提供定义,会在链接时刻出错.如果是非自身类类型的数据成员,编译器同样会优化,调用缺省构造函数初始化.

所以,请记住,标准定义里静态成员都要在类外被定义一次.只有常量整型的静态成员可以在类体中用一常量值初始化.

任何其它类型的数据成员在类体内不管用什么方法初始化都是不允许的.

数据成员中如果要用到另一个数据成员的话,该被用到的数据成员要被声明在前,这跟先声明再使用的原则是一致的.而成员函数则不用限制,成员函数使用类中的数据成员时会查找类中的所有数据成员,并不要求数据成员先声明.静态数据成员还可以做为类成员函数的缺省参数,不管其是否常量表达式.常量表达式只影响作为数组维数的数据成员.

静态数据成员在被用到时并不需要隐式调用this指针,这意味着,它只要不是const类型,则它在任何成员函数里都可以被修改,而且这是合法的.任何函数即包括了const和volatile.最后说下静态成员函数.静态成员函数就是为了方便使用静态成员数据出现的.因为静态成员数据使用时可以独立于对象,所以为了可以更方便地使用静态数据,就有了静态成员函数.静态成员函数中不含this指针,这意味着,它不可以访问非静态的数据成员,如果这样做的话,因为没有this指针,它不知道要调用的是哪一个对象的数据成员.

同样,静态成员函数可以被const和volatile对象调用.但记住,静态成员函数不允许修饰符.因为它没有this指针.

 

原创粉丝点击