在类定义中,它的成员(包括数据成员和 成员函数)可以用关键字static声明为静 态的,这些成员称为静态成员
静态成员的特性:
• 不管这个类创建了多少个对象,静态成员只有一个拷贝,这个拷贝被所有属于这个类的
对象共享
静态成员包括:
• 静态数据成员
• 静态成员函数
在一个类中,若将一个数据成员声明为 static,这种成员称为静态数据成员。
(静态数据成员在类内声明,在类外定 义)
与一般的数据成员不同,无论建立了多 少个对象,都只有一个静态数据的拷贝
可以认为该静态数据是属于该类的,而 不是具体的属于某一个对象
 
说明:
• 静态数据成员属于类(准确地说,是属于类中 一个对象集合),而不像普通数据成员那样属 于某一对象,
因此可以使用“类名::”访问静态 的数据成员。但也可以通过“对象名.”访问
• 静态数据成员不能在类中进行初始化,因为在 类中不给它分配内存空间,必须在类外的其它 地方为它提供定义。一般在main() 开始之前、类的声明之后的特殊地带为它提供定义 和初始化。缺省时,静态成员初始为0
 
静态成员函数可以在类内定义。也可以在类内声明,类外定义。在类外定义时,不要用 static前缀
• 编译系统将静态成员函数限定为内部连接, 也就是说,与现行文件相连接的其它文件中 的同名函数不会与该函数发生冲突,维护了 该函数使用的安全性,这是使用静态成员函 数的一个原因
• 使用静态成员函数的另一个原因是,可以用 它在建立任何对象之前处理静态数据成员, 这是普通成员函数不能实现的功能
 
在一般的成员函数中都隐含有一个this指 针,用来指向对象自身,而在静态成员函数 中没有this指针,因为它不与特定的对象相 联系,调用时使用:
类名::静态成员函数名() 如:SmallCat::totalDisp(),当然使用:
对象.静态成员函数名() 也是正确的。如:w1.totalDisp()
• 一般而言,静态成员函数不能访问类中的非静态成员
 
继承
基类和其派生类共享该基类的静态成员变量内存!
1.   父类的static变量和函数在派生类中依然可用,但是受访问性控制(比如,父类的private域中的就不可访问),而且对static变量来说,派生类和父类中的static变量是共用空间的,这点在利用static变量进行引用计数的时候要特别注意。   
2.   static函数没有“虚函数”一说。因为static函数实际上是“加上了访问控制的全局函数”,全局函数哪来的什么虚函数?   
3.   派生类的friend函数可以访问派生类本身的一切变量,包括从父类继承下来的protected域中的变量。但是对父类来说,他并不是friend的。
#include <iostream>
using namespace std;
class Base
{
public:
   static int a;
   static void Fun( )
   {
       cout<<"Base fun()!"<<endl;
   }
};
int Base::a=1000;
class Derived:public Base
{
public:
    static void Fun()
   {
       cout<<"Derived fun()!"<<endl;
   }
};
int main(void)
{
    cout<<Derived::a<<endl;
    Derived d;
    d.Fun();
    Base b = (Base) d;
    b.Fun();
    return 0;
}
1000
Derived fun()!
Base fun()!
 
测试代码会发现Base、Derived类中的 a 值相等,然后查看地址发现地址也相等。所以父类子类指向是同一个全局数据区的static变量。如果定义 int Derived::a=200; 会出现编译错误。
不能被继承。
子类可以访问父类的static变量,但受访问控制(若父类中的static是private就无法访问)
子类和父类的static变量是同一变量,共享同一存储空间。
而继承关系,子类和父类是分别有自己的存储空间的。
 
#include<iostream>
using namespace std;  
int cnt=1;  
  
void f(){  
    static int test = cnt;  
    cout<<test<<endl;  
    cnt++;  
}  
  
int main(){  
    f();  
    f();  
    f();  
    cout<<cnt<<endl;  
    return 0;  
}
1
1
1
4
但是C++规定,局部static变量只会初始化一次!所以第一个程序中后面调用两次f()都不会初始化test。
 

静态成员 static 能被继承吗的更多相关文章

  1. 拷贝构造和拷贝赋值、静态成员(static)、成员指针、操作符重载(day06)

    十七 拷贝构造和拷贝赋值 浅拷贝和深拷贝 )如果一个类中包含指针形式的成员变量,缺省的拷贝构造函数只是复制了指针变量的本身,而没有复制指针所指向的内容,这种拷贝方式称为浅拷贝. )浅拷贝将导致不同对象 ...

  2. JAVA 静态成员 static

    static关键字 一.作用:是一个修饰符,用于修饰成员(成员变量,成员方法)1.被static 修饰后的成员变量只有一份2.当成员被static修饰之后,多了一种访问方式,除了可以被对象调用之外还可 ...

  3. 静态成员static

    静态成员分为静态数据成员和静态函数成员: 静态数据成员: 1.用关键字static来声明: 2.该类的所有对象维护改成员的同一份拷贝:(就是说所有的对象看到的是同一份数据) 3.必须在类外定义和初始化 ...

  4. 类的static成员变量和成员函数能被继承吗

    1.   父类的static变量和函数在派生类中依然可用,但是受访问性控制(比如,父类的private域中的就不可访问),而且对static变量来说,派生类和父类中的static变量是共用空间的,这点 ...

  5. Java中,包的概念、常量、静态成员、继承

    新建包:左上角-新建-包 命名规则(通常从大到小,方便整合不容易冲突)  例如:com.itnba.maya.test package必须在最顶行,之前不能再有其他代码 使用包: 快捷方式:使用包中的 ...

  6. C# 之 static的用法详解

    有的东西你天天在用,但未必就代表你真正了解它,正如我之前所了解的 static . 一.静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量. ...

  7. C# static的用法详解

    C#   static的用法详解 有的东西你天天在用,但未必就代表你真正了解它,正如我之前所了解的 static . 一.静态类 静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 n ...

  8. [java基础]java中static关键字

    1.static概念 static是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序 ...

  9. 关键字static和this

    1.this关键字 this:代表当前对象,就是代表所在函数所属类的引用.哪个对象调用了this所在的函数,this就代表哪个对象. this关键字也可以用于在构造函数中调用其他构造函数,此时要注意, ...

随机推荐

  1. ssh登录失败的常见问题分析

    操作系统为了安全,一般只允许普通用户使用public_key登录,这时如果以root用户登录,就会出现各种错误.下面是常见的错误及解决方案. Permission denied (publickey) ...

  2. Sublime 代码段设置

    # Sublime 代码段 > 依次找到:Tools -> Developer -> New Snippet,默认代码段配置文件如下: <snippet><cont ...

  3. centos为用户添加sudo功能

    su chmod a+w /etc/sudoers vim /etc/sudoers [找到root ALL=(ALL) ALL这行] 复制出新的一行,并且将root改为daniel(当前用户名) c ...

  4. upc组队赛5 Ingenious Lottery Tickets【排序】

    Ingenious Lottery Tickets 题目描述 Your friend Superstitious Stanley is always getting himself into trou ...

  5. Linux应急响应基础

    文件排查 敏感目录文件分析 tmp目录 命令目录 /usr/bin /usr/sbin 开机启动项 /etc/init.d /etc/init.d是/etc/rc.d/init.d的软链接 文件时间 ...

  6. javafx实现读者文摘上的文章预览及下载

    功能设计: 1.实现读者文章的预览及下载 (实现了单击预览,双击下载) 2.实现文章查找 (实现了通过文章名查找(关键字)或者文章期数或年份(或者年份加期数)) 实现步骤: 首先是数据库设计: 数据库 ...

  7. css图片文字

    1.浏览器是把 html 和 css 一起下载并执行的,计算机里把两件事情同时做  异步加载.计算机中的同步异步和我们生活中的正好是相反的. 补充: 同步,是所有的操作都做完,才返回给用户结果.即写完 ...

  8. VS2013+Opencv3.3配置教程

    转载自: https://blog.csdn.net/u014797226/article/details/78283873?locationNum=5&fps=1 参考博文1: 操作环境: ...

  9. Codeforces Round #556 CF1149D Abandoning Roads

    这道题并不简单,要得出几个结论之后才可以做.首先就是根据Kruskal求最小生成树的过程,短边是首选的,那么对于这道题也是,我们先做一次直选短边的最小生成树这样会形成多个联通块,这些联通块内部由短边相 ...

  10. mongodb的学习 (3)

    聚合函数 - 添加基础数据:db.local.save({contry:'中国',name:'小明',score:77});db.local.save({contry:'中国',name:'小红',s ...