首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

这段代码,小弟我就看不懂了~ 如何就可以这样

2013-11-21 
这段代码,我就看不懂了~ 怎么就可以这样?#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
[解决办法]
引用:
Quote: 引用:

对于类成员函数,不一定需要实例化才能调用的,看如下代码,它是可以编译运行的:
#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");
}

对于这个,我真的不懂~求详细解释。

所以你要进一步了解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并不影响它的调用
[解决办法]
引用:
Quote: 引用:

首先你的代码没有语法错误,也没有词法错误,需要的头文件及库也都包含了,当然能编译,链接通过,可以运行了。 你要明白运行时错误的含义!!!

貌似,运行时也是没有错误的。

vs2010没错 g++也没错
年轻人要严谨哟。。。。。。。。。。。。。。。。。。。。。。。。

热点排行