读书人

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

发布时间: 2012-03-15 11:50:38 作者: rapoo

关于类的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指针作为参数传入,这样就可以调用类的公用变量或函数了。
[解决办法]
没有类实例,又要操作静态成员,用静态成员函数

读书人网 >C++

热点推荐