下载此文档

静态成员和友元.ppt


文档分类:IT计算机 | 页数:约28页 举报非法文档有奖
1/28
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/28 下载此文档
文档列表 文档介绍
静态成员和友元
第一页,共28页
引入
考虑一个学生管理系统,有时候需要向系统添加一个学生,有时候需要从系统中删除一个学生。我们希望能够随时显示该系统中的所有学生,并且能够随时获取系统中的学生总数。
使用链表来存储所有的学生。
要求在一个常数时间内得到系统中的学生总数。
第二页,共28页
静态成员-背景
使用类数据成员保存链表头指针和学生总数的作法是不可取的,因为每个该类的对象都拥有一份副本,需要花费精力来维护这些副本的一致性(这些副本必须完全相同)。
设置全局变量来保存链表头指针和学生总数的作法可行,但是不够安全,因为程序的任何地方都可以修改这两个变量(导致程序的行为异常)。
【演示】
第三页,共28页
静态成员-引入
可以使用静态成员解决上述问题。
静态成员包括两种:
静态数据成员:使用关键字static修饰的数据成员。
静态成员函数:使用关键字static修饰的成员函数。
补充:C语言中使用static关键字描述了变量或者函数的可见性。
全局静态变量/对象是只在当前源文件中可见的全局变量或者对象。示例
不同源文件中可以定义同名的全局静态变量,但是各自占用的内存不同。
局部静态变量/对象是只在函数局部作用域内可见的变量或者对象,其生存期等于程序的生存期。
静态函数是只在当前源文件中可见的函数。不同源文件中可以定义同名的静态函数。示例
第四页,共28页
静态数据成员
使用static关键字修饰数据成员。
静态数据成员不属于该类的任何对象,而是由该类的所有对象共享。
静态数据成员是属于类的,而不是属于对象的。
一个类的静态数据成员只有一个,无论该类目前有多少个对象。
公有的静态数据成员可以在程序的任何地方访问,非公有的静态数据成员只能在类的作用域内或者友元中访问。
class Student
{

private:
char m_name[20];
Student* m_pNext;
Student* m_pPrev;
static Student* m_pListHead;
};
第五页,共28页
静态数据成员-访问
在类的成员函数中可以直接访问此类的静态数据成员,无需使用任何成员访问算符(.和->)。
在非成员函数中可以以两种方式访问一个类的公有静态数据成员。
通过该类的对象,->算符访问
使用类名限定的成员名来访问
Student::Student(char* name)
: m_pNext(NULL),
m_pPrev(NULL)
{

// 每构造一个对象,学生总
// 数应该加1
++s_nStudentCount;
}
Student s(“aa”);
Student t(“bb”);
cout << ; // OK
cout << ; // OK
cout << Student::s_nCount; //OK
// 以下断言成立
assert(&==&);
assert(&==&Student::s_nCount);
第六页,共28页
静态数据成员-唯一性
一个对象占用空间的大小和静态数据成员大小无关,换句话说:一个对象占用空间的大小是由该类所有非静态数据成员大小之和决定的。
默认的拷贝构造行为会拷贝静态成员吗?
静态数据成员所占用的空间不会随着对象的产生而分配,也不会随着对象的销毁而回收。静态数据成员具有静态生存期。
静态数据成员保存在程序的全局数据区中。
在main函数开始运行之前就已经准备好了。
在main函数返回之后结束其生存期。
第七页,共28页
class Student
{
public:
Student(char* name);
~Student();
private:
char m_name[20];
Student* m_pNext;
Student* m_pPrev;
static Student* s_pListHead;
};
void main()
{
Student* p1 = new Student(“a”);
Student* p2 = new Student(“b”);
Student* p3 = new Student(“c”);

}
Heap
“aaaa”
m_pNext
m_pPrev
“bbbb”
m_pNext
m_pPrev
“cccc”
m_pNext
m_pPrev
全局数据区
s_

静态成员和友元 来自淘豆网www.taodocs.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数28
  • 收藏数0 收藏
  • 顶次数0
  • 上传人文库新人
  • 文件大小1.38 MB
  • 时间2021-10-25
最近更新