在类定义中,它的成员(包括数据成员和 成员函数)可以用关键字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. client-go获取k8s集群内部连接,实现deployment的增删改查

    一开始写了一个client-java版本的,但是java放在k8s集群上跑需要装jvm而且java的包比较大,client-go版本更适合主机端,下面是整个实现 说明:k8s官方维护的客户端库只有go ...

  2. Portal for ArcGIS启动失败,无法访问任何门户计算机,请联系您的系统管理员。

    1.如题,打开Portal门户的时候,发现: 2.检查日志发现Portal for ArcGIS没启动,日志地址:D:\Program Files\ArcGIS\Portal\framework\se ...

  3. C++——迭代器

    除了每个容器定义的迭代器外,iterator库内还定义了其他的迭代器. 1.插入迭代器:向容器中插入元素 1.1 back_inserter 1.2 front_inserter 1.3 insert ...

  4. Jmeter beanshell断言 org.json.jar包下载

    链接:https://pan.baidu.com/s/1O01ODjlKyqmz2NyDT0MCww 提取码:a5va 欢迎关注微信公众号:软件测试汪,qq技术交流群:809111560

  5. Normal Equation Algorithm

    和梯度下降法一样,Normal Equation(正规方程法)算法也是一种线性回归算法(Linear Regression Algorithm).与梯度下降法通过一步步计算来逐步靠近最佳θ值不同,No ...

  6. promise的基本用法

    // Promise 对象,可以保存状态 //Promise 第一步 // 异步代码 写在 Promise的函数中 第二步 const promise = new Promise((resolve, ...

  7. Data structure alignment by binary operation

    在寫C的過程中,我們會很自然地以為,我連續宣告一堆大小不一的char array. 經過Complier之後這些char array未必是連續擺放.至於為什麼就要談到我們今天的主角了alignment ...

  8. Linux安装配置Nginx服务器

    如有需要可以加我Q群[308742428]大家一起讨论技术,有偿服务. 后面会不定时为大家更新文章,敬请期待. 喜欢的朋友可以关注下. 前言 今天搭建nginx服务器,来访问静态资源文件. Nginx ...

  9. Android中使用VideoView 播放视频

    VideoView一般结合MediaController类使用,它会提供一个友好的图形界面,通过该界面可以控制视频的播放 package com.test.videoview; import andr ...

  10. js转义符

    \0 :null(\u0000) \b :后退键(\u0008) \f :换页符(\u000C) \n :换行符(\u000A) \r :回车键(\u000D) \t :制表符(\u0009) \v ...