C++ static方法调用

时间:2022-02-09 15:09:32
各位牛虾,小弟初学C++,在看到单例模式的例子,有些疑问
先看看小弟的理解:
c++中static方法应该只能调用静态的成员。
如下代码:
class Log
{
    public:
        virtual ~Log();
        static Log* createLog(const string &sFilename);
        ...
    protected:
    private:
        static Log* ownInstance;
        Log();

};

Log* Log::createLog(const string &sFilename)
{
    if (ownInstance != NULL)
    {
        return ownInstance;           //这里是static方法调用的静态的成员变量
    }
    ownInstance = new Log();          //疑问在这里,Log()这里不是应该是非静态的成员吗?
    outStream.open(sFilename.c_str(), ios::app);
    if (outStream == NULL)
    {
        cout << "failed to open log file" << endl;
    }
    return ownInstance;
}

静态的方法为什么可以调用Log类非静态函数呢?

9 个解决方案

#1


静态成员函数相当于全局函数,只是有一个类名字空间的限制。
而类成员函数是成员内部的函数,同一个类的对象实例可以有很多,每一个实例都有自已不同的成员变量值,成员函数一般都是对成员自已的成员变量值在操作,所以调用成员函数,必须明确是对哪一个对象实例的操作。
而静态成员函数调用的成员变量值都必须是静态的,等同全局的变量。一个类不同的对象实例的静态变量是同一个变量,所以静态成员函数的调用可以全局调用,而无须指明是对哪一个对象操作。 

#2


To max_min_:
我估计我是理解错了。
我重新试了下,在静态函数中,可以直接的访问成员函数,静态成员函数貌似只能限制对非静态成员变量的访问。
我这样的理解对吗?

#3


To max_min_:
上面的回复,有点问题,貌似静态成员函数只能直接访问类的构造函数。

#4


静态成员函数不能直接访问非静态成员的变量以及函数。
注意: 不是不能访问,而是不能直接访问。

普通成员函数都有一个隐含的this指针,表明是哪个对象。
而静态成员函数没有这样的指针。
静态成员函数要访问 成员变量或者成员函数,要么在函数内自己创建一个对象,要么在静态函数的参数表中传入一个。用对象来访问就可以了。

#5


引用 3 楼 u011318940 的回复:
To max_min_:
上面的回复,有点问题,貌似静态成员函数只能直接访问类的构造函数。


访问构造函数,但不是调用自身类成员,访问类的构造函数要么是创建对象,要么是类的指针!
就像你代码中那样,ownInstance = new Log(); 这是在new 呢??这根本就不是调用自身函数
还有普通的,比如说Log(); 这是在创建一个无名对象,static函数中无this指针,所以这不算调用自身函数

#6


to:ananluowei:
谢谢你的跟帖,你这部分,就是导致疑问的原因,在Log* Log::createLog(const string &sFilename)函数中我测试过直接调用Log()构造函数,居然编译通过了。很纳闷。既然static没有this指针,那如何能直接调用构造函数呢?莫非,Log()其实也可以理解为创建一个Log对象吗?
to tsakang:
谢谢你的回答,但是我对【还有普通的,比如说Log(),这是在创建一个无名对象】这段话比较感兴趣,在C++中
new Log() 和 Log()的区别是?
除了new 出来的返回的实际是类的对象指针,而Log()返回的类的对象。

#7


静态成员函数不能直接访问非静态成员变量以及成员函数。至于构造函数只是分配存储空间吧。

#8


ownInstance = new Log();  //1
ownInstance = new Log;  // 2
1和2一样,都是new了一个默认构造的log对象,对象的地址给 ownInstance 

在C++中 new Log() 和 Log()的区别是?
-----------------------------
new log() 动态创建一个log对象 ,类似  int* p = new int
log() 创建一个log 对象 ,类似      int a = int(5)  , int a = 5
一个是在堆中动态创建,一个是在栈中创建。

#9


to ananluowei:
非常感谢你的回答,你总结的很好。
现在我清晰了。

#1


静态成员函数相当于全局函数,只是有一个类名字空间的限制。
而类成员函数是成员内部的函数,同一个类的对象实例可以有很多,每一个实例都有自已不同的成员变量值,成员函数一般都是对成员自已的成员变量值在操作,所以调用成员函数,必须明确是对哪一个对象实例的操作。
而静态成员函数调用的成员变量值都必须是静态的,等同全局的变量。一个类不同的对象实例的静态变量是同一个变量,所以静态成员函数的调用可以全局调用,而无须指明是对哪一个对象操作。 

#2


To max_min_:
我估计我是理解错了。
我重新试了下,在静态函数中,可以直接的访问成员函数,静态成员函数貌似只能限制对非静态成员变量的访问。
我这样的理解对吗?

#3


To max_min_:
上面的回复,有点问题,貌似静态成员函数只能直接访问类的构造函数。

#4


静态成员函数不能直接访问非静态成员的变量以及函数。
注意: 不是不能访问,而是不能直接访问。

普通成员函数都有一个隐含的this指针,表明是哪个对象。
而静态成员函数没有这样的指针。
静态成员函数要访问 成员变量或者成员函数,要么在函数内自己创建一个对象,要么在静态函数的参数表中传入一个。用对象来访问就可以了。

#5


引用 3 楼 u011318940 的回复:
To max_min_:
上面的回复,有点问题,貌似静态成员函数只能直接访问类的构造函数。


访问构造函数,但不是调用自身类成员,访问类的构造函数要么是创建对象,要么是类的指针!
就像你代码中那样,ownInstance = new Log(); 这是在new 呢??这根本就不是调用自身函数
还有普通的,比如说Log(); 这是在创建一个无名对象,static函数中无this指针,所以这不算调用自身函数

#6


to:ananluowei:
谢谢你的跟帖,你这部分,就是导致疑问的原因,在Log* Log::createLog(const string &sFilename)函数中我测试过直接调用Log()构造函数,居然编译通过了。很纳闷。既然static没有this指针,那如何能直接调用构造函数呢?莫非,Log()其实也可以理解为创建一个Log对象吗?
to tsakang:
谢谢你的回答,但是我对【还有普通的,比如说Log(),这是在创建一个无名对象】这段话比较感兴趣,在C++中
new Log() 和 Log()的区别是?
除了new 出来的返回的实际是类的对象指针,而Log()返回的类的对象。

#7


静态成员函数不能直接访问非静态成员变量以及成员函数。至于构造函数只是分配存储空间吧。

#8


ownInstance = new Log();  //1
ownInstance = new Log;  // 2
1和2一样,都是new了一个默认构造的log对象,对象的地址给 ownInstance 

在C++中 new Log() 和 Log()的区别是?
-----------------------------
new log() 动态创建一个log对象 ,类似  int* p = new int
log() 创建一个log 对象 ,类似      int a = int(5)  , int a = 5
一个是在堆中动态创建,一个是在栈中创建。

#9


to ananluowei:
非常感谢你的回答,你总结的很好。
现在我清晰了。