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 } //静态成员函数访问了构造函数
有哪位大神能够解释一下,在网上搜了好久没有找到一个理想的答案。
静态成员函数可以访问静态成员变量和静态成员函数,因为类的非静态成员函数会传入一个隐藏的this指针
这个因为没看懂.是反证的意思吗?
答案是构造函数里才有this因为他返回一个对象.调用之前不需要一个this.
那么,调用完构造函数怎么得到的this,我是不是可以这么写
1 staic Signalleton *signal; 2 signal=Signalleton(); 3 return signal; 4 //函数体是某个实例化该类型对象的static函数;
直接得到它的指针呢?
@TearsOfDawn: 1.this是对象的
2.静态函数里没this
3.静态调用非静态构造函数就是 new 构造函数(),在静态函数里没有this.在构造函数里才有this
你的重点再与:new 构造函数()
@吴瑞祥: 为什么要new Signalleton();而不能是直接调用构造函数?
是不是也就是说静态函数可以调用非静态函数,只是不能直接调用?
@TearsOfDawn: 什么地方让你觉得构造函数和函数是同一种东西?
@吴瑞祥: 可能是我知识水平太低,理解肤浅,
1:构造函数既然我们中文译作函数,那么必然有其道理
2:我的认知体系里,从C语言那里继承过来的潜意识变量后面加括号,就是函数的标志
3:构造函数可以被调用,虽然不允许任何返回值甚至void,调用的结果只是生成一个临时对象,但这种特殊的模式我总觉得脱离不了函数的范畴,析构函数以及其他种种类里面的构造函数都是这样
感谢你的耐心指教!
@TearsOfDawn: 静态成员函数是函数.非静态成员函数也是函数.各种函数有他自己的特性
就像你说的静态和非静态不一样.一样.构造函数和普通的成员函数也不一样
静态函数相当于全局执行代码,除了域的范围(执行时的函数栈)区别,在执行上,它与任何正在执行的代码没有区别。而一个类的实例化(new ClassType())这种操作,也是一句合法的代码,只要不被访问限制,在任何地方都可以执行。private这种限定词,将一个方法限定在只有与这个方法同类的方法中才可以使用。而某一个类的静态方法,属于这个类。在限定的语义上,它拥有调用private方法的权限。这种限定是在逻辑层面建立的,也就是,并非计算机的汇编层面或者原理层面导致这样的,而是c++这门语言强行实现并规定的。
上面我看有人说,构造函数和函数不是一个东西,只能是构造函数是稍微特殊一些的函数,但是,实际上,它的任何方面都还是函数,本质是一致的。
那么构造函数不能有返回值又是为什么。
如果构造函数能够返回一个this指针也挺好,为什么C++ 语言不实现这样的规则呢?
@TearsOfDawn: 构造函数是可以理解成有返回的,new Person();这个操作调用的构造函数public Person(){}就相当于Person Person(){return this;},因为是交给编译器执行的,而且,因为构造函数必须要返回this,同时为了语义上的方便理解,使用new 关键字和不显示返回this,比较不容易写错。
因为c++算是面向对象的初代产品了,可能当时好多的设计在我们现在看来比较难以理解,如果题主方便的话,可以去看一下js里面的new的实现原理,就可以理解,其实就是一个函数,生成了一个对象,然后将this指针(引用)返回。
因为这个函数位于 Signalleton:: 里面,也就是说它属于类定义的组成部分。在类定义的范围里,可以访问到所有这个类的所有成员数据。所谓 private ,protected,public 是指从类的“外部”看待类内部的成分的“可见性”。
这不是重点,重点是static函数可以访问构造函数?
这与static函数只能访问static数据或函数相悖吗?
@TearsOfDawn:
@TearsOfDawn:
感觉你的理解比较僵化啊,static 函数也是一个函数,只是它不和类的实例关联。在一个函数里构造一个对象这不是非常正常的事情吗。现在的问题只是,private 是针对类的用户(或者说从类的外部角度去看类的所有函数)来说的可见性控制,而对于类“内部”(也就是说,你正在定义这个类)来说,是不受这种封装性控制的。
我在看单例模式的时候也有这个疑问。确实,静态成员函数只能调用静态数据和静态成员函数。为什么静态成员函数可以访问非静态的构造函数。 这个问题前面有些答主已经说的差不多了,我们的误区是把构造函数也完全看成非静态成员函数了。这明显是不对的,程序文件中任何地方都是可以执行构造函数的,而且是执行完才有this指针。就是构造函数具有全局函数一样的熟悉属性,静态成员函数可以调用全局函数吗,这是肯定的,所以没有问题。