.
float dist(Point &p1,Point &p2){//友元函数实现 double x=double(p1.x-p2.x);//通过对象访问私有数据成员 double y=double(p1.y-p2.y); return static_cast 若A类为B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。 class B { ... //B类的成员声明 friend class A;//声明A为B的友元类 ... }; 声明友元类,是建立类与类之间的联系,实现类之间数据共享的一种途径。 在UML中,两个类之间的友元关系是通过< 图5-5 类A和类B友元关系的UML图 B < . void display(){ cout< 第三,友元关系是不被继承的。 5.5 共享数据的保护P163 5.5.1 常对象 声明格式: const 类型说明符 对象名; 或 . . 类型说明符 const 对象名; 常对象必须进行初始化,且不能被更新。 语法如何保障常对象的值不被改变呢? 改变对象的数据成员值有两个途径: 一是在类外通过对象名访问其公有数据成员,这时语法会限制不能再赋值。 二是在类的成员函数中改变数据成员的值,规定不能通过常对象调用普通的成员函数。 5.5.2 用const修饰的类成员P164 1. 常成员函数 声明格式: 类型说明符 函数(参数表)const; 注意: ① const是函数类型的一个组成部分。 ② 常成员函数不能更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数。 ③ 常对象只能调用它的常成员函数。 ④ const可用于对重载函数的区分。 例如, void print(); void print() const; 这是对print的有效重载。 在UML中,常成员函数前添加< 图5-6 包含常成员函数的R类的UML图 R – r1 : int – r2 : int +R(rr1 : int, rr2 : int) +print() : void < . void print(); void print() const;//常成员函数 private: int r1,r2; }; void R::print(){ cout< 类的成员数据也可以是常量。 使用const说明的数据成员为常数据成员。 任何函数中都不能对常数据成员赋值。 构造函数对常数据成员进行初始化,就只能通过初始化列表。 在UML中,常数据成员前添加const。 例5-8 常数据成员举例。 图5-7 包含常数据成员的A类的UML图 A – a : const int – b : const int=10 +A(i : int) +print() : void #include . A(int i); void print(); private: const int a;//常数据成员 static const int b;//静态常数据成员 }; const int A::b=10;//静态常数据成员在类外说明和初始化 A::A(int i):a(i) { }//常数据成员只能通过初始化列表来获得初值 void A::print(){ cout< 常引用的说明形式: const 类型说明符 &引用名; 常引用所引用的对象不能被更新。 若用常引用做形参,便不会发生对实参意外的更改。 例5-9 常引用做形参 #include