C-面向?qū)ο蟪绦蛟O計-第四章-類與對象(二)課件_第1頁
C-面向?qū)ο蟪绦蛟O計-第四章-類與對象(二)課件_第2頁
C-面向?qū)ο蟪绦蛟O計-第四章-類與對象(二)課件_第3頁
C-面向?qū)ο蟪绦蛟O計-第四章-類與對象(二)課件_第4頁
C-面向?qū)ο蟪绦蛟O計-第四章-類與對象(二)課件_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第4章類和對象(二)

C--面向?qū)ο蟪绦蛟O計-第四章-類與對象(二)課件4.1自引用指針this

例4.1this指針的引例。#include<iostream.h>classA{public:A(intx1){x=x1;}voiddisp(){cout<<"x="<<x<<endl;}private:intx;};

main(){Aa(1),b(2);cout<<"a:";a.disp();cout<<"b:";b.disp();return0;}

a.disp()與b.disp()在存儲時是同一個函數(shù),它怎么區(qū)分是a調(diào)用還是b調(diào)用它呢?4.1自引用指針thismain()a.disp()1.什么是this指針this指針是由系統(tǒng)在編譯時自動產(chǎn)生的一個指向?qū)ο笞陨淼闹羔槨?/p>

this是一個隱含于每一個類的非靜態(tài)成員函數(shù)中的特殊指針。用于指向正在操作該成員函數(shù)的對象。當一個對象調(diào)用成員函數(shù)時,編譯程序先將對象的地址賦給this指針,然后調(diào)用成員函數(shù)。成員函數(shù)存取數(shù)據(jù)成員時,由隱含的this指針引用,通常不顯式地使用this指針來引用數(shù)據(jù)成員。

1.什么是this指針例4.2顯示this指針的值。#include<iostream.h>classA{public:A(intx1){x=x1;}voiddisp(){cout<<"\nthis="<<this<<"whenx="<<this->x;}private:intx;};main(){Aa(1),b(2),c(3);a.disp();b.disp();c.disp();return0;}例4.2顯示this指針的值。為了幫助大家更深一步了解this指針是如何在“幕后”工作的,我們再看一個例子。假設有一段程序如下:classabc{private:chara;intb;public:voidinit(charma,intmb){a=ma;b=mb;}};main(){absob;ob.init(‘x’,12);return0;}為了幫助大家更深一步了解this指針是如何在“幕后”工作的,ob.init(‘x’,12);

那么C++如何使用this指針指向?qū)ο髈b呢?實際上,C++在編譯過程中做些了簡單的工作,將上述調(diào)用init()函數(shù)的語句轉(zhuǎn)換成如下形式:

init(&ob,’x’,12);換句話說,C++把類對象作為參數(shù)傳遞給函數(shù)(傳地址)。雖然程序中的成員函數(shù)init()沒有對應的形參,但程序編譯時C++將其轉(zhuǎn)換成以下形式:

voidinit(abc*this,charma,intmb){this->a=ma;this->b=mb;}由于函數(shù)調(diào)用時,第一個參數(shù)是按照地址傳遞的,因此當對象ob調(diào)用函數(shù)init()時,this指針便指向ob,于是隱式指針this保證了成員函數(shù)init()的操作對象確實是對象ob。ob.init(‘x’,12);.何時顯式使用this指針?(1)當需要在一個成員函數(shù)內(nèi)標識被該成員函數(shù)操作的對象時,就需要顯式使用this指針。.何時顯式使用this指針?#include<iostream.h>classSample{intx,y;public:Sample(inti=0,intj=0){x=i;y=j;}voidcopy(Sample&xy);voidprint(){cout<<x<<“,”<<y<<endl;}};voidSample::copy(Sample&xy){

if(this==&xy)return;

//通過判斷,避免不必要的復制*this=xy;}main(){Samplep1,p2(5,6);p1.copy(p2);p1.print();}#include<iostream.h>voidSamp(2)當成員函數(shù)的形參名與該類的數(shù)據(jù)成員同名時,必須用this指針來顯式區(qū)分。#include<iostream.h>classsam{inta,b;public:sam(inta,intb){this->a=a;this->b=b;cout<<a<<endl;}voidprint(){cout<<"a="<<a<<""<<"b="<<b<<endl;}};main(){sams2(2,2);s2.print();return0;}(2)當成員函數(shù)的形參名與該類的數(shù)據(jù)成員同名時,必須用thithis指針的另外一個作用:獲取對象自身。因為this指針的值是對象自身的首地址,*this是指針所指向的對象,即當前對象。如果一個類的成員函數(shù)返回值是*this,程序就可以用這個返回值去調(diào)用另外一個成員函數(shù)。this指針的另外一個作用:獲取對象自身。因為this指針的【舉例】#include<iostream.h>classClassroom{public:Classroom(intn=100,doublel=8.0,doublew=6.0);Classroom&set(intn,doublel,doublew);voidprint();private: intseats; doublelength,width;};【舉例】Classroom::Classroom(intn,doublel,doublew){ seats=n>0?n:100; length=l>0?l:8.0; width=w>0?w:6.0;}Classroom&Classroom::set(intn,doublel,doublew){ seats=n>0?n:100; length=l>0?l:8.0; width=w>0?w:6.0; return*this;}Classroom::Classroom(intn,douvoidClassroom::print(){cout<<this->width<<"meterswidthand" <<this->length<<"meterslength,"<<"contains"<<this->seats<<"seats."<<endl;}main(){ Classrooma101(80,6,4); cout<<"Classrooma101is"; a101.print(); cout<<"setandprint:"<<endl; cout<<"Classrooma101is";

a101.set(90,7.0,5.0).print(); return0;}voidClassroom::print(){this指針是一個const指針,不能在程序中修改它和給它賦值是一個局部數(shù)據(jù),它的作用域僅在一個對象內(nèi)部在系統(tǒng)中隱含存在。一般不必特別地去使用它。this指針是一個const指針,不能在程序中修改它和給它賦4.2對象數(shù)組與對象指針

4.2.1對象數(shù)組

所謂對象數(shù)組是指每一數(shù)組元素都是對象的數(shù)組。定義一個一維數(shù)組的格式如下:

類名數(shù)組名[下標表達式];

4.2對象數(shù)組與對象指針4.2.1對象數(shù)組例4.4對象數(shù)組的應用。

#include<iostream.h> classexam{ public: voidset_x(intn){x=n;} intget_x(){returnx;}private: intx; };

intmain(){examob[4];inti;for(i=0;i<4;i++)ob[i].set_x(i);for(i=0;i<4;i++)cout<<ob[i].get_x()<<′′;cout<<endl;return0;

}例4.4對象數(shù)組的應用。intmain()例4.5通過初始化表給對象數(shù)組賦值classexam{public:exam(){x=123;}exam(intn){x=n;}private:intx;};main(){examob1[4]={11,22,33,44};examob2[4]={33,44};examob3[4]={exam(11),exam(22)};ob3[3]=exam(44);}例4.5通過初始化表給對象數(shù)組賦值classex例4.5通過初始化表給對象數(shù)組賦值classexam{public:exam(intn,intm){x=n;y=m;}private:intx,y;};main(){examob[3][2]={exam(11,22),exam(33,44)};}例4.5通過初始化表給對象數(shù)組賦值classex4.2.2對象指針

1.用指針訪問單個對象成員聲明對象指針的一般語法形式為:

類名*對象指針名;如:ABC*p;當用指向?qū)ο蟮闹羔榿碓L問對象成員時,要用“->”操作符。4.2.2對象指針1.用指針訪問單個對象成員例4.7對象指針的使用。

#include<iostream.h>classexe{public: voidset_a(inta){x=a;} voidshow_a(){cout<<x<<endl;} private:intx;};

main(){exeob,*p;//聲明類exe的對象ob和類exe的對象指針pob.set_a(2);ob.show_a();//利用對象名訪問對象的成員p=&ob;//將對象ob的地址賦給對象指針pp->show_a();//利用對象指針訪問對象的成員return0;}例4.7對象指針的使用。main()2.用對象指針訪問對象數(shù)組

例如將例4.7的main()改寫為: main() { exeob[2],*p; ob[0].set_a(10);ob[1].set_a(20);p=ob; p->show_a(); p++; p->show_a(); return0; }2.用對象指針訪問對象數(shù)組例如將例4.74.3向函數(shù)傳遞對象

本節(jié)內(nèi)容中,把對象當作普通變量理解就行了4.3.1使用對象作為函數(shù)參數(shù)-------------值傳遞4.3.2使用對象指針作為函數(shù)參數(shù)-------地址傳遞4.3.3使用對象的引用作為函數(shù)參數(shù)----形參值的改變就是改變實參值

4.3向函數(shù)傳遞對象本節(jié)內(nèi)容中,把對象例4.11使用對象作為函數(shù)參數(shù)。#include<iostream.h>classaClass{public:aClass(intn){i=n;}voidset(intn){i=n;}intget(){returni;}private:inti;};voidsqr(aClassob){ob.set(ob.get()*ob.get());cout<<"copyofobjhasivalueof";cout<<ob.get()<<"\n";}main(){aClassobj(10);sqr(obj);cout<<"obj.iisunchangedinmain:";cout<<obj.get()<<endl;return0;}例4.11使用對象作為函數(shù)參數(shù)。voidsqr(aCl【例】對象指針作函數(shù)參數(shù)示例。

#include<iostream.h>classM{

public:M(){x=y=0;}M(inti,intj){x=i;y=j;}voidcopy(M*m);voidsetxy(inti,intj){x=i;y=j;}voidprint(){cout<<x<<“,”<<y<<endl;}private: intx,y;};形參為對象指針【例】對象指針作函數(shù)參數(shù)示例。形參為對象指針voidM::copy(M*m)//成員函數(shù)定義{x=m->x;y=m->y;}voidfun(Mm1,M*m2);//一般函數(shù)說明main(){

Mp(5,7),q;//定義對象q.copy(&p);fun(p,&q);p.print();q.print();} 以p對象的地址為實參voidM::copy(M*m)voidfun(Mm1,M*m2)//一般函數(shù)定義 { m1.setxy(12,15);m2->setxy(22,25);}實參——形參形參pqm1m2

實參57005720082008過程調(diào)用中57200820085757572225過程調(diào)用后voidfun(Mm1,M*m2)例4.12使用對象指針作為函數(shù)參數(shù)。#include<iostream.h>classaClass{public:aClass(intn){i=n;}voidset(intn){i=n;}intget(){returni;}private:inti;};voidsqr(aClass*ob){ob->set(ob->get()*ob->get());cout<<"Copyofobjhasivalueof";cout<<ob->get()<<"\n";}main(){aClassobj(10);sqr(&obj);cout<<"obj.iinmainhasbeenchanged:";cout<<obj.get()<<"\n";return0;}例4.12使用對象指針作為函數(shù)參數(shù)。voidsqr(aC例4.13使用對象引用作為函數(shù)參數(shù)。#include<iostream.h>classaClass{public:aClass(intn){i=n;}voidset(intn){i=n;}intget(){returni;}private:inti;};voidsqr(aClass&ob){ob.set(ob.get()*ob.get());cout<<"Copyofobjhasivalueof";cout<<ob.get()<<"\n";}main(){aClassobj(10);

sqr(obj);cout<<"obj.iinmain()hasbeenchanged:";cout<<obj.get()<<"\n";return0;}例4.13使用對象引用作為函數(shù)參數(shù)。voidsqr(aCl[例]#include<iostream.h>classM{public:M(){x=y=0;}M(intI,intj){x=I;y=j;}voidcopy(M&m);voidsetxy(inti,intj){x=I;j=j;}voidprint(){cout<<x<<“,”<<y<<endl;}private: intx,y;};[例]#include<iostream.h>voidM::copy(M&m)//成員函數(shù)定義{x=m.x;y=m.y;}voidfun(Mm1,M&m2);//一般函數(shù)說明voidmain() {Mp(5,7),q;//定義對象q.copy(p);fun(p,q);p.print();q.print();} voidfun(Mm1,M&m2)//一般函數(shù)定義 {m1.setxy(12,15);m2.setxy(22,25);}voidM::copy(M&m)實參——形參形參pqm1m2

實參570057過程調(diào)用中575757572225過程調(diào)用后實參——形參形參pqm1m2實參570054.4靜態(tài)成員

4.4.1靜態(tài)數(shù)據(jù)成員

在一個類中,若將一個數(shù)據(jù)成員說明為static,這種成員稱為靜態(tài)數(shù)據(jù)成員。與一般的數(shù)據(jù)成員不同,無論建立多少個類的對象,都只有一個靜態(tài)數(shù)據(jù)的拷貝。從而實現(xiàn)了同一個類的不同對象之間的數(shù)據(jù)共享。定義靜態(tài)數(shù)據(jù)成員的格式如下:

static數(shù)據(jù)類型

數(shù)據(jù)成員名;

4.4靜態(tài)成員4.4.1靜態(tài)數(shù)據(jù)成員例4.15靜態(tài)數(shù)據(jù)成員的使用引例。#include<iostream.h>#include<string.h>classStudent{public:Student(char*name1,char*stu_no1,floatscore1);~Student();voidshow();//輸出姓名、學號和成績voidshow_count_sum_ave();//輸出人數(shù)、總成績和平均成績private: char*name;//學生姓名 char*stu_no;//學生學號 floatscore;//學生成績

staticintcount;//統(tǒng)計學生人數(shù)

staticfloatsum;//統(tǒng)計總成績 staticfloatave;//統(tǒng)計平均成績};例4.15靜態(tài)數(shù)據(jù)成員的使用引例。Student::Student(char*name1,char*stu_no1,floatscore1){name=newchar[strlen(name1)+1];strcpy(name,name1);stu_no=newchar[strlen(stu_no1)+1];strcpy(stu_no,stu_no1); score=score1; ++count;//累加學生人數(shù) sum=sum+score;//累加總成績 ave=sum/count;//計算平均成績}Student::~Student(){delete[]name;delete[]stu_no;--count;sum=sum-score;}Student::Student(char*name1,cvoidStudent::show(){cout<<"\nname:"<<name;cout<<"\nstu_no:"<<stu_no;cout<<"\nscore:"<<score;}voidStudent::show_count_sum_ave(){cout<<"\ncount:"<<count;//輸出靜態(tài)數(shù)據(jù)成員countcout<<"\nsum:"<<sum;//輸出靜態(tài)數(shù)據(jù)成員sumcout<<"\nave:"<<ave;//輸出靜態(tài)數(shù)據(jù)成員ave}intStudent::count=0;//靜態(tài)數(shù)員count初始化floatStudent::sum=0.0;//靜態(tài)數(shù)員sum初始化floatStudent::ave=0.0;//靜態(tài)數(shù)員ave初始化voidStudent::show()voidmain(){Studentstu1("Liming","990201",90);stu1.show();stu1.show_count_sum_ave();Studentstu2("Zhanghao","990202",85);stu2.show();stu2.show_count_sum_ave();}1、靜態(tài)變量屬于類,為類創(chuàng)建的所有對象所公用。2、類中的非靜態(tài)變量,在類創(chuàng)建對象時,不同的對象擁有各自的變量存儲空間。3、靜態(tài)變量可以實現(xiàn)同一類中不同對象間的數(shù)據(jù)共享。voidmain()1、靜態(tài)變量屬于類,為類創(chuàng)建的所有對象有關靜態(tài)成員變量的語法規(guī)定靜態(tài)成員變量要用static聲明。靜態(tài)成員變量的初始化要在類外單獨進行,而且要在對象定義之前,一般在類定義之后、main()之前初始化。初始化的格式:數(shù)據(jù)類型類名::靜態(tài)數(shù)據(jù)成員名=值;如intStudent::count=0;注意:初始化時數(shù)據(jù)成員名前面不加static。靜態(tài)成員變量屬于類,公有的靜態(tài)成員變量可以用類名::靜態(tài)數(shù)成員名的方式在類外直接調(diào)用。(也可通過對象調(diào)用,私有的靜態(tài)成員變量不能在類外調(diào)用。)與普通靜態(tài)變量一樣,在編譯時創(chuàng)建并初始化。在該類的任何對象被建立之前就已經(jīng)存在。靜態(tài)成員變量實際代替了全局變量的作用。有關靜態(tài)成員變量的語法規(guī)定靜態(tài)成員變量要用static聲明。例4.16公有靜態(tài)數(shù)據(jù)成員的訪問。#include<iostream.h>classmyclass{public: staticinti; intgeti() { returni; }};intmyclass::i=0;main(){myclass::i=200;myclassob1,ob2;cout<<"ob1.i="<<ob1.geti()<<endl;cout<<"ob2.i="<<ob2.geti()<<endl;ob1.i=300;cout<<"ob1.i="<<ob1.geti()<<endl;cout<<"ob2.i="<<ob2.geti()<<endl;return0;}例4.16公有靜態(tài)數(shù)據(jù)成員的訪問。main()4.17靜態(tài)數(shù)據(jù)成員和一般數(shù)據(jù)成員的不同。#include<iostream.h>classStudent{public:Student(){ ++count; StudentNo=count;}voidprint(){cout<<"student"<<StudentNo<<"";cout<<"count="<<count<<endl;}private: staticintcount;

intStudentNo;};intStudent::count=0;main(){Studentstudent1;student1.print();cout<<"-------"<<endl;Studentstudent2;student1.print();student2.print(); return0;}4.17靜態(tài)數(shù)據(jù)成員和一般數(shù)據(jù)成員的不同。intStude4.4.2靜態(tài)成員函數(shù)

定義靜態(tài)成員函數(shù)的格式如下:static返回類型靜態(tài)成員函數(shù)名(參數(shù)表);與靜態(tài)數(shù)據(jù)成員類似,調(diào)用公有靜態(tài)成員函數(shù)的一般格式有如下幾種:

類名::靜態(tài)成員函數(shù)名(實參表)對象.靜態(tài)成員函數(shù)名(實參表)對象指針->靜態(tài)成員函數(shù)名(實參表)4.4.2靜態(tài)成員函數(shù)定義靜態(tài)成員函數(shù)的格式例4.18靜態(tài)成員函數(shù)來訪問靜態(tài)數(shù)據(jù)成員。#include<iostream.h>#include<string.h>classStudent{private: char*name;//學生姓名char*stu_no;//學生學號 floatscore;//學生成績

staticintcount;//靜態(tài)數(shù)據(jù)成員,統(tǒng)計學生人數(shù) staticfloatsum;//靜態(tài)數(shù)據(jù)成員,統(tǒng)計總成績public:Student(char*name1,char*stu_no1,floatscore1); ~Student();voidshow();//普通成員函數(shù),輸出姓名、學號和成績static voidshow_count_sum();//靜態(tài)成員函數(shù),輸出學生人數(shù)和總成績};例4.18靜態(tài)成員函數(shù)來訪問靜態(tài)數(shù)據(jù)成員。Student::Student(char*name1,char*stu_no1,floatscore1){name=newchar[strlen(name1)+1];strcpy(name,name1);stu_no=newchar[strlen(stu_no1)+1];strcpy(stu_no,stu_no1);score=score1;++count;//累加學生人數(shù)sum=sum+score;//累加總成績}Student::~Student(){delete[]name;delete[]stu_no;--count;sum=sum-score;}Student::Student(char*name1,cvoidStudent::show(){ cout<<"\nname:"<<name; cout<<"\nstu_no:"<<stu_no; cout<<"\nscore:"<<score;}voidStudent::show_count_sum()//靜態(tài)成員函數(shù){ cout<<"\ncount:"<<count;//輸出靜態(tài)數(shù)據(jù)成員cout<<"\nsum:"<<sum;//輸出靜態(tài)數(shù)據(jù)成員}intStudent::count=0;//靜態(tài)數(shù)據(jù)成員初始化floatStudent::sum=0.0;//靜態(tài)數(shù)據(jù)成員初始化voidStudent::show()voidmain(){Studentstu1("Liming","990201",90); stu1.show(); Student::show_count_sum();//使用類名訪問靜態(tài)成員函數(shù)Studentstu2("Zhanghao","990202",85); stu2.show(); stu2.show_count_sum();//使用對象stu2訪問靜態(tài)成員函數(shù)}voidmain()有關靜態(tài)成員函數(shù)可以定義成內(nèi)嵌的,也可類外定義,類外定義時不要static。一般用來訪問全局變量或同一類中的靜態(tài)變量。私有靜態(tài)成員函數(shù)不能被類外部函數(shù)和對象訪問使用靜態(tài)成員函數(shù)可以在創(chuàng)建對象之前處理靜態(tài)數(shù)據(jù)成員,這是普通函數(shù)所不能實現(xiàn)的功能。靜態(tài)成員函數(shù)沒有this指針。一般不訪問類中的非靜態(tài)成員(變量、函數(shù)),訪問時,要把對象作為參數(shù)傳遞。有關靜態(tài)成員函數(shù)可以定義成內(nèi)嵌的,也例4.19靜態(tài)成員函數(shù)訪問非靜態(tài)數(shù)據(jù)成員。#include<iostream.h>classsmall_cat{public:small_cat(doublew){ weight=w; total_weight+=w; total_number++;}

staticvoiddisplay(small_cat&w){cout<<"Thesmall_catweights"<<w.weight<<"kg\n";}staticvoidtotal_disp(){cout<<total_number<<"small_cattotalweight";cout<<total_weight<<"kg"<<endl;}private: doubleweight; staticdoubletotal_weight; staticdoubletotal_number;};例4.19靜態(tài)成員函數(shù)訪問非靜態(tài)數(shù)據(jù)成員。doublesmall_cat::total_weight=0;doublesmall_cat::total_number=0;main(){ small_catw1(0.9),w2(0.8),w3(0.7); small_cat::display(w1);small_cat::display(w2);

w1.display(w3);

w3.total_disp(); return0;}doublesmall_cat::total_weight4.5友元

友元既可以是不屬于任何類的一般函數(shù),也可以是另一個類的成員函數(shù),還可以是整個的類。

4.5友元4.5.1友元函數(shù)

友元函數(shù)不是當前類的成員函數(shù),而是獨立于當前類的外部函數(shù),但它可以訪問該類的所有對象的成員,包括私有成員、保護成員和公有成員。1.將非成員函數(shù)聲明為友元函數(shù)4.5.1友元函數(shù)例4.22友元函數(shù)的使用。#include<iostream.h>#include<string.h>classgirl{ public: girl(char*n,intd) {name=newchar[strlen(n)+1]; strcpy(name,n);age=d;}~girl(){delete[]name;}

friendvoiddisp(girl&);//聲明友元函數(shù) private: char*name;intage;};

voiddisp(girl&x)//定義友元函數(shù) {cout<<"Girl\′snameis"<<<<",age:"<<x.age<<"\n";}voidmain() {girle("ChenXinwei",18); disp(e);//調(diào)用友元函數(shù) }友元函數(shù)沒有this指針?。±?.22友元函數(shù)的使用。友元函數(shù)沒有this指針!!一個函數(shù)可以定義為多個類的友元函數(shù)?!纠?.19】(110頁)一個函數(shù)可以定義為多個類的友元函數(shù)。2.將成員函數(shù)聲明為友元函數(shù)

一個類的成員函數(shù)也可以作為另一個類的友元,這種成員函數(shù)不僅可以訪問自己所在類對象中的所有成員,還可以訪問friend聲明語句所在類對象中的所有成員。這樣能使兩個類相互合作、協(xié)調(diào)工作,完成某一任務。2.將成員函數(shù)聲明為友元函數(shù)例4.24一個類的成員函數(shù)作為另一個類的友元。

#include<iostream.h>#include<string.h>classgirl;classboy{public: boy(char*n,intd){name=newchar[strlen(n)+1]; strcpy(name,n);age=d;}

voiddisp(girl&);

//聲明disp()為類boy的成員函數(shù) ~boy(){deletename;}private: char*name; intage;};

classgirl{ public: girl(char*n,intd) {name=newchar[strlen(n)+1]; strcpy(name,n);age=d;}

friendvoidboy::disp(girl&); ~girl(){deletename;}private: char*name; intage;};例4.24一個類的成員函數(shù)作為另一個類的友

voidboy::disp(girl&x)//定義友元函數(shù)disp(){

cout<<"Boy\′snameis"<<name<<",age:"<<age<<"\n";//訪問boy類對象的成員cout<<"Girl\′snameis"<<<<",age:"<<x.age<<"\n";}

//訪問girl類對象的成員

voidmain(){boyb("ChenHao",25);girle("ZhangWei",18);b.disp(e);}

程序運行結(jié)果如下:Boy′snameisChenHao,age:25Girl′snameis:ZhangWei,age:18

類的成員函數(shù)作為另一類的友元時,該類應該先定義voidboy::disp(girl&x)4.5.2友元類

一個類也可以作為另一個類的友元。例如:classY{//…};classX{//…friendY;//聲明類Y為類X的友元類//…};

一個類被聲明為另一個類的友元時,它的所有成員函數(shù)都成為另一個類的友元函數(shù)。4.5.2友元類一個類也可以作為另一個類的友元。一個類【例】友元類的示例。#include<iostream>classSample{intx;public:Sample(inta){x=a;}

friendclassOperation;//把類Operation當作友元(好朋友)};【例】友元類的示例。classOperation{public:intadd(Sample&s1,Sample&s2){returns1.x+s2.x;}intsubtract(Sample&s1,constSample&s2){returns1.x-s2.x;}};intmain(

){Samples1(10),s2(6);Operationobj;cout<<obj.add(s1,s2)<<endl;cout<<obj.subtract(s1,s2)<<endl;return0;}classOperation{4.6類的組合

如果一個類的對象是另一個類的數(shù)據(jù)成員,則稱這樣的數(shù)據(jù)成員為對象成員(子對象)。例如:classA{//...};classB{Aa;//類A的對象a為類B的對象成員public://…};使用對象成員要注意的問題是對象成員的初始化問題,即類B的構(gòu)造函數(shù)如何定義?4.6類的組合如果一個類的對象是另一個類的數(shù)據(jù)成例如有以下的類:

classX{類名1對象成員名1;類名2對象成員名2;…類名n對象成員名n;};一般來說,類X的構(gòu)造函數(shù)的定義形式為;X::X(形參表0):對象成員名1(形參表1),…,對象成員名i(形參表i),…,對象成員名n(形參表n){//…構(gòu)造函數(shù)體}

C--面向?qū)ο蟪绦蛟O計-第四章-類與對象(二)課件練習:寫出程序的運行結(jié)果#include<iostream.h>classObject{ intval;public: Object(); //構(gòu)造函數(shù) Object(inti);//構(gòu)造函數(shù) ~Object(); //析構(gòu)函數(shù)};練習:寫出程序的運行結(jié)果#include<iostream.Object::Object()//默認構(gòu)造函數(shù){ val=0; cout<<"\nDefaultconstructorforObject.\n";}Object::Object(inti) //構(gòu)造函數(shù)定義{ val=i; cout<<"\nConstructorforObject:"<<val<<endl;}Object::~Object() //析構(gòu)函數(shù)定義{ cout<<"\nDestructorforObject:"<<val<<endl;}Object::Object()//默認構(gòu)造函classContainer//定義新類,它含Object的對象{private: intdate; Objectone; //對象成員 Objecttwo; //對象成員public: Container(); //構(gòu)造函數(shù) Container(inti,intj,intk); //構(gòu)造函數(shù) ~Container(); //析構(gòu)函數(shù)};classContainer//定義新類,它含ObjecContainer::Container() //默認構(gòu)造函數(shù)定義{date=0;cout<<"\nDefaultconstructorforContainer.\n";}Container::Container(inti,intj,intk):two(i),one(j){date=k;cout<<"\nConstructorforContainer.\n";}Container::~Container(){cout<<"\nDestructorforContainer.\n";}intmain() //主程序{cout<<"\n...Enteringmain...\n";Containerobj(5,6,10);cout<<"\n...Exitingmain...\n";return0;}Container::Container() //默認構(gòu)造4-7共享數(shù)據(jù)的保護

4.7.1常引用如果在說明引用時用const修飾,則被說明的引用為常引用。常引用的說明形式如下:

const類型說明符&引用名例如:inta=5;constint&b=a;其中,b是一個常引用,它所引用的對象不允許更改。4-7共享數(shù)據(jù)的保護4.7.1常引用例4.28常引用作函數(shù)形參。#include<iostream.h>intadd(constint&i,constint&j);voidmain(){ inta=20; intb=30;cout<<a<<"+"<<b<<"="<<add(a,b)<<endl;}intadd(constint&i,const&j){ returni+j;}例4.28常引用作函數(shù)形參。4.7.2常對象

如果在說明對象時用const修飾,則被說明的對象為常對象。常對象的說明形式如下:

類名const對象名[(參數(shù)表)];或者

const類名對象名[(參數(shù)表)];在定義對象時必須進行初始化,而且不能被更新。4.7.2常對象如果在說明對象時用const例4.29非常對象和常對象的比較。#include<iostream.h>classSample{public:intm;Sample(inti,intj){m=i;n=j;}voidsetvalue(inti){n=i;}voiddisply(){cout<<"m="<<m<<endl;cout<<"n="<<n<<endl;}private:intn;};voidmain(){Samplea(10,20);a.setvalue(40);a.m=30;a.disply();}例4.29非常對象和常對象的比較。4.7.3常對象成員

1.常數(shù)據(jù)成員使用const說明的數(shù)據(jù)成員稱為常數(shù)據(jù)成員。如果在一個類中說明了常數(shù)據(jù)成員,那么構(gòu)造函數(shù)就只能通過初始化列表對該數(shù)據(jù)成員進行初始化,而任何其他函數(shù)都不能對該成員賦值。

4.7.3常對象成員1.常數(shù)據(jù)成員例4.30常數(shù)據(jù)成員舉例。#include<iostream.h>classDa

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論