打印

c++ 问题,请进

[复制链接]
1663|7
手机看帖
扫描二维码
随时随地手机跟帖
楼主
HWM| | 2008-10-8 15:51 | 显示全部楼层 回帖奖励 |倒序浏览

用也可以,但要另加特殊说明。

使用特权

评论回复
沙发
HWM| | 2008-10-8 15:56 | 显示全部楼层

参考我以前的 C++ 随笔

C++ 随笔-4,静态成员变量和静态成员函数 
 HWM 发表于 2008-4-8 21:14 新手园地 ←返回版面   举报该贴 


考察下面的例子:

class class_A
{
    int x;
    static int a;
    static int add( int i, int j ) { return (i + j); }
    
    public:
    
    class_A( void ) { x = 10; a = 20; }
    int get_x( void ) { return x; }
    void set_x( int i ) { x = i; }
    void set_a( int i ) { a = i; }
    void Do_it( void ) { x = add( x, a ); }
};

int class_A::a;
class_A A, B;
int Y, Z;

int main( void )
{
    A.set_x( 30 );
    A.set_a( 40 );
    A.Do_it();
    B.Do_it();
    Y = A.get_x();
    Z = B.get_x();
    
    while ( 1 )
    {
    }
}

我们发现有两个奇怪的成员和一个奇怪的变量,下面把它们提取出来:

static int a;
static int add( int i, int j ) { return (i + j); }

int class_A::a;

首先分析一下static int a,这是类class_A的一个成员变量。特殊的是在变量说明之前加了一个关键字static,这样成员变量a就变成了“静态”的了。这里静态的意思就是在存储器中分配一个“固定的”存储空间,使类class_A的所有实例化对象中的相应成员变量a都被定位在这个固定的存储空间上,实现了类class_A的所有对象(在此是A和B)共享变量a。为了表明这个“固定的”存储空间的存在,在全局变量定义中增加了一条相关的定义,即int class_A::a;,而这就是我们看到的那个奇怪的变量。

现在再看看另一个奇怪的成员static int add( int i, int j ) { return (i + j); },这是类class_A的一个成员函数。特殊的是在函数说明之前同样加了一个关键字static,这样一来函数add也变成“静态”的了。在类的封装中我们曾经说过,成员函数有一个隐形指针(this)作为输入参数,这也是封装所付出的代价。这个代价是否可以避免,若能又可在何种情况下避免呢?首先来分析一下为何要使用这样一个指针。我们知道成员函数代码是被类的所有实例化对象所共享的,成员函数只知道所在类的成员地址在对象中的相对偏移量,而不清楚具体对象存储空间的绝对地址。所以如果要使用所在类的其他成员就必须得到相应对象的地址——this。但从另一方面来说,如果成员函数不使用所在类中的其他成员,这个对象地址硬传给它不就成多余的吗?是否存在不用传对象地址的成员函数呢?回答是肯定的。前面我们看到的那个变成“静态”的函数恰恰就是我们所要的函数——静态函数。静态函数和非静态函数的差别就在于是否传递对象指针。
 
 

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则