c++编程题目请教,哪位大师能讲一讲

2025-05-02 08:19:28
推荐回答(2个)
回答1:

这是关于C++中静态成员,静态函数的使用问题,建议看下相关教材。
由关键字static修饰说明的类成员,成为静态类成员(static class member)。虽然使用static修饰说明,但与函数中的静态变量有明显差异。类的静态成员为其所有对象共享,不管有多少对象,静态成员只有一份存于公用内存中。
类定义中,用关键字static修饰的数据成员为静态数据成员。该类产生的所有对象共享系统为静态成员分配的一个存储空间,而这个存储空间是在编译时分配的,在定义对象时不再为静态成员分配空间。静态数据实际上是该类所有对象所共有的,它更像面向过程程序设计的全局变量,可提供同一类的所有对象之间信息交换的捷径,而不象函数中的静态变量保留上次进入该函数留下的信息。正因为静态数据成员不属于类的某一特定对象,而是属于整个类的,所以使用时可用以下格式:
类名::静态数据成员名
函数成员说明为静态,同样将与该类的不同对象无关。严格地讲,在逻辑上该函数成员只有一个拷贝。静态函数成员的调用,在对象之外可以采用下面的方式:
类名::函数名
与静态数据成员相反,为使用方便,静态函数成员多为公有的。

回答2:

实现原理用静态指针变量如果指针非空就说明已经存在一个对象,则不用再创建对象。否则创建一个,因此实现了单体类。
其中静态指针变量和静态函数实现了数据的共享。

参考代码一:
#include
using namespace std;

class OnlyOne
{
public:
static OnlyOne * Create();
void TestFunction()
{
cout<}
private:
int value;
static OnlyOne * p; //用静态指针限制只能实例化一个对象
};

OnlyOne * OnlyOne::Create()
{
if(p==NULL)
p=new OnlyOne;
return p;
}

OnlyOne * OnlyOne::p=NULL;

int main()
{
OnlyOne * p1,* p2;
p1=OnlyOne::Create();
p2=OnlyOne::Create();
cout<<"p1="<cout<<"p2="<return 0;
}

参考代码二:

class MyClass
{
public:
static MyClass* GetInstance()
{
static BOOL bInit = FALSE;
if (bInit == FALSE)
{
bInit = TRUE;
m_pInstance = new MyClass();
}

return m_pInstance;
}
private:
MyClass() {}

static MyClass *m_pInstance;
};

MyClass* MyClass::m_pInstance = NULL;

根据上面这段代码,要想在程序中只许创建一个MyClass类对象,调用静态成员函数GetInstance()即可。
例如:

MyClass MyObj(); // 编译出错 - 因为构造函数是 private

// 获得指向类对象指针的正确方法
MyClass* pMyObj1 = MyClass::GetInstance();

// 下面的语句不会创建新的类对象,它所创建的对象指针pMyObj2与上面创建的pMyObj1指针是一样的,
// 也就是说pMyObj1和pMyObj2所指的对象是一样的

MyClass* pMyObj2 = MyClass::GetInstance();