C++提供static这个关键词对静态成员进行声明,静态成员函数和类的实例化无关,对于同一类来说,静态成员函数是所有类的对象共享的。而普通成员函数需要实例化才能调用,对于每一个实例来说,普通成员函数是自己独有的。

#include<iostream>
class Person
{
public:void ordinaryfunc();//声明一个普通成员函数void static staticfunc();//声明一个静态成员函数
};
void Person::ordinaryfunc()
{std::cout<<"from ordinary"<<std::endl;
}
void Person::staticfunc()//注意定义静态函数不需要再带static
{    std::cout<<"from staticfunc"<<std::endl;
}
void main()
{Person p;p.ordinaryfunc();            //对象调用成员函数函数p.staticfunc();                //对象调用静态成员函数//Person::ordinaryfunc();Person::staticfunc();        //类调用类静态成员函数
}

1.普通成员函数:对象可以调用,静态成员函数:对象和类都可以调用

在未实例化就调用普通成员函数可以看到在VS2013报了一个error:非静态成员函数的非法调用,所以普通成员函数要调用需要实例化。

Person::staticfunc();//未实例化直接调用静态成员函数
成功调用静态成员函数

2.通过函数指针调用:成员函数

公有成员函数可以通过函数指针进行调用,调用成员函数也是需要实例化的。

函数指针调用普通成员函数:

void(Person::*pord)() = &Person::ordinaryfunc;
Person P1;
(P1.*pord)();//通过函数指针调用成员函数

(1)首先是函数指针的定义把函数名挖掉替换成函数指针的变量名:void(*函数指针变量名)();

(2)但类的普通成员函数指针需要带上类名,并且在后面需要取类的地址:&Person::ordinaryfunc;

(3)在调用时也需要实例化,相当于每一个实例对应了自己的函数指针。

每个实例调用自己的函数指针:

Person P1,P2;
(P1.*pord)();//通过函数指针调用成员函数
(P2.*pord)();

3.函数指针调用:静态成员函数:

(1)调用静态函数指针是不需要实例化的

(2)只需要指定是哪一个类的静态函数

void(*psta)() = Person::staticfunc;
void(*psta)() = &Person::staticfunc;
psta();

eg:

#include<iostream>
class Person
{
public:void ordinaryfunc();//声明一个普通成员函数void static staticfunc();//声明一个静态成员函数
};
void Person::ordinaryfunc()
{std::cout << "from ordinary" << std::endl;
}
void Person::staticfunc()//注意定义静态函数不需要再带static
{std::cout << "from staticfunc" << std::endl;
}int main()
{
#if 1std::cout << "**********************成员函数和静态成员函数、函数指针,C++:普通函数、静态函数(类函数),python:普通接口、static method、class method***************" << endl;Person p;p.ordinaryfunc();p.staticfunc();//Person::ordinaryfunc();Person::staticfunc();void(Person::*pord)() = &Person::ordinaryfunc;//void(Person::*pord)() = Person::ordinaryfunc;   //Error C3867   'Person::ordinaryfunc': non - standard syntax; use '&' to create a pointer to memberPerson P1;(P1.*pord)();//通过函数指针调用成员函数void(*psta)() = Person::staticfunc;//void(*psta)() = &Person::staticfunc;psta();#endif
}

类的成员函数指针和静态成员函数指针 调用成员函数***相关推荐

  1. php类和自定义函数实例,php中三个调用用户自定义函数实例详解

    在php中调有自定义函数,经常会用到call_user_func函数.call_user_func_array函数.call_user_func函数. 1,call_user_func函数类似于一种特 ...

  2. so库调用java函数_linux下so动态库调用主程序函数

    linux下动态库 今天无意间发现在linux下share object(dynamic library)中的函数竟然可以不通过回调的方式直接访问主程序中的函数,瞬间颠覆以前对于动态库的观念. 1.如 ...

  3. Matlab自学笔记四:调用函数基本方法、传递参数、函数工作区、命令语法、调用匿名函数

    1.调用函数的基本方法 题目:创建函数y=x²+x+1 首先,使用上一篇的创建函数文件的方法(推荐先看上一篇:Matlab创建函数文件.函数语法定义.匿名函数.多元函数.局部函数等知识串联理解),创建 ...

  4. 23.C++类对象的指针为空时,调用成员函数不会挂掉

    最近工作的时候遇到了一个现象,当通过C++类对象的空指针调用没有使用this指针的成员函数时,不会出现段错误 测试代码 #include <iostream>using namespace ...

  5. onclick如何调用含参函数_在 golang 中如何调用私有函数(绑定隐藏的标识符)

    名字在 golang 中的重要性和在其他任何一种语言是一样的.他们甚至含有语义的作用:在一个包的外部某个名字的可见性是由这个名字首字母是否是大写来决定的. 有时为了更好的组织代码或者在其他包使用某些隐 ...

  6. c语言中比较两个数组函数,输入两个数组,调用large函数比较,计数,输出统计结果...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include void main() { int large(int x,int y); int a[10], b[10], i, n=0, m=0, ...

  7. c语言两个数组比较大小函数,输入两个数组,调用large函数比较,计数,输出统计结果...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include void main() { int large(int x,int y); int a[10], b[10], i, n=0, m=0, ...

  8. [C++] 类的静态成员 (静态数据成员 和 静态成员函数)

    目录 一.声明静态成员: 二.定义静态成员: 三.使用类的静态成员: 四.静态成员类内初始化: 五.静态成员与普通成员的区别: 六.案例代码: 类内的静态成员包括: 静态数据成员 和 静态成员函数. ...

  9. 【C++】类和对象【中篇】--C++六个默认成员函数以及const成员函数

    文章目录 一.类的6个默认成员函数 二.构造函数 1.概念 2.特性 2.1特征分析--自动生成 2.2.特征分析--选择处理 2.3特征分析--默认构造 3.C++11补丁--缺省值 三.析构函数 ...

  10. C++(12)--函数基础:按值传递、传递数组、函数指针

    模块化编程--函数 1. 函数基本知识 2. 函数的参数 2.1 按值传递机制(小议按引用传递) 2.2 使用数组做函数参数(用户头文件,const的防改) 2.3 使用二维数组作为函数的参数 2.4 ...

最新文章

  1. SICP 习题 (2.7) 解题总结 : 定义区间数据结构
  2. c与python的区别-c 跟 python的区别有哪些
  3. 线性代数学习笔记(几何版)
  4. 快手QoE指标设计的分析初探
  5. shuffle理解【增加模型的泛化能力】
  6. 【Elasticsearch】Curator 从入门到实战
  7. 利用 Webpack 实现小程序多项目管理
  8. 关于MATLAB处理大数据坐标文件
  9. 《社会调查数据管理——基于Stata 14管理CGSS数据》一导读
  10. WPS简历模板的图标怎么修改_160套个人求职简历模板精美套装,修改内容直接套用...
  11. mysql根据出生年月计算年龄
  12. 强化学习中 on-policy与off-policy 的理解;如何区分on-policy 与 off-policy;RL更新策略、policy结构总结
  13. 牛散村 : 强行平仓的后果是什么?
  14. Redit集群搭建-Sentinel模式搭建
  15. 上传文件的几种主要方法。
  16. 操作系统安装前的操心
  17. 初识BFS POJ-3278 Catch That Cow FZU-2285 迷宫寻宝
  18. HTML img标签识别base64图片格式
  19. Spark Label 可以显示多行,但 MX Label 不可以。
  20. 让集成的Intel82845g支持1440x900

热门文章

  1. spring简单教程
  2. IDEA上传项目到GitHub
  3. TMC4671基于硬件FOC伺服电机控制芯片适应BLDC/PMSM、两相步进、直流有刷、音圈电机
  4. long + ulong_ULONG_MAX常数,带C ++示例
  5. List、Collections
  6. 怎么把MySQL数据库卸载干净
  7. 计算机网络知识点全面总结(一篇全懂)
  8. 深度学习算法中卷积神经网络的应用
  9. java通过poi读取excel中的日期类型
  10. 数据结构:设线性表中每个元素有两个数据项k1和k2,现对线性表按一下规则进行排序:先看数据项k1,k1值小的元素在前,大的在后;在k1值相同的情况下,再看k2,k2值小的在前,大的在后。满足这种要求的