先看看小弟的理解:
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指针,表明是哪个对象。
而静态成员函数没有这样的指针。
静态成员函数要访问 成员变量或者成员函数,要么在函数内自己创建一个对象,要么在静态函数的参数表中传入一个。用对象来访问就可以了。
注意: 不是不能访问,而是不能直接访问。
普通成员函数都有一个隐含的this指针,表明是哪个对象。
而静态成员函数没有这样的指针。
静态成员函数要访问 成员变量或者成员函数,要么在函数内自己创建一个对象,要么在静态函数的参数表中传入一个。用对象来访问就可以了。
#5
访问构造函数,但不是调用自身类成员,访问类的构造函数要么是创建对象,要么是类的指针!
就像你代码中那样,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()返回的类的对象。
谢谢你的跟帖,你这部分,就是导致疑问的原因,在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
一个是在堆中动态创建,一个是在栈中创建。
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指针,表明是哪个对象。
而静态成员函数没有这样的指针。
静态成员函数要访问 成员变量或者成员函数,要么在函数内自己创建一个对象,要么在静态函数的参数表中传入一个。用对象来访问就可以了。
注意: 不是不能访问,而是不能直接访问。
普通成员函数都有一个隐含的this指针,表明是哪个对象。
而静态成员函数没有这样的指针。
静态成员函数要访问 成员变量或者成员函数,要么在函数内自己创建一个对象,要么在静态函数的参数表中传入一个。用对象来访问就可以了。
#5
访问构造函数,但不是调用自身类成员,访问类的构造函数要么是创建对象,要么是类的指针!
就像你代码中那样,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()返回的类的对象。
谢谢你的跟帖,你这部分,就是导致疑问的原因,在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
一个是在堆中动态创建,一个是在栈中创建。
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:
非常感谢你的回答,你总结的很好。
现在我清晰了。
非常感谢你的回答,你总结的很好。
现在我清晰了。