首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于类的static成员的许多疑问解决办法

2012-03-15 
关于类的static成员的许多疑问1.在什么情况下能用到static成员函数?按照我的理解,static成员函数和非stati

关于类的static成员的许多疑问
1.在什么情况下能用到static成员函数?
按照我的理解,static成员函数和非static成员函数的区别在于static成员函数没有隐含的this形参.那么在怎样的情况下需要使用没有this形参的成员函数呢?

2. < <effective   c++> > 中 "条款02:尽量以const,enum,inline替换#define "一文写道:
"
第二个值得注意的是class专属常量.为了将常量的作用域(scope)限制与class内,你必须让它成为class的一个成员(member);而为确保此常量最多只有一份实体,你必须让它成为一个static成员.
class   GamePlayer   {
private:
      static   const   int   NumTurns   =   5;       //常量声明式
      int   scores[NumTurns];                         //使用该常量
      ...
}
然而你所看到的是NumTurns的声明式而非定义式.通常C++要求你对你所使用的任何东西提供一个定义式,但如果它是个class专属常量又是static且为整数类型(integral   type,例如   ints,chars,bools),   则需特殊处理.只要不取它们的地

址,你可以使用或声明它们而无需提供定义式.但如果你取某个class专属常量的地址,或纵使你不取其地址而你的编译器却(不正确的)坚持要看到一个定义式,你就必须另外提供定义式如下:
const   int   GamePlayer::NumTurns;//NumTurns的定义;
                                                              //下面告诉你为什么没有给予数值
请把这个式子放进一个实现文件而非头文件.由于class常量已在声明时获得初值(例如先前声明NumTurns时为它设初值5),因此定义时不可以再设初值.
"
可是
include <iostream>

class   Foo
{
public:
const   int*   get_pN()   {   return   &NumTurns;   }
private:
static   const   int   NumTurns=5;
};

int   main(int   argc,char*   argv[])
{
Foo   f;
f.get_pN();
return   0;
}
编译运行都完全没有问题.按照上面的说法, "static   const   int   NumTurns   =   5; "是声明而非定义,在没有提供定义式 "const   int   GamePlayer::NumTurns; "的情况下,应该不能取NumTurns的地址呀.

3.为什么只有static   const的 "整数类型 "才能在类的定义体内初始化,而static   const   float,statci   const   double等类型就不能?C++这样设计有什么用意?

[解决办法]
1,C++的理念中不提倡全局函数,提倡类的封装,但是有些情况需要全局的变量和函数,这些可以用static来修饰,封装进类中,这样它具有全局的性质,又在代码上体现类的管理
class A
{
public:
static int n;//这个n不属于A的具体对象,而是A类所有对象的成员,具有全局性质
}
[解决办法]
对于静态成员函数的问题,它可以用在以下几个方面:
1、相当于全局函数,即不需要类实例,也可以调用
2、可以作为线程、回调函数,因为它没有this指针,在调用它时,可以把this指针作为参数传入,这样就可以调用类的公用变量或函数了。
[解决办法]
没有类实例,又要操作静态成员,用静态成员函数

热点排行