数据的共享

本文探讨了数据共享的三种方式:类成员函数、静态成员和友元。详细介绍了作用域、可见性、对象的生存期,特别强调了静态数据成员的特性,它们是所有对象共享的,并在类外定义。此外,还讲解了静态函数成员和友元函数、友元类的概念,如何通过友元实现不同对象间的数据访问。

数据共享有三种:
1)类中的成员函数共享类的数据成员;
2)同一个类的不同对象之间共享类的静态数据成员;
3)通过友元实现;

一、作用域
是一个标识符在程序正文中有效的区域;
1、函数原型作用域

    在函数原型声明时形参的作用范围就是函数原型的作用域;

2、局部作用域

   函数形参列表中国形参的作用域,从形参列表中的声明处开始,到整个函数体结束为止;
   函数体内声明的变量,其作用域从声明处开始一直到声明所在的块结束为止;
   具有局部作用域的变量也称为局部变量;

3、类作用域

   类可以被看成是一组有名的成员的集合,类中的所有成员都具备类作用域;
   对类中成员的访问:
   1)如果在类中的成员函数中没有声明同名的局部作用域标识符,那么在该 
         函数内可以直接访问成员;
   2)通过表达式x.m或者X::m。其中x为类X定义的对象,m为类X的成员,
        X::m用于访问类的静态成员;
   3)通过Pt->m访问。其中Pt为指向X类的一个对象的指针;
         X x;
         X * Pt=&x;

4、命名空间作用域(名空间)

 1) 命名空间的语法形式:
    namespace 命名空间名
    {命名空间的各种声明}
 凡是在命名空间声明的都属于命名空间作用域;
如果具备名空间作用域的变量都是全局变量;
2)如果需要引用其他命名空间的标识符,其形式为
     **命名空间名::标识符名**
   或可以使用using语句:
      **using 命名空间名 ::标识符名;** 
例如:
    using  XA ::Data;
    using  SH::haha;
    int main()
    {
      Data  s;   
      haha();
      return 0;
      }
   则main函数中,Data类引用的是 XA中的Data类;
                            haha()函数引用的是SH中的函数。
3)命名空间也允许嵌套;
4全局命名空间名:是默认的命名空间,在显示声明的命名空间之外声明的标
                             识符都在一个全局命名空间中;
   匿名命名空间:是一个需要显示声明的没有名字的命名空间;
       声明方式:namespace
                        {匿名命名空间内的各种声明}

二、可见性

1、作用域的可见性的一般规则:

    1)标识符要声明在前,引用在后;
    2)在同一作用域中,不能声明同名的标识符;
    3)在没有相互包含关系的不同的作用域中声明了同名标识符,互不影响;
    4)如果在两个或多个具有包含关系的作用域中声明了同名标识符,则外
         层标识符在内层不可见。

三、对象的生存期

1、静态生存期:
如果对象的生存周期与程序的运行期相同,则称它具有静态生存期;
1)在命名空间作用域中声明的对象都是具有静态生存周期的;
2)如果要声明具有静态生存期的对象,则要使用关键字static;
3)静态局部变量、全局变量、静态成员变量都具备静态生存周期;
2、动态生存期:
除过具备静态生存期的,剩余的对象都具有动态生存期;
1)局部生存期对象诞生于声明点,结束于声明所在的块执行完毕之时;
2)不用static修饰的成员对象,其生存期与它们所属对象的生存期保持一致
注:类本身不占空间,它所定义的对象占空间;
四、类的静态成员

在结构化程序设计中程序模块的基本单位是函数,因此模块间对内存中数据的
共享是通过函数和函数之间的数据共享来实现的,其中包括两个途径——
参数传递和全局变量;
静态数据成员:
1、静态数据成员变量:是类的所有对象所共有,不为类的对象所特有;
2、静态数据成员具有静态生存期;
3、通过类名对它进行访问:
类名::标识符;
4、静态成员:在每个类只有一个副本,由该类的所有对象共同维护和使用
从而实现了同一类的不同对象之间的数据共享;
5、静态数据成员在类内声明,类外定义,并且在执行构造函数时,对静态
数据成员不进行构造;
静态函数成员
1、静态函数成员:就是使用static关键字声明的函数成员,它也属于整个类
2、静态成员函数和非静态成员函数区别:
1)静态函数成员没有this指针,非静态函数成员有this指针;
2)静态函数成员可以通过类名和对象名来调用,非静态函数成员只能
通过对象名来调用;
3)静态函数成员可以直接访问该类的静态数据和函数成员,而访问非
静态函数成员,必须通过对象名;
五、类的友元
友元关系提供了不同类或对象的成员函数之间、类的成员函数与一般函数
之间进行数据共享机制;通过友元关系,一个普通函数或类的成员函数可
以访问封装于另一个类中的数据;
1、友元函数:
1)友元函数是在类中用关键字friend修饰的非成员函数;
(其中友元函数可以是一个普通函数,或者是其他类中的成员函数)
2)友元成员函数的访问与普通友元函数访问基本相同:只是要通过相
应的类来访问或对象名来访问;
2、友元类:
声明友元类的语法形式:
class B
{
……
friend class A; //A为B 的友元类
……
}:
若A类为B类的友元类,则A类的所有成员函数都是B类的友元函数,都
可以访问B类的所有成员;
注:1)友元关系是不能传递的;
2)友元关系是单向的;
3)友元关系不能被继承;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值