在类定义中,它的成员(包括数据成员和 成员函数)可以用关键字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. 如何用python读写CSV 格式文件

    工作中经常会碰到读写CSV文件的情况.记录下,方便自己以后查询并与大家一起分享: 写CSV文件方法一: import csv          #导入CSV with open("D:\eg ...

  2. Linux C遇到的常见错误

    此随笔主要记录一些Linux C遇到的常见错误,便于debug问题或自己编程时,避免发生类似的错误或问题,后续会持续更新.... 1.内存泄露问题 内存泄露是由于内存没有释放导致程序耗内存一直增大,引 ...

  3. #include和前置声明(forward declaration)

    #include和前置声明(forward declaration) 1.    当不需要调用类的实现时,包括constructor,copy constructor,assignment opera ...

  4. Windows XP 下如何使用Qt Creator中的Git版本控制功能

     原文地址:http://www.qtcn.org/bbs/simple/?t16960.html Qt Creator是针对Qt应用开发平台专门设计的IDE开发工具,集成了很多功能,分别有win ...

  5. overflow:hidden失效

    overflow:hidden失效 为了页面的健壮性,我们常常需要使用overflow:hidden.有时候是为了防止布局被撑开,有时候是为了配合其它规则实现文字截断,还有时候纯粹是为了创建块级上下文 ...

  6. mysql 日期和时间戳互换

    1.日期转时间戳 UNIX_TIMESTAMP('2019-06-25 12:30:00') 2.时间戳转日期 FROM_UNIXTIME(1545711900,'%Y-%m-%d') 3.  DAT ...

  7. springboot整合netty,多种启动netty的方式,展现bean得多种启动方法

    首先讲解下,spring中初始化加载问题: 很多时候,我们自己写的线程池,还有bean对象,还有其他的服务类,都可以通过,相关注解进行交给spring去管理,那么我们如何让nettyserver初始化 ...

  8. Stm32CubeMX5 创建LED控制工程 - 基于stmf051k8u6

    一. 创建一个控制LED的工程 1. 安装好 Stm32CubeMX5 后 打开软件 选择 “ File-->  New Project...” 创建一个新工程 2. 之后会出现一个选择芯片的窗 ...

  9. javaSE Comparable接口中的compareTo()方法

    我们都知道,要对自建对象按照一定规则进行排序的话,要求自建对象实现Comparable接口,并重写compareTo() 方法,但compareTo() 方法的释义却不是那么容易搞清楚,下面举例进行阐 ...

  10. C stdarg.h

    参考:https://www.cnblogs.com/bettercoder/p/3488299.html    博主:运动和行动 va_start宏,获取可变参数列表的第一个参数的地址(list是类 ...