类和对象5_程序设计B

深复制不但复制本身,还复制成员的资源

静态成员

类成员冠以static声明时,称为静态成员。
静态数据成员为同类对象共享。
静态成员函数与静态数据成员协同操作。

静态成员函数:
静态成员不属于某一个单独的对象,而是为类的所有对象所共有。
静态成员函数的作用不是为了对象之间的沟通,而是为了能处理静态数据成员: 保证在不依赖于某个对象的情况下,访问静态数据成员。

静态数据成员:
静态数据成员在定义或说明时前面加关键字static,如:

class A
{
  	int n;
	static int s;
};

公有访问权限的静态成员,可以通过下面的形式进行访问

  • 类名::静态成员的名字
  • 对象名.静态成员名字
  • 对象指针->静态成员的名字
  • 在静态成员函数内部,直接访问。

计数器:

#include<iostream>
using namespace std ;
class  counter
{     static  int  num ;
  public :
      void  setnum ( int i ) { num = i ; }	
      void  shownum() { cout << num << '\t' ; }
} ;
int  counter :: num = 0 ;	
int main ()
{  counter  a , b ;
    a.shownum() ;   
    b.shownum() ;
    a.setnum(10) ;
    a.shownum() ;    
    b.shownum() ;
    cout<<endl ;
}

在这里插入图片描述
静态成员函数:
静态函数(类函数)仅可以访问静态成员,或是静态成员函数或是静态数据成员。
静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。
静态成员函数没有this指针,只能对静态数据操作

定义静态成员函数的格式如下:
static 返回类型 静态成员函数名(参数表);
与静态数据成员类似,调用公有静态成员函数的一般格式有如下几种:

  • 类名::静态成员函数名(实参表)
  • 对象. 静态成员函数名(实参表)
  • 对象指针->静态成员函数名(实参表)
静态函数只对静态数据成员进行操作:
class X
{ public :
     static  void StaFun ( int i ,  X *ptr ) ; 
     int  staDat ;
} ; 
void  X :: StaFun ( int i ,  X * ptr ) 
{  
     staDat = i ;    // 错误,不知 staDat引自哪一个对象?
} 

说明:

  1. 静态成员函数在类外定义时不用static前缀。
  2. 静态成员函数主要用来访问同一类中的静态数据成员。
  3. 私有静态成员函数不能在类外部或用对象访问。
  4. 可以在建立对象之前处理静态数据成员。
  5. 编译系统将静态成员函数限定为内部连接(在其他文件中不可见)。
  6. 静态成员函数中是没有this指针的。
  7. 静态成员函数不访问类中的非静态数据成员。如有需要,只能通过对象名(或指向对象的指针)访问该对象的非静态成员。

使用静态成员的好处:

  1. 使用静态成员不用定义可以直接操作
  2. 访问权限有保障

友元函数

不建议使用,破坏了类的封装性

如果在本类(类A)以外的其他地方定义了一个函数(函数B),这个函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数。
在类体中用friend对其(函数B)进行声明,此函数就称为本类(类A)的友元函数。
友元函数(函数B)可以访问这个类(类A)中的私有成员。

友元类:

若F类是A类的友元类,则F类的所有成员函数都是A类的友元函数。
友元类通常设计为一种对数据操作或类之间传递消息的辅助类。
友元类的声明格式:
friend class 类名;

A类对B类开放,单向关系:

#include<iostream>
using namespace std ;
class A
{ friend class B ;
   public :
       void  Display() 
	{ cout << x << endl ; } ;
   private :
	int  x ;
} ;
class  B
{ public :
       void Set ( int i ) { Aobject . x = i ; } 
       void Display ()  { Aobject . Display () ; } 
   private :
	A  Aobject ;
} ;
int main()
{ B  Bobject ;
   Bobject . Set ( 100 ) ;
   Bobject . Display () ;
}

类的包含(类的组合)

当一个类中含有已经定义的类类型成员,带参数的构造函数对数据成员初始化,须使用初始化语法形式。
构造函数 ( 形参表 ) : 对象成员1(形参表 ) , … , 对象成员n (形参表 ) ;

对象成员的初始化:

  • 出现成员对象时,该类的构造函数要包含对象成员的初始化。如果构造函数的成员初始化列表没有对成员对象初始化时,则使用成员对象的无参(缺省)构造函数。
  • 建立一个类的对象时,要先执行成员对象自己的构造函数,再执行当前类的构造函数。
  • 成员对象的构造函数调用次序和成员对象在类中的说明次序一致(声明顺序为:a1、b1、b2),与它们在成员初始化列表中出现的次序无关(初始化列表顺序为:b1、b2、a1)。
  • 析构函数的调用顺序相反

管理信息系统开发基本步骤

  1. 了解系统要实现什么功能?
  2. 对系统功能进行分类汇总
  3. 设计操作类
    - 一个成员函数实现一个具体功能;
    - 设确定数据成员,设计构造函数;
  4. 设计数据类
  5. 整合操作类所需要的数据、设计数据类
    - 明确如何修饰数据成员、确定数据类的成员函数
  6. 编码调试数据类
    - 在main函数中创建数据类对象、调用各成员函数
  7. 调试操作类
    -先调试最急需的成员函数;
    -再陆续增加成员函数
    -设计多组测试数据,用不同的测试数据反复运行程序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值