C++程序設計基礎 安志遠ppt第3章 靜態成員與友元.ppt

(33頁)

'C++程序設計基礎 安志遠ppt第3章 靜態成員與友元.ppt'
第3章 靜態成員與友元 1學習目標 熟練掌握C++中靜態數據成員的聲明、定義及使用掌握C++中靜態成員函數的定義及使用熟練掌握C++中普通函數作為友元函數的使用掌握C++中成員函數作為友元的使用掌握C++中類作為友元的使用 23.1 靜態成員 3.1.1 靜態數據成員 3.1.2 靜態成員函數3.1.3 靜態成員使用 33.1.1 靜態數據成員靜態數據成員是類數據成員的一種特例。每個類只為靜態數據成員分配一個存儲空間,它由該類的所有對象共同擁有,從而實現了同一個類的不同對象之間的數據共享。靜態數據成員具有靜態生存期,在程序運行時就存在,直到程序運行結束。43.1.1 靜態數據成員靜態數據成員的聲明,是在數據成員前面加關鍵字static 。類的靜態數據成員在使用前必須進行初始化,并且一定要在類外完成。其初始化的形式如下: ::=; 例如: int Worker:: total=0; 53.1.1 靜態數據成員靜態數據成員屬于類,而不屬于任何一個對象,所以,在類外只能通過類名對它進行引用。靜態數據成員引用的一般形式如下: ::;63.1.1 靜態數據成員注意:靜態數據成員同一般數據成員一樣有訪問控制限制。當靜態數據成員被聲明為私有成員時,只能在類內直接引用它,在類外無法引用。當靜態數據成員被聲明為公有成員或保護成員時,可以在類外通過類名對它進行引用。 73.1.1 靜態數據成員例3.1 使用靜態數據成員,統計工人的每周工作時間。#include class Worker{private: char *name; int worktime;public: static int total; //用于統計總工作時間 void workTime(int n);};void Worker:: workTime(int n){ worktime=n; total+=n;}83.1.1 靜態數據成員int Worker::total=0; //靜態數據成員初始化void main(){ Worker worker1, worker2, worker3; worker1. workTime (48); worker2. workTime (36); worker3. workTime (38); cout<<"Total="<< Worker::total<<endl;} 93.1.2 靜態成員函數靜態成員函數與靜態數據成員一樣,它們都屬于整個類,不與類的任何對象相聯系。靜態成員函數的聲明,是在成員函數的類型說明符前加static關鍵字。由于靜態成員函數與類相聯系,所以訪問靜態函數時,不需要使用對象。引用靜態成員函數的一般格式: ::()103.1.2 靜態成員函數可以使用對象去引用靜態成員函數。用這兩種方法調用靜態成員函數都是允許的,而且意義相同。 靜態成員函數可以直接引用該類的靜態數據成員和成員函數,而不能直接引用非靜態數據成員,如果要引用,必須通過參數傳遞的方式得到對象名,然后再通過對象名來引用。 113.1.2 靜態成員函數例3.2 用兩種方法調用靜態成員函數。#include class Person{private: char name[20]; static int ID;public: static int number();};int Person::number(){ return ID;} 123.1.2 靜態成員函數int Person::ID=1001; void main(){ Person p1; cout<<"類名引用:"<<Person::number()<<endl; cout<<"對象引用:"<<p1. number()<<endl;} 133.1.2 靜態成員函數例3.3 靜態成員函數間接訪問非靜態數據成員。 #include class Myclass{private: int m; //非靜態數據成員 static int n; //靜態數據成員public: Myclass(); //構造函數 static int getn(Myclass a);};Myclass:: Myclass(){ m=10;}143.1.2 靜態成員函數int Myclass::getn(Myclass a){ cout<<a.m<<endl; //通過類間接使用非靜態數據成員 return n;} int Myclass::n=100; //靜態數據成員初始化 void main(){ Myclass app1; cout<<app1.getn(app1)<<endl; //利用對象引用靜態函數成員 cout<<Myclass::getn(app1)<<endl; //利用類名引用靜態函數成員} 153.1.3 靜態成員使用例3.4 靜態成員的使用。#include #include class staff{private: char name[30]; int age; char sex; static staff *pFirst; //私有靜態數據成員 staff *pNext;public: static int count; staff(char *n,int a,char s); //構造函數 ~staff() ; static staff *findname(char *pname); void display();};163.1.3 靜態成員使用staff::staff(char *n,int a,char s) //構造函數{ strcpy(name,n); age=a; sex=s; pNext=pFirst; pFirst=this; count++;} 173.1.3 靜態成員使用staff::~staff() { //析構函數 staff *ps; if(pFirst==this){ pFirst=pNext; return; } for(ps=pFirst;ps;ps->pNext){ if(ps->pNext==this){ ps->pNext=pNext; return; } }} 183.1.3 靜態成員使用staff * staff::f。省略部分。:"<<staff::count<<endl; cout<<"Input search name:"<>strname; staff* ps=staff::findname(strname);//"John" if(ps) ps->display(); else cout<<"No find!"<<endl;} 203.2 友元 3.2.1 友元函數 3.2.2 友元類 3.2.3 友元的使用 213.2.1 友元函數如果友元是普通函數或類的成員函數,則稱為友元函數。友元函數是在類聲明中由關鍵字friend修飾的非成員函數。普通函數聲明為友元函數的一般格式如下:friend (參數表);成員函數聲明為友元函數的一般格式如下:friend ::(參數表);223.2.1 友元函數說明:友元函數為非成員函數,在類中進行說明,一般在類外進行定義,定義時前面不加類名。如果是普通函數作為友元,也可以放在類體中定義。友元函數的聲明,可以放在類聲明中的任何位置,既可在public區,也可在protected區,意義完全一樣。友元函數可以通過對象名訪問類的所有成員,包括私有成員和保護成員。 233.2.1 友元函數例3.5 普通函數作友元函數。#include #include const double PI=3.141593; class Circle{private: double x,y,r;public: Circle(double xx=0,double yy=0,double rr=0) { x=xx; y=yy; r=rr; } void display( ); double area(){return PI*r*r;} double circular(){return 2*PI*r;} friend double distance (Circle &p1,Circle &p2); //普通函數作Circle的友元}; 243.2.1 友元函數void Circle::display( ) { cout<<"\tCenter point : ( "<<x<<", "<<y<<" )"<<endl; cout<<"\tRadius : "<<r<<endl; cout<<"\tArea : "<area()<<endl; cout<<"\tCirculars : "<circular()<<endl;} double distance(Circle &p1,Circle &p2){ return (sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)));}253.2.1 友元函數void main( ){ Circle c1(1,1,1),c2(3,4,5); cout<<"Circle 1:"<<endl; c1.display(); cout<<"Circle 2:"<<endl; c2.display(); cout<<"The distance is:"<<distance(c1,c2)<<endl;} 263.2.2 友元類如果友元是一個類,則稱為友元類。友元類的聲明形式如下: friend class 說明:友元類的聲明同樣可以在類聲明中的任何位置。友元類的所有成員函數都成為友元函數。例如,若A類為B類的友元類,則A類的所有成員函數都是B類的友元函數,都可以訪問B類的私有和保護成員。273.2.2 友元類例3.6 友元類的使用。#include class B;class A{ int i;public: int set(B&); int get() {return i;} A(int x) {i=x;}};class B{ int i;public: B(int x) {i=x;}283.2.2 友元類 friend A;};int A::set(B &b){ return i=b.i;}void main(){ A a(1); B b(2); cout<<a.get()<<”,”; a.set(b); cout<<a.get()<<endl;}293.2.2 友元類關于友元,還有兩點需要注意:友元關系不具有傳遞性。B類是A類的友元,C類是B類的友元,C類和A類之間如果沒有聲明,就沒有任何友元關系,不能進行數據共享。友元關系是單向的。如果聲明B類是A類的友元,B類的成員函數就可以訪問A類的私有和保護數據,但A類的成員函數卻不能訪問B類的私有和保護數據。 303.2.3 友元的使用例3.7 編寫一個程序,求一個點到直線的距離。 #include #include class Line; //前向聲明class Point{private: int x,y;public: Point(int xx,int yy){ x=xx; y=yy; } void display(){ cout<<"Point:( "<<x<<" , "<<y<<" )"<<endl; } friend double distance(Line &l,Point &p);};313.2.3 友元的使用class Line{private: int a,b,c;public: Line(int aa,int bb,int cc){ a=aa;b=bb;c=cc; } void display() { cout<<"Line: "<<a<<"x+"<<b<0?(cout<<"+"<<c<<endl):c==0?(cout<<endl): (cout<<c<<"=0"<<endl); } friend double distance(Line &l,Point &p);};323.2.3 友元的使用double distance(Line &l,Point &p){ double dist; dist=abs(l.a*p.x+l.b*p.y+l.c)/sqrt(l.a*l.a+l.b*l.b); return dist;} void main(){ Point p1(8,8); p1.display(); Line l1(2,7,-5); l1.display(); cout<<"d= "<<distance(l1,p1)<<endl;} 33
關 鍵 詞:
c++ 成員 ppt 程序設計 靜態 基礎
 天天文庫所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
關于本文
本文標題:C++程序設計基礎 安志遠ppt第3章 靜態成員與友元.ppt
鏈接地址: http://www.476824.live/p-51617176.html
關于我們 - 網站聲明 - 網站地圖 - 資源地圖 - 友情鏈接 - 網站客服點擊這里,給天天文庫發消息,QQ:1290478887 - 聯系我們

本站為“文檔C2C交易模式”,即用戶上傳的文檔直接賣給(下載)用戶,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有【成交的100%(原創)】。本站是網絡服務平臺方,若您的權利被侵害,侵權客服QQ:1290478887 歡迎舉報。

[email protected] 2017-2027 http://www.476824.live 網站版權所有

粵ICP備19057495號 

收起
展開
球探网即时蓝球比分 pk10赛车直播视频 重庆快乐十分选号 3d试机号今天绕胆图 排列五官网下载 类似pc蛋蛋的游戏 股票趋势分析下载 江西十一选五任二推荐 江西十一选五投注技巧 云南时时彩官网平台 幸运赛车公式图