博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
静态成员函数访问构造函数
阅读量:7067 次
发布时间:2019-06-28

本文共 1156 字,大约阅读时间需要 3 分钟。

在C++中,静态成员函数只能访问静态成员,原因在于没有this指针。这已经是常识了。

其实,成员函数在编译时,编译器会自动加上this指针。

比如

A a;a.func(1);

会当做

A::func(&a, 1);

成员函数的原型是

A::func(int);

编译器处理后等价于

A::func(A* const register this, int) //不要人为添加this声明,是编译器隐式生成的,否则报错

而静态函数就没有this这个指针了。

但是有一个问题,最近看面试书,里面提到了有一种设计模式,可将构造函数声明为private/protected,而后用静态成员函数调用构造函数。

静态成员函数调用私有构造函数,嗯。

如何实现呢?为什么能够行得通呢?

明确一点,静态成员函数可以访问静态成员变量,全局变量,和自身的函数形参。

所以,可以将对象做为static函数的形参传递进去

比如

static void A::Instance(A * const pa);

而且,在静态函数Instance中,可以访问A的成员

void A::Instance(A * const pa){       pa->func(); //func可以是非静态成员函数,而且无论private 还是protected       pa->a; //可以访问非静态成员变量,无论private还是protected }

抑或在Instance中new一个A对象

class A{     public:         static A* Instance();     protected:         A();     private:         static A* _instance;}//实现时A* A::_instance = NULL;A* A::Instance(){     if( _instance == NULL )     {             _instance = new  A();      }     return _instance;}

不管是哪种方案,都是显式在静态函数中引入了一个对象。

同时,我们注意到,static函数内部可以通过一个对象a,来无差别权限地访问各个成员函数和变量。

这里涉及到一个作用域的问题。静态成员函数也是成员函数,所以在函数开头有A::来表明作用域,那么就可以在其中访问A的成员函数和变量。

看来一个成员函数有两点需要我们注意,一个是this指针,还有一个就是作用域。

上文所描述的,是设计模式中的单件模式,很巧妙的应用哈~

 

 

转载于:https://www.cnblogs.com/ShaneZhang/p/3722519.html

你可能感兴趣的文章
几分钟内提升技能的8个 JavaScript 方法!
查看>>
mac显示隐藏文件
查看>>
Android 插件化原理-好文收集(陆续中。。。)
查看>>
双亲委派模型与Tomcat类加载架构
查看>>
Highcharts tooltip显示数量和百分比
查看>>
小程序兼容iphoneX(齐刘海)代码,mpvue的写法
查看>>
小米设备怎么不ROOT激活Xposed框架的步骤
查看>>
Vue Router
查看>>
你所听到的技术原理、技术本质到底是什么?
查看>>
决战燕京城-10 前往天寿山
查看>>
WebMvcTest与SpringBootTest
查看>>
面试官:你接受免费加班吗?程序员这样怼回去,网友:老铁没毛病
查看>>
分享我的个人项目:Wildfire 野火评论系统
查看>>
【机器视觉与图像处理】基于MATLAB的角度计算
查看>>
一篇很全面的IOS面试题(下)
查看>>
极简.高性能.分布式框架,可运行于多种环境(apache/php-fpm,swoole)
查看>>
DESTOON7.0农产品B2B供应求购交易平台源码
查看>>
node js 批量处理pdf,提取关键信息,并导出excel
查看>>
05 Objective C数组的四种遍历方法总结
查看>>
少侠请重新来过 - Vue学习笔记(五) - 指令
查看>>