C++类对象共享数据的两种实现方法

来源:互联网 发布:linux ndk 编译的so 编辑:程序博客网 时间:2024/06/05 13:36

C++中类对数据与行为做了封装,使得私有数据成员不能在类体外被访问,同时类对象之间也不能互相访问对方的私有成员,而在有些情况下,数据既需要保持其私有性,又需要其有共享性,以下将给出两种方式的实现。

一、静态成员变量

#include <iostream>

using namespace std;

class sample

{

private:

static char m_sArray[20];

public:

        sample(){ cout << "default constructor! "<< endl;}

sample(sample & s){ cout << "copy constructor! " << endl;}

        void show(void) { cout << m_sArray << endl;}

void input(void) { cin.get(m_sArray, 20);}

};

char sample::m_sArray[20] = "I am a student";

int main(void)

{

sample s1; 

        s1.show();

        sample s2(s1);

s2.show();

s2.input();

s1.show();

}

运行结果如下:

default constructor!
I am a student
copy constructor!
I am a student
this is my job
this is my job

静态成员变量m_sArray确实起到了在不同对象间共享的作用!不过由于其是静态属性,内存是在全局/静态区域开辟的,属于栈内存区,内存大小使用受限。如果能动态从堆中申请内存,则可以使用大内存空间了。

二、指针成员变量与计数

如下所述的方法较为复杂,涉及到动态内存的分配,同时也要考虑到赋值、复制构造函数、析构函数的实现细节。

#include <iostream>

using namespace std;

class sample
{
private:
char *m_pArray;
static int m_sCount; 
size_t m_size;
public:
sample()

m_size = 20;
m_pArray = new char[m_size];
memset(m_pArray, 0, m_size);
cout << "default constructor! "<< endl;
m_sCount++;
}
sample(int n)
{
cout << "para constructor!"<< endl;
m_sCount++;
m_pArray = new char[n];
m_size = n;
}
sample(sample & s)

cout << "copy constructor! " << endl;
m_sCount++;
if(s.m_pArray != NULL)
{
m_pArray = s.m_pArray;
}
else
{
m_pArray = NULL;
}
}
~sample()
{
m_sCount--;
if(0==m_sCount)
{
delete[] m_pArray;
m_pArray = NULL;
}
}
sample & operator=(const sample & s)
{
if(m_pArray == s.m_pArray)
return *this;
m_sCount--;
if(0==m_sCount)
{
delete[] m_pArray;
}
m_pArray = s.m_pArray;
m_size = s.m_size;
m_sCount++;
}
void show(void) 
{
if( m_pArray != NULL)
cout << m_pArray << endl;
}
void input(void) 
{
if(m_size!=0)
{
if(m_pArray == NULL)
{
m_pArray = new char[m_size];
}
cin.get(m_pArray, m_size);
}


}


};
int sample::m_sCount=0;

int main()

{

sample s1; 
s1.show();
sample s2(s1);
s2.show();
s2.input();
s1.show();

}

运行结果如下:

default constructor!


copy constructor!


i am a student
i am a student

这种方法还不是很全面,因为没有考虑到申请内存异常的情况。在实际使用中需要进行处理。


0 0