关闭

C/C++中的静态变量和函数

标签: 设计模式存储c
419人阅读 评论(0) 收藏 举报
分类:

   先说说C中的静态变量和静态函数。(1)C中的静态变量是处于全局存储区,区别于自动变量的存储于栈中。两者的关键区别是其作用域的区别。自动变量的作用域处于其所在的函数或语句块中;而静态变量的作用域起始于其定义处,终止于程序结束处。(2)C中的静态函数主要是限制函数的名字以及可访问域于文件中,表示此函数仅供此文件所用,不允许在其他文件中调用的。有关静态函数的使用可以考虑几点:一是静态函数的名字仅可见于其所定义的文件。这就允许在不同的文件中存在同名的静态函数。可以利用此特性将本文件常用的代码抽象出来成为函数,而在使用此段代码的地方直接调用函数即可。这样允许用简短的名词定义此函数。我的体验,在面临定义功能相同的函数是,为他们取一个美丽的名字其实很困难,而在使用上对名字的记忆也颇费苦心。而用静态函数可以省力许多。而普通函数是可以全局访问的,而且在C中没有名字空间的概念,所以对C中函数的命名颇费苦心。

   再说C++中的静态成员变量和静态成员函数。(1)类静态数据成员在编译时创建并初始化:在该类的任何对象建立之前就存在,不属于任何对象,而非静态类成员变量则是属于对象所有的。类静态数据成员只有一个拷贝,为所有此类的对象所共享。特别需要注意的一点是:静态数据成员不能在类中初始化(对于常量静态类变量有待考证,好像可以在类外或main()函数之前定义,初始化可以放在类中),一般在类外和main()函数之前初始化,缺省时初始化为0。静态数据成员用来定义类的各个对象所公有的数据,比全局变量更安全。(2)类静态成员函数属于整个类,不属于某个对象,由该类所有对象共享。静态成员可定义为inline函数。一般情况下静态成员函数用于访问同一类中的静态数据成员或全局变量,而不访问非静态成员,如需访问非静态成员,需要将对象作为参数,通过对象名访问该对象的非静态成员。静态成员函数也可以在类外定义,此时不可以用static修饰。静态成员函数存在的原因是什么呢?主要是在建立任何对象之前可用它来访问静态数据成员,普通函数不能实现此功能。

   C++静态成员和静态成员函数的使用:静态成员的调用格式:类名::静态数据成员名、对象名.静态数据成员名、对象指针->静态数据成员、对象引用.静态数据成员(但类中很少会出现公有数据成员,这段仅仅讨论语法,未考虑实际运用中的数据封装问题)。静态成员函数的调用格式:类名::静态成员函数名、对象名.静态成员函数名、对象指针->静态成员函数名、对象引用.静态数据成员。静态成员函数没有this指针,因它不与特定对象相联系,调用时推荐使用“类名::静态成员函数名”格式。总结来说,在有对象的情况下,可以用调用普通类成员函数、普通成员变量的方式调用静态成员函数和静态成员变量。从这里可以看出静态成员变量和静态成员函数的使用应该是在不建立任何对象的情况下调用它们。其应用可以参见设计模式中Singleton pattern。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:147653次
    • 积分:2228
    • 等级:
    • 排名:第16932名
    • 原创:70篇
    • 转载:41篇
    • 译文:0篇
    • 评论:15条
    公告
    文章分类
    最新评论