类中的静态成员真是个让人爱恨交加的特性。我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动。 

静态类成员包括静态数据成员和静态函数成员两部分。 



一 静态数据成员: 



类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点: 



1.静态数据成员的定义。 

静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。 

其定义方式与全局变量相同。举例如下: 



xxx.h文件 

class base{ 

private: 

static const int _i;//声明,标准c++支持有序类型在类体中初始化,但vc6不支持。 

}; 



xxx.cpp文件 

const int base::_i=10;//定义(初始化)时不受private和protected访问限制. 



注:不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的错误。即使加上#ifndef #define #endif或者#pragma once也不行。 



2.静态数据成员被 类 的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员。举例如下: 

class base{ 

public : 

static int _num;//声明 

}; 

int base::_num=0;//静态数据成员的真正定义 



class derived:public base{ 

}; 



main() 



base a; 

derived b; 

a._num++; 

cout<<"base class static data number _num is"<<a._num<<endl; 

b._num++; 

cout<<"derived class static data number _num is"<<b._num<<endl; 



// 结果为1,2;可见派生类与基类共用一个静态数据成员。 



3.静态数据成员可以成为成员函数的可选参数,而普通数据成员则不可以。举例如下: 

class base{ 

public : 

static int _staticVar; 

int _var; 

void foo1(int i=_staticVar);//正确,_staticVar为静态数据成员 

void foo2(int i=_var);//错误,_var为普通数据成员 

}; 



4.★静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为 所属类类型的 指针或引用。举例如下: 



class base{ 

public : 

static base _object1;//正确,静态数据成员 

base _object2;//错误 

base *pObject;//正确,指针 

base &mObject;//正确,引用 

}; 



5.★这个特性,我不知道是属于标准c++中的特性,还是vc6自己的特性。 

静态数据成员的值在const成员函数中可以被合法的改变。举例如下: 



class base{ 

public: 

base(){_i=0;_val=0;} 



mutable int _i; 

static int _staticVal; 

int _val; 

void test() const{//const 成员函数 



_i++;//正确,mutable数据成员 

_staticVal++;//正确,static数据成员 

_val++;//错误 





}; 

int base::_staticVal=0; 



二,静态成员函数 

静态成员函数没有什么太多好讲的。 



1.静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存。举例如下: 

class base{ 

static int func1(); 

int func2(); 

}; 



int (*pf1)()=&base::func1;//普通的函数指针 

int (base::*pf2)()=&base::func2;//成员函数指针 





2.静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。 



3.静态成员函数不可以同时声明为 virtual、const、volatile函数。举例如下: 

class base{ 

virtual static void func1();//错误 

static void func2() const;//错误 

static void func3() volatile;//错误 

}; 





最后要说的一点是,静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。

C++静态成员函数小结的更多相关文章

  1. C++静态成员函数小结(转)

    类中的静态成员真是个让人爱恨交加的特性.我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动. 静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: 类体中 ...

  2. C++静态成员函数小结 [转]

    类中的静态成员真是个让人爱恨交加的特性.我决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动. 静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: 类体中 ...

  3. C++静态成员变量和静态成员函数小结

    静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员.和其他数据成员一样,静态数据成员也遵守pub ...

  4. C++ static 静态变量&静态成员函数

    .h文件中定义 static变量后,如 static QTcpSocket * socket; 那么一定要在.cpp中 构造函数的外面将其初始化为 QTcpSocket * Cfiletransfer ...

  5. C++解析(14):静态成员变量与静态成员函数

    0.目录 1.静态成员变量 2.静态成员函数 3.小结 1.静态成员变量 成员变量的回顾: 通过对象名能够访问public成员变量 每个对象的成员变量都是专属的 成员变量不能在对象之间共享 新的需求: ...

  6. C++中的静态成员函数

    1,问完成的需求: 1,统计在程序运行期间某个类的对象数目: 1,静态成员变量满足了这个需求: 2,保证程序的安全性(不能使用全局变量): 3,随时可以获取当前对象的数目: 1,有没有什么特别的地方或 ...

  7. C++ - 静态成员函数

    c++中静态成员函数属于整个类, 而不是某个对象,因此不需要创建对象就可以访问 1.出现在类体外的函数定义不能指定关键字static:2.静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访 ...

  8. C++ 类的静态成员及静态成员函数

    对象与对象之间的成员变量是相互独立的.要想共用数据,则需要使用静态成员和静态方法. 只要在类中声明静态成员变量,即使不定义对象,也可以为静态成员变量分配空间,进而可以使用静态成员变量.(因为静态成员变 ...

  9. 静态成员函数(面向对象的static关键字)

    静态成员函数 与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是某一个类的具体对象服务.静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分.普通的成员函数一般 ...

随机推荐

  1. vue iView table中render渲染

    <template> <div class="srm-page"> <el-form ref="form" :model=&quo ...

  2. 1094 谷歌的招聘 (20 分)C语言

    2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘.内容超级简单,就是一个以 .com 结尾的网址,而前面的网址是一个 10 位素数,这个素数是自然常数 e ...

  3. Stripe支付对接

    一.由于文档丢失原因,我就直接上代码了. 这个Stripe支付可以支持多个币种,我下面就采用"HDK"来参照支付先上一个支付效果图  提示:先上代码,在说明博主自己理解的流程. 一 ...

  4. OAuth2.0概念以及实现思路简介

    一.什么是OAuth? OAuth是一个授权规范,可以使A应用在受限的情况下访问B应用中用户的资源(前提是经过了该用户的授权,而A应用并不需要也无法知道用户在B应用中的账号和密码),资源通常以REST ...

  5. Spring Boot2 系列教程(三十一)Spring Boot 构建 RESTful 风格应用

    RESTful ,到现在相信已经没人不知道这个东西了吧!关于 RESTful 的概念,我这里就不做过多介绍了,传统的 Struts 对 RESTful 支持不够友好 ,但是 SpringMVC 对于 ...

  6. ATOM插件及快捷键

    xml-formatter :https://atom.io/packages/xml-formatter xml格式化工具 SHIFT-CTRL-X:快速格式化 SHIFT-CTRL-M:移除换行符 ...

  7. ST表竞赛模板

    void RMQ_init(){//ST表的创建模板 ;i<n;i++) d[i][]=mo[i]; ;(<<j)<=n;j++) ;i+(<<j)-<n;i ...

  8. Spring学习记录1——IoC容器

    IoC容器 1.1  IoC概述 Ioc(Inverse of Control,控制反转)是Spring容器的内核.对于软件来说,即某一接口具体实现类的选择控制权从调用类中移除,转交给第三方决定,即由 ...

  9. C# HttpWebRequest传递参数多种方式混合使用

    在做CS调用第三方接口的时候遇到了这样的一个问题,通过PSOTman调试需要分别在parmas.Headers.Body里面同时传递参数.在网上查询了很多资料,以此来记录一下开发脱坑历程. POSTm ...

  10. 使用RobotFramework的JavaRemoteLibrary

    终于被迫使用了Java的远程接口库(为了同时使用Java和python的用例库,且为了在pybot下跑速度能快一些),路途比实际想的要坎坷,记录下来. 远程库的原理在前边一篇文章中记录过: http: ...