第11讲静态成员和友元 教学目的与要求 了解友元的声明和使用。 掌握静态成员的特点和使用。 教学内容提要: 静态成员; 2、友元; 3、常对象、常数据成员和常成员函数 教学重点:静态成员的特点和使用。 教学难点:静态成员的特点和使用。 教学进度:P85~P96 教学过程:
第11讲 静态成员和友元 •教学目的与要求: 了解友元的声明和使用。 掌握静态成员的特点和使用。 •教学内容提要: 1、静态成员; 2、友元; 3、常对象、常数据成员和常成员函数 •教学重点:静态成员的特点和使用。 •教学难点:静态成员的特点和使用。 •教学进度:P85~P96 •教学过程:
1静态成员】 静态成员是满足在某些情况下数据共享的需求 静态数据成员 静态成员的分类{ 静态成员函数 (111静态数据成员 静态数据成员是同一个类中所有对象共享的成员,而不是某一对象的成 员。一个类的静态数据成员只存储在一处,供该类所有对象共享访问 如果需要把某一数据成员声明为静态成员,只需在其前面加关键字 static 由于静态数据成员是静态存储的,它具有静态生存期。 注由于在声明类时说明的静态数据成员只是一种引用性声明,而且在声 明对象时,由于静态数据成员的特殊性,并不会为之分配内存。要求单独 对静态数据成员进行定义性声明,以获得相应的存储空间
静态成员是满足在某些情况下数据共享的需求。 静态数据成员是同一个类中所有对象共享的成员,而不是某一对象的成 员。一个类的静态数据成员只存储在一处,供该类所有对象共享访问。 静态成员的分类 静态数据成员 静态成员函数 【 11.1.1 静态数据成员】 如果需要把某一数据成员声明为静态成员,只需在其前面加关键字static。 由于静态数据成员是静态存储的,它具有静态生存期。 注 由于在声明类时说明的静态数据成员只是一种引用性声明,而且在声 明对象时,由于静态数据成员的特殊性,并不会为之分配内存。要求单独 对静态数据成员进行定义性声明,以获得相应的存储空间。 【 11.1 静态成员】
(必须在具有文件作用域的某个地方进行 其形式如下:类型类名::静态数据成员名=初始化值; 注在定义静态数据成员时,由于关键字st是数据类型的一部 分,不能加。 例11静态数据成员的使用 include iostream. h class A public: A(int x, int y) a=x? AOf void getXYo
必须在具有文件作用域的某个地方进行。 其形式如下: 类型 类名::静态数据成员名=初始化值; 注 在定义静态数据成员时,由于关键字static不是数据类型的一部 分,不能加。 静态数据成员的使用 #include″iostream.h″ class A { public: A(int x,int y) { a=x; b=y; } ~A(){ } void getXY() 例 11-1
(续) cout<<"X="<<a<<'t<<"Y="<<b<<endl; 3 void getsUMO Y=2 summum+a+b cout<< SUM=<<sum<<endl S SUM=3 X=3 Y=4 private: SUME10 int a b static int sum; sum10 intA:sum=0;/静态数据成员的定义 void maino Aal(1,2); a 2 a al. getxY0; al. getsUMo; b 4 Aa2(3,4); a2. getXYo a2. getsUMO;
{ cout<< ″X= ″<<a<< ′\t ′<< ″Y= ″<<b<<endl; } void getSUM() { sum=sum+a+b; cout<< ″SUM= ″<<sum<<endl; } private: int a,b; static int sum; }; int A::sum=0; //静态数据成员的定义 void main() { A a1(1,2); a1.getXY(); a1.getSUM(); A a2(3,4); a2.getXY(); a2.getSUM(); } X=1 Y=2 SUM=3 X=3 Y=4 SUM=10 (续) a1 a b 1 2 a2 a b 3 4 sum 0310
在声明类时,让静态数据成员公有,则程序中可以不通过该类的对象直接 访问该数据。对它的访问可以直接通过类名实现 形式如下 类名::静态数据成员名 例如:# include- iostream. h> class a{ public: static int x, int A: X=0; void maino cout<<A: x<<endl A:x=10 cout<<A: x<<endl 对于把类的静态数据成员声明为私有的情形,如果希望不使用该类的对象 来访问该数据,就必须据访问该数据的公有辅助成员函数声明为静态的, 也即必须提供访问它的公有静态成员函数
例如: #includeclass A{public: static int x; }; int A::x=0; void main() { cout<<A::x<<endl; A::x=10; cout<<A::x<<endl; } 在声明类时,让静态数据成员公有,则程序中可以不通过该类的对象直接 访问该数据。对它的访问可以直接通过类名实现。 对于把类的静态数据成员声明为私有的情形,如果希望不使用该类的对象 来访问该数据,就必须据访问该数据的公有辅助成员函数声明为静态的, 也即必须提供访问它的公有静态成员函数。 形式如下: 类名::静态数据成员名
(111.2静态成员函数】 如果声明类时,在其中的某个成员函数的类型前加上关键字 static,则这个 成员函数就是静态成员函数。定义静态函数成员也是解决在同一个类的所 有对象之间共享数据的方法之一。 注在类外定义静态成员函数,函数头前不能加关键字sto 在静态成员函数的函数体中,可以直接访问所属类的静态成员,不能直接访 问非静态成员。要访问非静态成员,须借助于对象名或指向对象的指针。 例112静态成员函数的使用 fincludesiostream.h> class a public A(int xl, int x2)
如果声明类时,在其中的某个成员函数的类型前加上关键字static,则这个 成员函数就是静态成员函数。定义静态函数成员也是解决在同一个类的所 有对象之间共享数据的方法之一。 在静态成员函数的函数体中,可以直接访问所属类的静态成员,不能直接访 问非静态成员。要访问非静态成员,须借助于对象名或指向对象的指针。 注 在类外定义静态成员函数,函数头前不能加关键字static。 例 11-2 静态成员函数的使用 #include class A { public: A(int x1,int x2) { x=x1; 【11.1.2 静态成员函数】
例112静态成员函数的使用 y=y+x2: AOt static void fun10; static void fun(A a); private: int x. static int y; void A: fun1o cout<<"Y="<<y<<endl;∥直接访问静态数据成员 void A: fun(Aa) cout<"X="<x八t<"Y="<y<<endl;∥对非静态成员, 通过对象名访问
y=y+x2; } ~A(){} static void fun1(); static void fun2(A a); private: int x; static int y; }; void A::fun1() { cout<< ″Y= ″<<y<<endl; //直接访问静态数据成员 } void A::fun2(A a) { cout<< ″X= ″<<a.x<< ′\t ′<< ″Y= ″<<y<<endl; //对非静态成员, 通过对象名访问 例 11-2 静态成员函数的使用
(续) intA: :y=0; 6 void mainO Aa1(1,2) al. fun10; ∥通过对象名访问 A:fum2(a1);∥通过类名访问 12 Aa2(3,4); A:fun10;∥通过类名访问 a2fun2(a2);/通过对象名访问 Y=2 X=1 X=3 注公有的静态成员函数也可以通过相应的对象名来访问。公有静态成 员函数还可以通过其所属的类名来访问。静态成员函数不能声明为 常成员函数
} int A::y=0; void main() { A a1(1,2); a1.fun1(); //通过对象名访问 A::fun2(a1); //通过类名访问 A a2(3,4); A::fun1(); //通过类名访问 a2.fun2(a2); //通过对象名访问 } Y=2 X=1 Y=2 Y=6 X=3 Y=6 公有的静态成员函数也可以通过相应的对象名来访问。公有静态成 员函数还可以通过其所属的类名来访问。静态成员函数不能声明为 常成员函数。 注 (续) a1 x 1 a2 x 3 y 026
(1.,2友元】 友元提供了在不同类的成员函数之间、类的成员函数与一般函数之间进行 数据共享的机制。通过友元,一个普通函数或另一个类中的成员函数可以 访问类中的私有成员和保护成员。 可以是函数,则该函数叫友元函数。 友元 可以是一个类,则该类叫友元类。 (112.1友元函数 在声明一个类时,可以使用关键字rend把一个函数声明为这个类的友元函 数 注友元函数并不是这个类的成员函数,但它可以在其函数体中通过 对象名访问这个类的私有或保护成员。 例11-3友元函数的使用 #includesiostream. h>
友元提供了在不同类的成员函数之间、类的成员函数与一般函数之间进行 数据共享的机制。通过友元,一个普通函数或另一个类中的成员函数可以 访问类中的私有成员和保护成员。 友元 可以是函数,则该函数叫友元函数。 可以是一个类,则该类叫友元类。 在声明一个类时,可以使用关键字friend把一个函数声明为这个类的友元函 数。 【 11.2.1 友元函数】 友元函数并不是这个类的成员函数,但它可以在其函数体中通过 对象名访问这个类的私有或保护成员。 注 例 11-3 友元函数的使用 #include 【 11.2 友元】
例114友元函数的使用 class a ∥J声明类A public void memberfun(int x); class B ∥J声明类B public BO各 B(int xl) BOiL void getxo cout<<"X=<<x<<endl; friend void fun(; ∥友元函数 friend void A: memberfun(int x) ∥友元函数 private: int x;
class A //声明类A { public: void memberfun (int x); }; class B //声明类B { public: B(){} B(int x1) { x=x1; } ~B(){ } void getX() { cout<< ″X= ″<<x<<endl; } private: int x; }; 例 11-4 友元函数的使用 friend void fun(); //友元函数 friend void A::memberfun(int x); //友元函数