转自:http://www.cnblogs.com/gysm/archive/2011/09/16/2179277.html

C++类中谈到static,我们可以在类中定义static成员,static成员函数!C++primer里面讲过:static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联!这句话可能比较拗口,其实可以这么理解:每个static数据成员可以看成是类的一个对象,而不与该类定义的对象有任何关系!下面我们就来具体看看类中的static数据成员!

谈到数据成员,我们最先想到的应该是怎么去定义一个static数据成员,static数据成员是存储在程序的静态存储区,而并不是在栈空间上。既然是static数据成员,所以关键字static是必不可少的,例如:

 1 static.h文件 2 #include  <iostream> 3 #include  <string> 4 using namespace std; 5 class Person 6 { 7 private: 8     string name; 9     static int age;10 public:11     Person(const string&nm):name(nm)12     {}13     void Print()14     {15         cout<<name<<" is "<<age<<endl;16     }17 };18 int Person::age=20;19 20 static.cpp文件21 22 #include "stdafx.h"23 #include "static.h"24 #include <iostream>25 using namespace std;26 27 int _tmain(int argc, _TCHAR* argv[])28 {    29     Person person("tom");30     person.Print();31     cout<<endl;32     return 0;33 }

Person类中定义了一个static数据成员age,注意在类中不能对static数据成员进行初始化,要初始化的话必须在类外进行定义!注意,static数据成员不是通过类构造函数进行初始化的!如上面的代码所示:在类外定义int Person::age=20;这里前面就不要再加static了。如果类中有多个static数据成员,static数据成员初始化的次序是按照static数据成员在类中的声明次序进行初始化的,初始化了之后,就可以使用static数据成员了,我们可以通过作用域操作符从类直接调用static数据成员,或者通过对象,引用,或指向该类类型对象的指针间接调用(这种情况下static数据成员必须是public的访问权限,如果定义在private访问权限下是不行的)。

说到static数据成员,有一种情况不得不提,那就是特殊的const static成员。如上面所述,类的static成员,像普通数据成员一样,不能在类的定义体中进行初始化。只能在类外进行初始化。const int 型的static成员便可以在类定义体内部进行初始化。记住一定只能是const int型的,换成const string ,double都不行的。看下面这段代码:

static.h头文件#include  <iostream>#include  <string>using namespace std;class Person{private:    string name;     static const int age=20;    static string address;public:    Person(const string&nm):name(nm)    {}    static string Address()    {        return address;    }    void Print()    {        cout<<name<<" is "<<age ;    }};string Person::address="Beijing";

static.cpp文件

#include "stdafx.h"#include "static.h"#include <iostream>using namespace std;

int _tmain(int argc, _TCHAR* argv[]){        Person person("tom");    person.Print();    cout<<" and live in "<<person.Address();    cout<<endl;    return 0;}

只有age才能在类定义体内进行初始化,address是不行的。这段代码不能在VC6.0上运行的,它不支持。在vs2008上可以运行。在C++Primer里面有一段注解:const static数据成员在类的定义体中进行了初始化后,还必须在类的定义体之外进行定义。其实这是可要可不要的。上面的代码就没有这段代码实现,其实加上去也是可以的,没有关系。还有一点,static数据成员的类型可以使该成员所属的类类型,非static数据成员被限定为其自生类对象的指针或引用。例如:类定义位如下的情况:

class Person{private:    string name;     static const int age=20;    static string address;    static Person person1;    Person *person2;    Person person3;public:    Person(const string&nm):name(nm)    {}    static string Address()    {        return address;    }    void Print()    {        cout<<name<<" is "<<age ;    }};

如果没有定义person3,则能够顺利通过编译,但是加上了person3就不能通过编译了

说完了static成员后,我们再来看看static成员函数,static成员是类的组成部分并不是任何对象的组成部分,因此,static成员函数没有this指针。我们知道,一般而言,类中的成员函数具有一个附加的隐含实参,即指向该类对象的一个指针。这个隐含实参命名为this。因为static成员函数不是任何对象的组成部分,所以static成员函数就没有this形参了由于成员函数声明为const说明该成员函数不会修改该成员函数所属的对象,所以static成员函数不能声明为const。为什么呢?因为static成员函数不是任何对象的组成部分。static成员函数可以直接访问所属类的static成员,但是不能直接使用非static成员函数!也不能访问static const 类型的成员!在上面的代码中static  string Address()函数中如果是return name或者是return age都不行! 好吧,就说这么些吧,如果哪里有不当之处,还请各位指正!

由微软100题“求和不用for while”引出的static类成员的知识相关推荐

  1. 微软100题第20题

    http://blog.csdn.net/zwb8848happy/article/details/7340634 输入一个表示整数的字符串,把该字符串转换成整数并输出 //Analysis:  // ...

  2. 微软100题(44)几道腾讯面试题

    题目: 1.设计一个魔方(六面)的程序. 2.有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复. 请用5分钟时间,找出重复出现最多的前10条. 3.收藏了1万条url,现在给你一条url ...

  3. 程序员面试题精选100题(55)-不用+、-、×、÷做加法[算法]

    题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+.-.×.÷. 分析:这又是一道考察发散思维的很有意思的题目.当我们习以为常的东西被限制使用的时候,如何突破常规去思考,就是解决这个问题的关 ...

  4. 微软100题第11题

    参照:http://blog.csdn.net/caryaliu/article/details/8107089 参照:http://blog.csdn.net/lalor/article/detai ...

  5. 微软100题(91)智力题

    1.一道著名的毒酒问题 有1000桶酒,其中1桶有毒.而一旦吃了,毒性会在1周后发作. 现在我们用小老鼠做实验,要在1周内找出那桶毒酒,问最少需要多少老鼠. 2.有趣的石头问题 有一堆1万个石头和1万 ...

  6. 微软等数据结构+算法面试100题全部答案集锦

    微软等数据结构+算法面试100题全部答案集锦 作者:July.阿财. 时间:二零一一年十月十三日. 引言 无私分享造就开源的辉煌. 今是二零一一年十月十三日,明日14日即是本人刚好开博一周年.在一周年 ...

  7. 微软公司等数据结构+算法面试100题2010版全部出炉

    微软等公司数据结构+算法面试100题2010版首次完整亮相                         作者:July.2010年12月6日. 更新:现今,这100题的答案已经全部整理出来了,微软 ...

  8. 全新整理:微软、谷歌、百度等公司经典面试100题[第1-60题]

    全新整理:微软.谷歌.百度等公司经典面试100题[第1-60题] 整理:July.二零一一年三月九日. 应网友承诺与要求,全新整理.转载,请注明出处. 博主说明: 此100题V0.2版,本人不再保证, ...

  9. 微软面试100题(含全部答案)

    引言 无私分享造就开源的辉煌. 今是二零一一年十月十三日,明日14日即是本人刚好开博一周年.在一周年之际,特此分享出微软面试全部100题答案的完整版,以作为对本博客所有读者的回馈. 一年之前的10月1 ...

最新文章

  1. 【ES6】异步操作和async函数
  2. python-列表list和元组tuple
  3. 森林病虫防治系统 (十)
  4. php 变量字节大小,PHP 变量
  5. HTTP协议工作原理(与HTTPS的区别)
  6. Entity Framework(EF)数据查询
  7. WPF 基础到企业应用系列2——WPF前世今生
  8. 利用Hibernate进行数据库的增删改查
  9. 利用python爬虫爬百度百聘招聘数据----利用Ajax的方式抓取
  10. Android 集成微信h5支付
  11. 大华存储服务器系统,大华重磅推出64盘位网络视频存储服务器
  12. c语言程序训练营,王道训练营-C语言-1
  13. Unity Shader案例之——阴阳师画符效果
  14. 三十一 我在软件园的那些日子里
  15. 温控-Thermal
  16. [心得]怪诞心理学精华笔记
  17. 编程题走迷宫_编程题——机器人走迷宫 (用C语言)
  18. Java基础知识面试题(2021最新)
  19. 人脸关键点检测综述(含论文、数据集、方法等)
  20. 问题 A: 找x--《算法笔记》

热门文章

  1. [python opencv 计算机视觉零基础到实战] 十、图片效果毛玻璃
  2. (六)python3 只需3小时带你轻松入门——循环
  3. pkpm板按弹性计算还是塑性_PKPM中的S\R验算显红原因分析
  4. php框架中uri路由机制,URI 路由 — CodeIgniter 3.1.5 中文手册|用户手册|用户指南|中文文档...
  5. python带通配符的字符串匹配_Bash技巧:实例介绍数个参数扩展表达式以处理字符串变量...
  6. 没有数学天赋是一种什么体验?
  7. 如何交到一个女朋友?
  8. 学过物理的人才能看懂的笑话,你能看明白几个?
  9. 遭央视曝光的“AI算命”,背后竟然隐藏了一个价值千亿的市场!?
  10. SVM支持向量机绘图