首页 新闻 会员 周边

C++中为什么静态函数可以访问私有构造函数?

0
悬赏园豆:50 [已关闭问题] 关闭于 2018-02-22 09:45

C++中,静态成员函数可以访问静态成员变量和静态成员函数,因为类的非静态成员函数会传入一个隐藏的this指针,这是大家都知道的。非静态的成员函数是属于类的,不属于某个对象,所以不含有this指针,所以只能调用静态成员函数和静态成员函数,但是今天在实现单例模式(一个类只能拥有一个对象时发现静态成员函数可以访问构造函数,难道构造函数是静态的吗?)

 1 class Signalleton{
 2 public:
 3     static Signalleton* get_instance();
 4     void set_var(int var);
 5     int get_var();
 6 private:
 7     Signalleton();
 8     virtual ~Signalleton();
 9     static Signalleton *signal;
10     int _var;
11 };
12 
13 Signalleton* Signalleton::signal = NULL;
14 
15 
16 Signalleton* Signalleton::get_instance()
17 {
18     if (NULL == signal)
19     {
20         signal = new Signalleton();
21     }
22     return signal;
 23 } //静态成员函数访问了构造函数
有哪位大神能够解释一下,在网上搜了好久没有找到一个理想的答案。
C++
TearsOfDawn的主页 TearsOfDawn | 初学一级 | 园豆:34
提问于:2018-01-27 22:11
< >
分享
所有回答(4)
-1

静态成员函数可以访问静态成员变量和静态成员函数,因为类的非静态成员函数会传入一个隐藏的this指针

这个因为没看懂.是反证的意思吗?

答案是构造函数里才有this因为他返回一个对象.调用之前不需要一个this.

吴瑞祥 | 园豆:29449 (高人七级) | 2018-01-27 23:20

那么,调用完构造函数怎么得到的this,我是不是可以这么写

1 staic Signalleton *signal;    
2 signal=Signalleton();
3 return signal;
4 //函数体是某个实例化该类型对象的static函数;

直接得到它的指针呢?

支持(0) 反对(0) TearsOfDawn | 园豆:34 (初学一级) | 2018-01-27 23:35

@TearsOfDawn: 1.this是对象的

2.静态函数里没this

3.静态调用非静态构造函数就是 new 构造函数(),在静态函数里没有this.在构造函数里才有this

你的重点再与:new 构造函数()

支持(0) 反对(1) 吴瑞祥 | 园豆:29449 (高人七级) | 2018-01-27 23:38

@吴瑞祥: 为什么要new Signalleton();而不能是直接调用构造函数?

支持(0) 反对(0) TearsOfDawn | 园豆:34 (初学一级) | 2018-01-28 16:41

是不是也就是说静态函数可以调用非静态函数,只是不能直接调用?

支持(0) 反对(0) TearsOfDawn | 园豆:34 (初学一级) | 2018-01-28 17:04

@TearsOfDawn: 什么地方让你觉得构造函数和函数是同一种东西?

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2018-01-28 20:32

@吴瑞祥: 可能是我知识水平太低,理解肤浅,

1:构造函数既然我们中文译作函数,那么必然有其道理

2:我的认知体系里,从C语言那里继承过来的潜意识变量后面加括号,就是函数的标志

3:构造函数可以被调用,虽然不允许任何返回值甚至void,调用的结果只是生成一个临时对象,但这种特殊的模式我总觉得脱离不了函数的范畴,析构函数以及其他种种类里面的构造函数都是这样

感谢你的耐心指教!

支持(0) 反对(0) TearsOfDawn | 园豆:34 (初学一级) | 2018-01-29 20:57

@TearsOfDawn:  静态成员函数是函数.非静态成员函数也是函数.各种函数有他自己的特性

就像你说的静态和非静态不一样.一样.构造函数和普通的成员函数也不一样

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2018-01-29 21:10
0

静态函数相当于全局执行代码,除了域的范围(执行时的函数栈)区别,在执行上,它与任何正在执行的代码没有区别。而一个类的实例化(new ClassType())这种操作,也是一句合法的代码,只要不被访问限制,在任何地方都可以执行。private这种限定词,将一个方法限定在只有与这个方法同类的方法中才可以使用。而某一个类的静态方法,属于这个类。在限定的语义上,它拥有调用private方法的权限。这种限定是在逻辑层面建立的,也就是,并非计算机的汇编层面或者原理层面导致这样的,而是c++这门语言强行实现并规定的。

上面我看有人说,构造函数和函数不是一个东西,只能是构造函数是稍微特殊一些的函数,但是,实际上,它的任何方面都还是函数,本质是一致的。

ensleep | 园豆:1682 (小虾三级) | 2018-01-31 09:44

那么构造函数不能有返回值又是为什么。

如果构造函数能够返回一个this指针也挺好,为什么C++ 语言不实现这样的规则呢?

支持(0) 反对(0) TearsOfDawn | 园豆:34 (初学一级) | 2018-02-08 19:57

@TearsOfDawn: 构造函数是可以理解成有返回的,new Person();这个操作调用的构造函数public Person(){}就相当于Person Person(){return this;},因为是交给编译器执行的,而且,因为构造函数必须要返回this,同时为了语义上的方便理解,使用new 关键字和不显示返回this,比较不容易写错。

因为c++算是面向对象的初代产品了,可能当时好多的设计在我们现在看来比较难以理解,如果题主方便的话,可以去看一下js里面的new的实现原理,就可以理解,其实就是一个函数,生成了一个对象,然后将this指针(引用)返回。

支持(0) 反对(0) ensleep | 园豆:1682 (小虾三级) | 2018-02-11 23:28
0

因为这个函数位于 Signalleton:: 里面,也就是说它属于类定义的组成部分。在类定义的范围里,可以访问到所有这个类的所有成员数据。所谓 private ,protected,public 是指从类的“外部”看待类内部的成分的“可见性”。

hoodlum1980 | 园豆:559 (小虾三级) | 2018-03-14 17:00

这不是重点,重点是static函数可以访问构造函数?

这与static函数只能访问static数据或函数相悖吗?

支持(0) 反对(0) TearsOfDawn | 园豆:34 (初学一级) | 2018-05-02 20:44

@TearsOfDawn:
@TearsOfDawn:
感觉你的理解比较僵化啊,static 函数也是一个函数,只是它不和类的实例关联。在一个函数里构造一个对象这不是非常正常的事情吗。现在的问题只是,private 是针对类的用户(或者说从类的外部角度去看类的所有函数)来说的可见性控制,而对于类“内部”(也就是说,你正在定义这个类)来说,是不受这种封装性控制的。

支持(0) 反对(0) hoodlum1980 | 园豆:559 (小虾三级) | 2019-01-10 15:41
1

我在看单例模式的时候也有这个疑问。确实,静态成员函数只能调用静态数据和静态成员函数。为什么静态成员函数可以访问非静态的构造函数。 这个问题前面有些答主已经说的差不多了,我们的误区是把构造函数也完全看成非静态成员函数了。这明显是不对的,程序文件中任何地方都是可以执行构造函数的,而且是执行完才有this指针。就是构造函数具有全局函数一样的熟悉属性,静态成员函数可以调用全局函数吗,这是肯定的,所以没有问题。

李泽滨 | 园豆:202 (菜鸟二级) | 2019-09-14 11:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册