C++:不同类对象之间访问数据的3种简单常用的方法(拒绝全局变量,根据类自身特性选择的实用方法)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dashumak/article/details/81286348

C++编程中经常出现两个不同的类对象之间相互访问数据的需要,但是成员变量不是public形式,无法直接访问相应的变量,抛开全局变量不谈,常用的方法有:类封装留下的接口函数、友元机制、类静态成员变量。

1、通过类封装留下的接口函数(最常用)

利用类的封装特性,留下数据交互的接口,即通过public形式的成员函数访问私有的成员变量。

比如创建一个CStuden类:

Student.h如下

class CStudent  
{
public:
	CStudent();
	virtual ~CStudent();
	void getstudentab(int*sa,int*sb);
	void setstudentab(int sa,int sb);
private:
	int Studenta;
	int Studentb;

};

Student.ccp如下

#include "Student.h"

CStudent::CStudent()
{
	Studenta=30;
	Studentb=40;
}

void CStudent::getstudentab(int*sa,int*sb)//从类对象中读Studenta、Studentb
{
	*sa=Studenta;
	*sb=Studentb;
}

void CStudent::setstudentab(int sa,int sb)//给类对象中Studenta、Studentb的赋值
{
	Studenta=sa;
	Studentb=sb;
}

CStudent::~CStudent()
{

}

通过getstudent函数和setstudent函数与外界交互,但是这样的话当交互的变量较多时需要合理设计类的结构

2、通过友元机制

在一个类中,可以利用关键字friend将别的模块(一般函数、其他类的成员函数或其他类)声明为它的友元,这样这个类中本来隐藏的信息就可以被友元访问j。如果友元是一般函数或类的成员函数,称为友元函数;如果友元是一个类,则称为友元类,友元类的所有成员函数都成为友元函数。


class B
{
//B类的成员声明
friend float f(B&x,B&y);//友元函数声明
friend class A;//声明A为B的友元类
};

 在B类声明f函数为友元函数,则在f函数中通过对象名可直接访问B类所有的数据成员。同时在B类声明A类为友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。采用友元类共享数据机制,使友元类成员函数可以通过对象名直接访问到隐藏的数据,从而使程序达到高效协调工作。在较为复杂的问题中,实现不同类之间的数据共享,友元类的使用也是必不可少的选择。友元在类之间、类与普通函数之间共享了内部封装的数据的同时,必然会对类的封装性带来一定的破坏。因此在程序设计中使用友元,要在共享和封装之间找到一个恰当的平衡点,从而达到提高程序效率同时,将程序隐患降来最低。

3、通过类的静态成员变量

 C++中使用静态成员可以实现同一类的不同对象之间共享数据 j。类的普通数据成员在类的每一个对象都有一个拷贝,就是说每个对象的同名数据成员可以分别存储不同数值,这就保证对象拥有自身区别其他对象的特征的需要。静态数据成员是类的数据成员的一种特例,采用static关键字来声明;每个类只有一个拷贝,由该类的所有对象共同维护和使用,从而实现了同一类的不同对象之间的数据共享。

例如:

#include <iostream>
using namespace std;
class sample
{
private:
static char m_sArray[10];
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, 10);}
};
char sample::m_sArray[10] = "I am a engineer";
int main(void)
{
sample e1;
       e1.show();
       sample e2(e1);
e2.show();
e2.input();
e1.show();
}
//运行结果如下:
default constructor!
I am a engineer
copy constructor!
I am a engineer
this is my job
this is my job

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

有一学生类:

class engineer
{
Private:
im ID :
char nalne;
static count;//静态数据成员,用来存放“人数”
string name;
}

如果程序中需要统计学生人数,这个数据存放在什么地方呢?若以类外的全局变量来存放,不能实现数据的隐藏,若在类中增加一个数据成员用以存放人数,必然在每一个对象中都存储一副本,这样不仅冗余,而且每个对象分别维护一个“人数”,势必造成数据的不一致性。因此,比较好的方案是在engineer类中增加一个静态数据成员。static count用来存放学生“人数”。

 

 

猜你喜欢

转载自blog.csdn.net/dashumak/article/details/81286348