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
这种方法还不是很全面,因为没有考虑到申请内存异常的情况。在实际使用中需要进行处理。
- C++类对象共享数据的两种实现方法
- C++类对象共享数据的5种实现方法
- 不同apk间共享数据的两种方法
- 两种多线程操作共享数据的方法
- 不同apk间共享数据的两种方法
- JAVA的线程对象实现的两种方法
- Java实现对象排序的两种方法
- 实现数据开放共享的方法
- 两栈共享空间的c语言实现
- 使用路由器实现两台电脑共享文件的方法
- 数据库保存数据的两种实现方法
- js定义对象的两种方法以及js用call来实现类的继承
- c语言strstr实现的两种方法
- C++_队列的两种实现方法
- C/C++ 实现htonf和ntof的两种方法
- C语言实现对半法查找的两种方法
- 共享对象的实现
- 两栈共享空间 C语言实现
- MyISAM和InnoDB的主要区别和应用场景
- 157. Read N Characters Given Read4
- 第一次项目总结
- Leetcode Search a 2D Matrix
- Spring基础:快速入门spring cloud(1):Spring Cloud介绍
- C++类对象共享数据的两种实现方法
- bias and variance
- Unity-android Remote 测试
- github 传输速度慢解决方法
- 二进制最大公约数算法
- Leetcode Evaluate Reverse Polish Notation
- JavaScript 运动框架 Step by step
- 用photoshop结合切片工具处理超级大图,例如原图为完整的台湾省19级图片
- Linux设备驱动第六天(工作队列、定时器、延时)