在类定义中,它的成员(包括数据成员和 成员函数)可以用关键字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. asp.net 随笔

    20190625 网站发布后,添加文件,必须重启iis的应用程序池和网站才能使用添加的文件.

  2. leetcode python反转字符串中的单词

    # Leetcode 557 反转字符串中的单词III### 题目描述 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. **示例1:** 输入: "L ...

  3. tire 树入门

    博客: 模板: 前缀是否出现: /* trie tree的储存方式:将字母储存在边上,边的节点连接与它相连的字母 trie[rt][x]=tot:rt是上个节点编号,x是字母,tot是下个节点编号 * ...

  4. 【目录】asp.net core系列篇

    随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...

  5. python之字符串中插入变量

    方法一:也是 比较好用的,功能教齐全 s="{name} is {sex}" print(s.format(name="zzy",sex="girl& ...

  6. css3新增(圆角边框(border-radius),盒子阴影(box-shadow),文字阴影(text-shadow),背景缩放(background-size))

    1.圆角边框  border-radius border-radius 属性用于设置元素的外边框圆角 语法:border-radius:length; 参数值可以是数值 或者 百分比 的形式 正方形, ...

  7. JNI Hello World

    1.什么是JNI:               JNI(Java Native Interface):java本地开发接口               JNI是一个协议,这个协议用来沟通java代码和 ...

  8. centos6.5大于2T容量硬盘分区、格式化、挂载!

    一.  超过2T容量硬盘使用parted创建分区 1.fdisk l(查看需要分区的硬盘盘符如:sda) 2.parted /dev/sda 3.rm 1 4.mklabel gpt(超过2T磁盘格式 ...

  9. 矩阵的 Frobenius 范数及其求偏导法则

    cr:http://blog.csdn.net/txwh0820/article/details/46392293 一.矩阵的迹求导法则   1. 复杂矩阵问题求导方法:可以从小到大,从scalar到 ...

  10. 1、Spring MVC的web.xml配置详解(转)

    版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u010796790 1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilt ...