静态数据成员和静态函数成员_小凡1991的博客-程序员秘密

技术标签: C++  static关键字  静态成员变量  静态成员函数  笔试/面试积累  

静态类成员包括静态数据成员和静态函数成员两部分。
  • 一 、静态数据成员: 
类体中的数据成员的声明前加上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{ 
}; 
void 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.静态数据成员的值在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;//错误 
}; 


最后要说的一点是,静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_20265495/article/details/51274811

智能推荐

使用Docker Compose容器化Ruby on Rails应用程序进行开发_cukw6666的博客-程序员秘密

介绍 (Introduction)If you are actively developing an application, using Docker can simplify your workflow and the process of deploying your application to production. Working with containers in develo...

MySQL面试------收藏篇_奋斗小亮的博客-程序员秘密

学习链接:100道MySQL常见面试题总结写给 Java 程序员的 24 个MySQL面试题,拿走不谢!写给 Java 程序员的 24 个MySQL面试题,拿走不谢! 转MySQL经典面试题玩转Mysql系列 - 第24篇:如何正确的使用索引?...

FC-SAN、IP-SAN(iscsi)、NAS区别_weixin_34279061的博客-程序员秘密

FC-SAN和IP-SAN两者的优缺点分别是什么?一般来说,企业在面临iSCSI SAN存储解决方案时,多半喜欢拿FC SAN及NAS与其做一番比较。在此先就FC与iSCSI做一比较,基本两者同属走Block协议的SAN架构,只不过前者透过光纤,后者藉由IP传输数据罢了,而两者在管理及应用上也大同小异,其间只不过优劣好坏的差异。至于SAN与NAS的差异而言,笔者走访了...

说说高斯过程回归_weixin_34008784的博客-程序员秘密

说说高斯过程回归作者介绍:新浪微博ID @妖僧老冯, 9月将赴南京大学(直博生),方向是机器学习与数据挖掘编者:小便和作者打过几次交道,一直以为是他是已“修成正果”的某某博士,便“毕恭毕敬”地去邀请他写篇牛文。细聊之后才得知小伙子原来是90后,9月份才博士入学。这篇文章对GP进行了深度科普,数学公式是有一些的,但耐心读读,都不是问题的。高斯过程是机器学习领域一个基础的方法,同时又和其他方法...

随便推点

Python爬虫实战+数据分析+数据可视化(美团美食信息)_美团数据可视化分析_专业的小马哥的博客-程序员秘密

一、爬虫部分爬虫说明:1、本爬虫是以面向对象的方式进行代码架构的2、本爬虫爬取的数据存入到MongoDB数据库中3、爬虫代码中有详细注释4、爬虫爬取的美食是以无锡为例代码展示import jsonimport reimport timefrom pymongo import MongoClientimport requestsfrom lxml import htmlclass MeituanSpider(): def __init__(self): #

java的基本特征_狗贼爱逃跑的博客-程序员秘密

java的基本特征1.简单Java最初是为对家用电器进行集成控制而设计的一种语言,因此它必须简单明了。Java语言的简单性主要体现在以下三个方面:Java的风格类似于C++,因而C++程序员是非常熟悉的。从某种意义上讲,Java语言是C及C++语言的一个变种,因此,C++程序员可以很快就掌握Java编程技术。Java摒弃了C++中容易引发程序错误的地方,如指针和内存管理。Ja...

node-webkit中使用sqlite3(含编译教程)_node sqlite3 重新编译_carfge的博客-程序员秘密

node-webkit中使用sqlite3sqlite3的官方文档提到:nodejs和node-webkit的ABI不同,所以通过npm install sqlite3下载的sqlite3是无法使用的,需要重新编译。windows编译:以LTS版本(0.14.7)为例一、所需编译环境安装Python 2.7.14(不支持3.x版本)并设置好环境变量,下载地址:https://www.python.org/downloads/ 安装最新的nodejs+npm 下载地址:https...

UVA 1630 Folding_DS-K的博客-程序员秘密

题目链接:http://acm.hust.edu.cn/vjudge/problem/51191题意:给一个字符串,相同部分可以折叠,折叠可以嵌套。求最短长度的一种折叠方法。括号和数字的长度也要考虑进去。思路:对于一个字符串,有三种策略:1、不折叠。2、本身可以折叠。3、分为两个区间子问题。#include #include #include #inclu

推荐文章

热门文章

相关标签