这段代码,小弟我就看不懂了~ 如何就可以这样
这段代码,我就看不懂了~ 怎么就可以这样?#include iostreamusing namespace stdclass CS{public:static
这段代码,我就看不懂了~ 怎么就可以这样?
#include <iostream>
using namespace std;
class CS
{
public:
static CS *ins()
{
return m_pCS;
}
int func(){return 10;}
private:
CS()//构造函数私有
{
cout<<"How"<<endl;
if (0==m_pCS)//保证一个实例
{
m_pCS = new CS();
}
}
static CS *m_pCS;
};
CS* CS::m_pCS=0;
void main()
{
CS* pCS = CS::ins();
int n = pCS->func();
cout<<n<<endl;
}
这是一段单例模型的代码,说实话,我没有看懂啊~, 构造函数都是私有的,根本就没有建立对象啊。怎么还可以调用了?我就奇了怪了。
[解决办法]确实可以建立对象,但是能正常调用,因为你这个函数只是没有操作和对象所属的成员,不需要访问This变量,可以学习下C++对象模型。
不过这样的代码实在是无法恭维。。
[解决办法]没有构造实例
但是我记得类的方法并不占用实例空间,所以我猜想这个函数在实例生成前就已经存在。
int func(){return 10;}
10是一个常量,也是不占用类实例空间的。
如果返回该类的一个成员变量应该就会出错。可以试试
[解决办法]对于类成员函数,不一定需要实例化才能调用的,看如下代码,它是可以编译运行的:
#include <iostream>
using namespace std;
class MyCS
{
public:
int func(){return 20;}
protected:
private:
MyCS()
{
cout<<"MyCS"<<endl;
}
};
void main()
{
MyCS* pMyCS = NULL;
int m = pMyCS->func();
cout<<m<<endl;
system("pause");
}
[解决办法]首先你的代码没有语法错误,也没有词法错误,需要的头文件及库也都包含了,当然能编译,链接通过,可以运行了。 你要明白运行时错误的含义!!!
[解决办法]至于为什么未分配的指针可以访问类成员函数,我刚刚找到篇文章,你可以参考下:‘
http://blog.csdn.net/eroswang/article/details/4153356
[解决办法]所以你要进一步了解C++代码的编译过程
像 pMyCS的函数func(); 编译后会生成一个大概是:MyCS_func_int1(void*)的符号
实际上对于C++成员函数的调用,都会变成C函数的调用,然后把this指针作为第一个参数。
那么,对于
pMyCS = NULL;
pMyCS->func();
这样的调用,会成为什么样呢?会变成调用一个C函数,MyCS_func_int1(NULL);
而你的int func(){return 20;}没有用到this指针,也就是说第一个参数是否为NULL并不影响它的调用
[解决办法]
首先你的代码没有语法错误,也没有词法错误,需要的头文件及库也都包含了,当然能编译,链接通过,可以运行了。 你要明白运行时错误的含义!!!
貌似,运行时也是没有错误的。
vs2010没错 g++也没错
年轻人要严谨哟。。。。。。。。。。。。。。。。。。。。。。。。