《C++面向对象程序设计》_第4章 类和对象.ppt
文本预览下载声明
要注意的地方就是引用类型的成员变量的初始化问题,它不能直接在构造函数里初始化,必须用到初始化列表,且形参也必须是引用类型。因此上例中构造函数正确的写法应该是: A(int i):x(i){} 例4.66 #include iostream using namespace std; class A{ public: A(int i):x(i){} int x ; }; int main() { int j = 0; A a(j); a.x = 1; coutj = jendl; couta.x = a.xendl; return 0; } 引用成员有时候和指针成员差不多,那什么时候用引用成员,什么时候是指针成员? 当你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),还有你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向),这时应该选择指针成员。 如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。 4.11 友元 面向对象程序设计主张程序的封装、数据的隐藏,不过任何事物都不是绝对的,友元打破了这种封装和隐藏。 一、友元函数 如果在本类以外的其他地方定义了一个函数(这个函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数),在类体中用friend对其进行声明,此函数就称为本类的友元函数。友元函数可以访问这个类中的私有成员 例4.68 将普通函数声明为友元函数。 #include iostream using namespace std; class Time{ public: Time(int,int,int); friend void display(Time ); private: int hour; int minute; int sec; }; Time∷Time(int h,int m,int s) { hour=h; minute=m; sec=s; } void display(Time t) { coutt.hour″:″t.minute″:″t.sec; } int main( ) { Time t1(10,13,56); display(t1); return 0; } 注意:在引用这些私有数据成员时,必须加上对象名,不能写成: couthour″:″minute″:″secendl; 这样写会有编译错误: error C2065: “hour”: 未声明的标识符 error C2065: “minute”: 未声明的标识符 error C2065: “sec”: 未声明的标识符 例4.69 将友元函数声明为protected和private。 class A { public: A():x(0){}; protected: friend void display1(A a); private: friend void display2(A a); int x; }; void display1(A a) { a.x++; couta.xendl; } void display2(A a) { a.x++; couta.xendl; } int main( ) { A a1; display1(a1); display2(a1); return 0; } 例4.70 将成员函数声明为友元函数。 #include iostream using namespace std; class Date; //对Date类的提前引用声明 class Time //定义Time类 { public: Time(int,int,int); void display(Date ); private: int hour; int minute; int sec; }; class Date //声明Date类 { public: Date(int,int,int); friend void Time∷display(Date ); //声明Time中的display函数为友元成员函数 private: int month; int day; int year; }; Time∷Time(int h,int m,int s) //类Time的构造函数 { hour=h; minute=m; sec=s; } void Time∷display(Date d) { coutd.
显示全部