C++静态成员函数小结

C++静态成员函数小结

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

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

一 静态数据成员:

类体中的数据成员的声明前加上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++静态成员函数小结(转)

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

  2. C++ static静态成员函数小结

    在C++的类中,static 除了可以声明静态成员变量,还可以声明静态成员函数.普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员. 1.静态成员函数可以通过类直接调 ...

  3. C++中的友元函数、static函数、常函数小结(理论篇)

     友元函数 一个常规的成员函数声明描述了三件在逻辑上相互不同的事情 1.  该函数能访问类声明的私用部分 2.  该函数位于类的作用域之中 3.  该函数必须经由一个对象去激活(有一个this指针 ...

  4. 静态数据成员和静态成员函数

    转载自:https://blog.csdn.net/computer_liuyun/article/details/29235111 c++中的static静态数据成员和静态成员函数应该是让大家比较头 ...

  5. C++深度解析 类中的函数重载 -- 全局函数,普通成员函数,静态成员函数(28)

    C++深度解析 类中的函数重载 -- 全局函数,普通成员函数,静态成员函数(28) 函数重载的回顾 函数重载的本质为相互独立的不同函数 C++中通过函数名和函数参数确定函数调用 无法直接通过函数名得到 ...

  6. 26-类的静态成员函数

    注:博客中内容主要来自<狄泰软件学院>,博客仅当私人笔记使用. 测试环境:Ubuntu 10.10 GCC版本:9.2.0 一.未完成的需求 1)统计在程序运行期间某个类的对象数目 2)保 ...

  7. c++静态成员函数好处

    静态成员函数主要为了调用方便,不需要生成对象就能调用. 比如: class X { public:void MethodA();static void MethodB(); } 此时MethodB可以 ...

  8. 友元函数、类的非静态成员函数、静态成员函数的区别

    类中申明的函数相对于类来说有三层意思: 1.有this指针 2.函数在类的作用区域中 3.可以访问类中私有部分 4.可以被继承 非静态成员函数具有1234 静态成员函数具有234 友元函数具有3 静态 ...

  9. 静态成员函数不能采用const修饰的原因

    静态成员函数不能用const修饰 ,也不能存取nonstatic数据 C++中静态成员函数不能用const修饰的原因: static在c++中的第五种含义:用static修饰不访问非静态数据成员的类成 ...

最新文章

  1. RedHat的yum源修改为CentOS的yum源
  2. 【PAT乙级】1061 判断题 (15 分)
  3. 蓝桥杯 平面切分(欧拉定理)
  4. Power BI 将商业智能数据转换为数据理解
  5. 还在一个个复制数据?——今天教你控制台爬数据!
  6. 微课|《Python编程基础与案例集锦(中学版)》第5章例题讲解(1)
  7. linux 异步信号的同步处理方式
  8. 0004-EMC电磁兼容RE辐射超标整改策略-学习笔记
  9. 关于手机天气应用中的城市搜索的联想查找方式优化
  10. 名帖288 董其昌 行书《岳阳楼记》
  11. 单片机通用配置(基于STC12C5A60S2)
  12. 洛谷 P2708 硬币翻转 题解
  13. 9.16nbsp;瑞晟软件笔试
  14. GPIO工作模式详解(含Arduino实例)
  15. struts2中如何使用servlet
  16. docker-registry登录认证
  17. 使用GeoServer 发布切图服务
  18. 花点时间记住scrollTop、clientHeight、offsetTop、scrollHeight
  19. Prometheus服务发现+Grafana炫酷的界面展示
  20. R语言ggplot2 | 循环画图及导出

热门文章

  1. 关于对 NUMA 理解(学习笔记,便于以后查阅)
  2. ajax 请求超过了5s 还没有返回 的话 就自动取消
  3. Jan 13 - Bulls and Cows; String; HashSet;
  4. [iOS]关于零基础学习iOS开发的学习方法总结
  5. 同是iPad退差价却不同?
  6. MySQL学习笔记(六)MySQL8.0 配置笔记
  7. 你必须知道如何回答的五大计算机安全问题!
  8. WPF 4 开发Windows 7 跳转列表(JumpList)
  9. 吴恩达机器学习笔记_第三周
  10. 人工智能和机器人将成为数据中心最佳“伴侣”