C/C++中static解析

在C/C++中,static有两种含义:

 1. 在固定的地址上进行存储分配,即对象在一个特殊的静态数据区(static data area)上创建 ------  静态存储

 2. 对于一个特定的编译单元是局部的 ------  C++局限于类

 针对第一个点,最先想到的就是变量,由编译器在静态数据区为其分配内存空间;static负责创建的变量称之为静态变量,例如:函数内部的静态变量,类的静态数据成员和静态函数等。

    函数内部的静态变量:只在函数的第一次调用时进行初始化,之后的函数调用中将保留静态变量的值。

    类的静态数据成员:编译器在静态数据区创建,属于类,所以对象共享静态数据成员的存储区。

    类得静态成员函数:和静态数据成员函数相似,属于类所以,对象共有,但不能调用普通的成员函数和成员变量;

 下面详细对static的几点用法做说明:

1.函数内部的静态变量

         函数内部的静态变量只在函数的第一次调用时初始化,之后的函数的调用中将保留静态变量的值;

例如:你想知道一个函数被调用了多少次,静态变量可以轻松的解决这个问题;函数内部的静态变量只在函数的第一次调用时初始化,之后的函数的调用中将保留静态变量的值;

#include <stdio.h>

int fun()
{
	static int count = 0;
	count++;
	return count;
}

int main()
{
	int sumCount;
	int index;
	for (index=0; index<10; index++)
	{
		sumCount = fun();
	}
	printf("%d\n",sumCount);
	system("pause");
	return 0;
}


//结果: 10

由上面的代码可以看出,函数内部的静态变量只在函数的第一次调用时初始化,之后在调用fun()函数,count中保留着上次调用的值,并非又重新初始化为0;在后面的调用中将已现保留的值进行计算.

2.函数内部的静态对象

   对象,更多的是牵扯到用户自定义的数据类型,而对于用户自定义的数据类型必须用构造函数来初始化,所以在定义一个静态对象时没有指定构造函数参数,这个类必须有默认的构造函数。

   静态函数的析构函数在程序main()中退出时,活着C标准库exit()函数被调用时才被调用,多数情况下main()函数的结束也是调用exit()函数结束程序的,所以在析构函数内部使用exit()是很危险的,很容易造成无穷的递归调用,但是在使用标准的C库函数abort()来退出程序,静态对象的析构函数是不会被调用的。

 

3.类中的静态数据成员

  类的静态数据成员拥有一块单独的存储区,它是属于类。不管创造多少个对象,这些对象共享静态数据成员的存储区域,而且它的名字在类的作用域范围内有效;同时也应该注意的是静态数据成员的定义(初始化)必须出现的类的外部(不允许内联);

class A
{   
    statci int i;
public:
   //...
}

int A::i = 0;
 

这样的定义,我们会想到int i 是私有成员,而在类的外部进行定义,破会了类得安全性,但是在C++中有两点保证了它是绝对安全的:

     a. 这些变量的初始化唯一合法的地方在定义时。

     b. 一旦这些数据被定义了,最终的用户就不能在定义它。

4.静态成员函数

    静态成员函数和静态数据成员有着一样的特性,属于类共有;类得静态成员函数不能访问一般的数据成员,只能访问静态数据成员,也只能调用静态成员函数;这是因为在静态成员函数中没有this 指针。

    通常类中成员函数调用时,对象的地址(this)是被隐式的传递到被调用的函数的,由于静态成员存储在特殊位置,并且没有对象的地址的传递,所以是不能够调用一般的数据成员和成员函数的

class X
{
    int i;
    static int j;
public:
    X(int ii):i(ii)
    {
       j = i;

    } 
    int val() const { return i;}
    static int incr()
    {
       //i++;            //error 
       return j++;
    }
    static int f()
    {
       //val();           //error
       return incr();
    }
};

新手,了解的不够深,以后有更深层次的了解之后会追加的!作为学习过程中的一种总结吧...

 

阅读更多
个人分类: C++基础知识
上一篇C++文件读写详解(ofstream,ifstream,fstream)
下一篇动态对象创建(一)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭