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

被折叠的 条评论
为什么被折叠?



