liyuxia713

蹒跚前行者

常用链接

统计

Algorithms

C++

最新评论

类static成员

 

static成员引进:有时特定类的全体对象需要访问一个全局对象。

 

为什么用static成员而不是全局对象?

       ---- static对象名字在类作用域中,可以有效避免命名冲突,并且清晰显示程序意图。

       ---- 可以实施封装(static成员可以定义为private,而全局对象不可以)

 

如何调用?     ---- class A a; A::static_mem; a.static_mem;

 

声明和定义

       ---- static成员函数在类定义体内部外部定义均可。在类定义体外定义时不加(不可以加)static修饰。

       ---- static数据成员必须在类定义体外部定义(正好一次)(在类定义体外声明并定义)

              class A{public : static int n;} int A::n = 10;

       ---- const static数据成员可以(也可以不)在类定义内初始化,但必须在类定义体外部重新声明(不可以加static修饰符,不可以赋初值)

 

static数据成员其他特性:

       ----一般地,在类的内部不能有该类类型的变量(或函数形参),最多只能有该类类型的指针或引用做变量类型(或函数形参).  static数据成员则不受这个限制。

       ---- 类的static数据成员可以作为函数默认实参 

       ---- static成员的继承:如果基类有static成员,则整个继承层次中只有一个这样的成员。每个static成员总是只有一个实例。
     

 1#include <iostream> 
 2#include <cstdlib>
 3
 4using namespace std; 
 5
 6class A
 7{
 8      //重载输出操作符 
 9      friend ostream& operator<<(ostream& outconst A&a)
10      {
11             out << a.m;
12             return out;
13      }

14      
15private:
16        int m ;
17 
18public:
19       A(int i) { m = i;}
20       
21       static int n;  
22       
23       static A a; //类可以有该类类型的static成员
24       //A a1; //error. 类不可以有普通的该类类型的成员            
25       
26       static void func(A a) {cout << a << endl;} //类类型可以作为该类static函数的形参   
27       
28       //static 数据成员可以作为类成员函数的默认实参 
29       static void func2(int i = n) { cout << i*<<endl;}    
30}
;
31
32int A::n = 10;
33A A::a(1);
34
35int main()
36{
37    cout << A::n << endl; //10
38    cout << A::a <<endl; //1
39    
40    A a2(3); 
41    A::func(a2); //3
42    A::func2(); //100
43 
44    system("pause");
45    return 0;
46}
 


posted on 2010-01-08 12:22 幸运草 阅读(1501) 评论(6)  编辑 收藏 引用 所属分类: C++

评论

# re: 类static成员 2010-01-08 20:25 Sunshine Alike

为啥要在类外面写一次定义呢?
为了初始化?  回复  更多评论   

# re: 类static成员 2010-01-09 18:47 幸运草

@Sunshine Alike

static成员变量的初始化必须是在类定义体外面的,类定义体内其实只是声明。

  回复  更多评论   

# re: 类static成员 2010-01-09 19:03 Sunshine Alike

@幸运草
嗯,这个我知道,只是觉得这种写法有点不好看,呵呵,类里的东西要写在外面
干嘛不能写成在类体里面进行初始化
class A
{
public:
static int n = 10;
};  回复  更多评论   

# re: 类static成员 2010-01-09 19:25 幸运草

@Sunshine Alike
因为在C++中类只是一种类型,内存中并没有给它分配空间,所以在类体内是不能有赋初值的操作的。

static成员变量不像其他普通类成员变量可以通过构造函数赋值,所以只能在类的定义体外定义并初始化它了
  回复  更多评论   

# re: 类static成员 2010-06-04 19:07 nic

输出类类型静态成员变量的值必须重载操作符么?还有什么别的办法没有?  回复  更多评论   

# re: 类static成员 2010-06-05 09:14 幸运草

@nic
我的示例里静态成员并不是通过重载的操作符输出的。直接通过A::a获取,然后用cout输出的。

至于重载操作符,只是我的一种习惯,平时只是验证一些小知识点写的代码,一般都需要输出看结果,我还懒得对每个private数据成员都定义一个get函数然后输出。所以。。。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理