C++中数据共享的实现机制

上一篇 / 下一篇  2012-10-10 13:45:11 / 个人分类:C++

51Testing软件测试网Z ^(e@)I$Ms fEeR{

  摘要:在程序设计中如何实现不同的函数模块之间的数据共享,是程序设计中的关键技术问题。

SGP H#lb"^0

(YG WHc0}h1_0  本文以C++为例,详细阐述了面向对象程序设计中各种方式数据共享的实现机制。

;`4JUTC%\$D0

$v m2P0@|9N0  关键词:数据;函数模块;数据共享;C++51Testing软件测试网1z'j4E,T7c

51Testing软件测试网a:K KgySt t

  C++是目前应用广泛的一种面向对象程序设计语言,它比较适合于编写大型复杂程序。它所提供的数据共享机制具有广泛的代表性,能够很好的解决程序设计中数据的共享。51Testing软件测试网v'aa-QqNw-{

51Testing软件测试网L3i QI9Y*W:y,ly5tm

  1、使用局部变量和全局变量共享

8O#lQpQ.FO I yR0

R:S8eXm9b"_0  数据使用局部变量能够在调用和被调用函数之问通过参数传递实现不同函数块之问的数据共享【局部变量具有局部作用域,能很好地实现函数之间的数据隐蔽。但在传递过程中需要很大的系统开销,故一般只用于传递少量的数据。51Testing软件测试网z'o)}\ C8gL;G

51Testing软件测试网P-}:f6n[} l

  全局变量具有文件作用域。全局变量所存储的数据在程序中任何地方都可以访问,能够在程序中的所有函数之间实现数据共享。例如:

/_+i6n Wzm0

XnA7M7b'UN$g0

:?k PS2f)N9LV0
include< iostream.h >
s)zR9lN9j,|H0i0int i;//定义i为全局变量
8Z6F@/_d zrE0void f()
!hD_X]S0{i=8;}//在函数f中给全局变量赋值51Testing软件测试网 \tZR-`A IxA;f
void P()51Testing软件测试网8M7ot2K E Y@h!b
{cout<< i<<endl;}//在函数P中输出全局变量i51Testing软件测试网JCy U*\,D/p
int main()
{%Q'NMK2\x0{
m p)P:` r jY)E0f();//调用函数f给全局变量赋值为“8”51Testing软件测试网&dk:VGT
P();//调用函数P输出全局变量值“8’’
P.FC6hq q0return 0;}
51Testing软件测试网9o#WF7P9wC*~:|v

  使用全局变量实现共享数据相当方便,但其副作用也相当大。因为全局变量无法对数据的访问权进行有效控制。也就是说,我们很难知道程序中数据在那 些函数中共享,这样一旦共享的黄石理工学院学报2005年数据发生结构性调整,也就很难判断它到底影响到哪些函数,从而给程序维护带来相当大的困难。51Testing软件测试网*ev"?!E|0Nc

51Testing软件测试网8zt%Ry |5Ngg

  这种共享方式,直接影响到数据安全、程序代码重用和扩充。所以,在程序设计中,应可能少的使用这种共享方式。

3bQ+o2C(B5U0

$U*Cd4mH(I [ \0  2、通过类的数据成员共享数据51Testing软件测试网"] F@1m4u\Y^

51Testing软件测试网m_"[*KrI'H

  C++中类内部封装的数据成员提供了同一类的函数成员之间进行数据共享机制。这种共享方式一方面实现了类内部函数的全面共享,同时也提供了通过 设置适当的访问控制属性,把共享只限制在类的范围之内,这样对类外来说,类的数据成员仍是隐藏的,达到了共享与隐藏两全,解决了全局变量和局部变量所无法 克服的矛盾。例如:一个时钟类,该类中封装了私有数据成员有Hour,Minute,Second,在类的成员函数之间实现数据共享。在类的外面,对它们 的访问只能通过类自身提供的外部接口进行,无法直接访问。

3Cvk0| Z4m7o051Testing软件测试网eo&y7Nz7c#mG+h4n

f%G)R6]!F0B!u0
Class Clock//时钟类的声明51Testing软件测试网)?&^ NI&v#pB#P\
{
9U,T#iIw c.y!vTe5I0public://#b部接口,公有数据成员函数
5G,]?M`b-u$L [0void SetTime(int NewH =0,int NewM =0,int
0?*Z9U;Xr I0News=0);51Testing软件测试网6q#O S1s&V"n/W"BS
void ShowTime();
PqJ0t4GlsF0private://私有数据成员 .
/JP-\)d+z0int Hour,Minute,Second;//在类的成员函数之间共享51Testing软件测试网wH](W)kDQ:x'k
};
51Testing软件测试网,|N7Pt$y r0A'p

6{rn$S#A0  3、通过类的静态成员实现数据共享51Testing软件测试网{/qV@*@P3~

51Testing软件测试网 GF)]Tp#{

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

Jp1vH$?vm&uC0

;f-DgN{A O7C+B0
class student
,x ]CJ n_4S&_0{51Testing软件测试网9e8N7k%YDA T\
private:51Testing软件测试网hVG?#};tE3Z}8S2QI
im ID :51Testing软件测试网Xz*k0sej {*y \gY6Y
char nalne;
4g b"|Wp L-um8rZ0static count;//静态数据成员,用来存放”人51Testing软件测试网Gp[U1j)C:{8N }%O
//其他数据成员与函数成员略51Testing软件测试网"S B?&^#R6i
}
51Testing软件测试网Iw`*?D@%Xa

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

51Testing软件测试网3_5Pk0@2y

  4、通过友元机制共享数据51Testing软件测试网#X&TnH3L&Qd

51Testing软件测试网 qr OJBB"\

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

;eV` G;L0

?l _?3l#p*X!_051Testing软件测试网~ly4k9S3t)}hC

class B
"@){ s|n$Cu0{. //B类的成员声明
rn"y+jkp9b,@0friend float f(B&x,B&y);//友元函数声明51Testing软件测试网/{4Mfl_U0q8a(K
friend class A;//声明A为B的友元类51Testing软件测试网h0d];tb9rNX Q%zC
};
51Testing软件测试网%^SxRT"^ E\"\

  在B类声明f函数为友元函数,则在f函数中通过对象名可直接访问B类所有的数据成员。同时在B类声明A类为友元类,则A类的所有成员函数都是B 类的友元函数,都可以访问B类的私有和保护成员。采用友元类共享数据机制,使友元类成员函数可以通过对象名直接访问到隐藏的数据,从而使程序达到高效协调 工作。在较为复杂的问题中,实现不同类之间的数据共享,友元类的使用也是必不可少的选择。51Testing软件测试网j Q'zpj w'u-yS

'SICVq`0  友元在类之间、类与普通函数之间共享了内部封装的数据的同时,必然会对类的封装性带来一定的破坏。因此在程序设计中使用友元,要在共享和封装之间找到一个恰当的平衡点,从而达到提高程序效率同时,将程序隐患降来最低。

;E~.r F9x?`9o0

n V b:V0~&O!}6C$@Qo0  5、结束语51Testing软件测试网N3u:TB4}_]

51Testing软件测试网/Dz+fr6}/av _

  在大型程序设计中数据共享问题是一个复杂的综合性问题。设计过程中既要实现数据共享,又要保证共享数据的安全。这就要求程序设计人员必须充分了解各种实现机制的运行场合,熟知运用它们所带来的利与弊,这样才能恰到好处地运用这些机制,设计出高质量程序。51Testing软件测试网 c d;q\&o L!z"lT


TAG:

 

评分:0

我来说两句

Open Toolbar