C++类static成员函数的调用
class中的静态成员函数作用再整个类的内部,对应类的所有实例是共享静态成员函数的,在调用静态成员函数的时候跟调用非静态成员函数是有区别的。另外,静态成员函数只能访问对应类内部的静态数据成员,否则会出现编译错误,下面举个例子来描述下。
class box{private:int _non_static;static int _static;public:int a(){return _non_static;}static int b(){//_non_static=0; 错误//静态成员函数不能访问非静态成员变量return _static;}static int f(){//a(); (不对,静态成员函数不能访问非静态成员函数)return b();}
};
int box::_static= 0;//static 静态成员变量可以在类的外部修改
int main(){box box1;box* pointer=&box1;box1.a();pointer->a();box::b();//类名::静态成员函数名return 0;
}
另外,对于非静态成员变量,需要用到类的对象来进行调用,这里就涉及到this指针的概念:
静态成员函数由于没有传递this 指针,所以静态成员函数只能访问static 成员,而不能访问非static 成员。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。换句话说,你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。例如,调用box.SetBoxState(9) <===> SetBoxState(&box, 9),this帮助完成了这一转换 。在成员函数的内部,我们可以直接使用调用该函数的对象的成员,而无需通过成员访问运算符来做到这一点,因为this所指的正是这个对象。任何对类成员的直接访问都被看成this的隐式使用。this的目的总是指向这个对象,所以this是一个常量指针,C++中不允许改变this中保存的地址。
当然类的static函数在类内声明、类外定义时,类内要写明static 类外则不能加static关键字,否则也会出现编译错误,比如:
class box{public:static int f();
};
/*错误的写法
static int box::f(){return 0;
}
*/
//正确的定义
int box::f(){return 0;
}
int main(){return 0;
}
C++类static成员函数的调用相关推荐
- static成员函数不能调用non-static成员函数
1 一般类静态成员函数不能调用非静态成员函数 2 static成员函数可以调用构造函数吗? 答案是肯定的,由于static成员函数没有this指针,所以一般static成员函数是不能访问non-sta ...
- Cpp 对象模型探索 / 类普通成员函数的调用方式
C++设计时有一个要求,类普通成员函数的调用性能要和全局函数差不多.所以编译器在处理类的普通成员函数的宗旨是将其当作全局函数来处理. 为了达到上述目的,编译器会对类的普通成员函数进行如下操作: 在函数 ...
- 在一个类的成员函数中调用另一个类的成员函数
假设你想在类A里调用类B的函数int f(x),两种办法: 1.class A::B 也就是说将B定义为A的父类, 这样你就可以自然的在A里面用f(x)了 2.class A { B B_ins; ...
- 浅析C++中的this指针 通过空指针(NULL)可以正确调用一些类的成员函数?
有下面的一个简单的类: class CNullPointCall { public: static void Test1(); void Test2(); void Test3 ...
- c++类的成员函数作回调函数为啥要声明为static的
简单说明 C++的类成员函数不能像普通函数那样用于回调,因为每个成员函数都需要有一个对象实例去调用它. 把成员函数作为回调函数,可以把该成员函数声明为静态成员函数,但这样做有一个缺点,就是会破坏类的结 ...
- C++类中的static数据成员,static成员函数
文章转自:http://www.cnblogs.com/gysm/archive/2011/09/16/2179277.html 版权归原作者. C++类中谈到static,我们可以在类中定义stat ...
- 类的成员函数指针和静态成员函数指针 调用成员函数***
C++提供static这个关键词对静态成员进行声明,静态成员函数和类的实例化无关,对于同一类来说,静态成员函数是所有类的对象共享的.而普通成员函数需要实例化才能调用,对于每一个实例来说,普通成员函数是 ...
- 函数指针调用类的成员函数
1 在每个被调用函数之前加上static, 可以使成员函数脱离对象信息单独存在,虽然它属于这个类,但是没有附带上对象信息,但是前提是,static成员函数不能使用对象的信息(成员和函数). 2 使用一 ...
- 处理菱形继承问题实现一个虚函数的覆盖及调用实现以下几个类的成员函数...
#include <iostream> #include <string> using namespace std; 1.实现以下几个类的成员函数 2.实现一个虚函数的覆盖及调 ...
最新文章
- N-Case 律师事务所管理系统安装与卸载说明
- 64 位来临:微软 Visual Studio 2022 预览版今夏发布,更多功能一览
- Kali安装magescan评估工具
- activiti dmn_端到端BPM(带有DMN标记)
- 大数据 -- 安装Hadoop-单机模式(1)
- XStream---Java对象和XML之间的转换器
- SQL-24 获取所有非manager员工当前的薪水情况,给出dept_no、emp_no以及salary ,当前表示to_date='9999-01-01'...
- HDU 3732 Ahui Writes Word
- Linux驱动-内核uart串口驱动分析
- OPNET网络仿真实验
- 2020年全国大学生数学建模竞赛应该如何准备
- 重新编译使用CMake的旧项目的问题处理
- 七公江湖烤翅防骗子—常见网络骗子骗术防御要点
- python 使用selenium下载文件时,chrome会提示是否下载多个文件(Download multiple files)
- 为什么宇宙年龄138亿年(哈勃常数的倒数),大小竟有930亿光年?
- 2020年第一波薅当当网羊毛的机会,别错过!
- esxi导出ovf报错
- 非功能性需求之性能需求分析
- 设计模式之状态模式详解(State Pattern)
- Unity 颜色查找表富文本颜色
热门文章
- 程序计数器和指令寄存器
- 华南农业大学OJ数据结构 六一儿童节C/C++(贪心算法)
- Failed to load property source from location 'classpath:/applica)
- 深入学习Spring(理论知识部分)
- 牛客网刷题-合并两个有序数组
- 地质灾害监测预警系统构成,功能,监测设备介绍
- 他从小就在家乡学木工,创办公司,实现人生价值
- Controller层实现页面跳转
- 北大本科转行计算机,北京教委公布本科跨省转学名单,两学霸为学计算机转出北大...
- leetcode 403.青蛙过河 C,C++超详细解释