static总结(转载)

地址:http://blog.csdn.net/mishifangxiangdefeng/article/details/7192809

一、不在类中的static的使用

1.作用

1.局部变量被申明为static,表示这个函数结束的时候这个的值不变。

2.外部变量被申明为static表明它是一个本地全局变量。该变量只能在该文件内被访问,不能被其它文件访问。

2.Static与非static的区别

  • static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;

  • static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值

  • static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

二、类中的static的使用

1.static成员函数

(1)关键字static只在类的定义体内部出现(与const不同,与friend相同),在类外部定义函数、数据成员的时候不能再出现static关键字。**

(2)没有this指针,成员函数都有,static成员函数没有this指针**

(3)不能被声明为const或virtual 。static成员函数不能被声明为const**

2.static成员变量

静态数据成员相关的操作有三个分别是声明、定义与初始化

声明:说明这个类中有这样一个成员,但是不分配空间(1)

定义:分成员开辟内存空间,静态成员的空间在静态成员区,和类的其它成员不在一起(2)

初始化:为它定义一个初值(4)

对于static数据成员:声明在函数体内,定义和初始化要在函数体外,定义和初始化常常放在一句话里(3)。(2)和(3)不能同时出现

要想访问静态数据成员可以通过对象或指针,也可以使用类作用域(4)。参照《12.6 static成员》

例1:/*静态数据成员相关的操作有三个分别是声明、定义与初始化
声明:说明这个类中有这样一个成员,但是不分配空间(1)
定义:分成员开辟内存空间,静态成员的空间在静态成员区,和类的其它成员不在一起(2)
初始化化:为它定义一个初值(4)
对于static数据成员:
声明在函数体内,定义和初始化要在函数体外,定义和初始化常常放在一句话里(3)
(2)和(3)不能同时出现*/
class A
{
public:
    static int x;//(1)
};
int A::x;//(2)
int A::x = 2;//(3)
int main()
{
    A::x = 2;//(4) //使用类作用域访问静态数据成员。问:如果这里的x是私有的,我们还可以访问吗?
    return 0;
}

3.static成员常量

例2:/*对于const static数据成员,情况比较特殊 
声明在函数体内,定义在函数体外,但是初始化可以在函数体内或外都可以 
注意(1),const在声明和定义时都要出现,而static只在声明的时候出现 
如果在函数体外初始化,和前一个例子相同,下面程序是在函数体内定义的情况 
注意(2)千万不在把定义少了*/  
class A  
{  
public:  
    const static int x = 2;//声明和初始化在一起  
};  
const int A::x;//定义,之前已经初始化过了,这里就不用再初始化了。
int main()  
{  
//  A::x = 2;//(4)  
    return 0;  
}  

4.不管是2还是3,声明、定义不可少

  • 少了声明,会出现链接错误(声明在类内)

  • 少了定义,会没有分配空间(定义都在类外面)

  • 少了初始化,默认初始化为0(有时候定义和初始化会在一起)

5.非static数据成员不能用作默认实参

例3:
[cpp] view plaincopy
class A  
{  
public:  
    static int x;  
    int y;  
    void Test1(int para = x){}//正确  
    void Test2(int para = y){}//错误  
};  
int A::x = 2;//定义  

6.静态数据成员在没有对象之前就存在

7.静态成员函数不能被说明为虚函数

8.静态成员函数不能含有普通成员,因为普通成员是属于对象的一部分

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容