Lập trình hướng đối tượng với C++

Chia sẻ: Than Kha Tu | Ngày: | Loại File: PDF | Số trang:52

1
1.194
lượt xem
579
download

Lập trình hướng đối tượng với C++

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

- C++ là một sự mở rộng của C,do đó có thể sử dụng một chương trình biên dịch C++ để dịch và thực hiện các chương trình viết bằng C. - C yêu cầu các chú thích nằm giữa /* và */.C++ cho phép tạo một chú thích bắt đầu bằng "//" cho đến hết dòng.

Chủ đề:
Lưu

Nội dung Text: Lập trình hướng đối tượng với C++

  1. L P TRÌNH HƯ NG I TƯ NG V I C++ Mét sè tiÖn Ých vµ më réng cña C++ so víi C M C TIÊU C A BÀI NÀY GIÚP NGƯ I H C Nh p/xu t d li u s d ng toán t cin và cout Vi t chú thích trên m t dòng, khai báo bi n m i nơi, c p phát và thu h i b nh ng s d ng toán new và delete, Gi i các bài t p có s d ng k thu t ch ng hàm, thâm s ng m nh. A/ TÓM T T LÝ THUY T - C++ là m t s m i r ng c a C, do ó có th s d ng m t chương trình biên d ch C++ d ch và th c hi n các chương trình vi t b ng C - C yêu c u các chú thích n m gi a /* và */. C++ cho phép t o m t chú thích b t u b ng “//” cho n h t dòng - C++ cho phép khai báo tuỳ ý. Th m chí có th khai báo bi n trong ph n kh i t o c a câu lênh l p for - C++ cho phép truy n tham s cho hàm b ng tham chi u. i u này tương t như truy n tham bi n cho chương trình con trong ngôn ng l p trình PASCAL. Trong l i g i hàm ta dùng tên bi n và bi n ó s ư c truy n cho hàm qua tham chi u. i u ó cho phép thao tác tr c ti p trên bi n ư c truy n ch không ph i gián ti p qua bi n tr . - Toán t new và delete trong C++ ư c dùng qu n lý b nh ng thay vì các hàm c p phát ng c a C - C++ cho phép ngư i vi t chương trình mô t các giá tr ng m nh cho các tham s c a hàm, nh ó hàm có th ư c g i v i m t danh sách các tham s không . - Toán t “::” cho phép truy nh p bi n toàn c c khi ng th i s d ng bi n c c b và toàn c c cùng tên. - Có th nh nghĩa các hàm cùng tên v i các tham s khác nhau. Hai hàm cùng tên s ư c phân bi t nh giá tr tr v và danh sách ki u các tham s . B. M T S LƯU Ý (Các l i thư ng g p, m t s thói quen l p trình t t...) Các l i thư ng g p Quên óng */ cho các chú thích Khai báo bi n sau khi bi n ư c s d ng S d ng l nh return tr v giá tr nhưng khi nh nghĩa hàm l i mô t hàm ki u void ho c ngư c l i, quên câu l nh này trong trư ng h p hàm yêu c u giá tr tr v . Không có hàm nguyên m u cho các hàm B qua kh i t o cho các bi n tham chi u Thay i giá tr c a các h ng T o các hàm cùng tên, cùng tham s . M t s thói quen l p trình t t S d ng “//” tránh l i không óng */ khi chú thích n m g n trong m t dòng. S d ng các kh năng vào ra m i c a C++ chương trình d c hơn. t các khai báo biên lên u kh i l nh. Ch dùng t khoá inline v i các hàm “nh ”,”không ph c t p”. S d ng con tr truy n tham s cho hàm khi c n thay i giá tr tham s , còn tham chi u dùng truy n các tham s có kích thư c l n mà không có nhu c u thay i n i dung. Tránh s d ng bi n cùng tên cho nhi u m c ch khác nhau trong chương trình. Trang 1
  2. L P TRÌNH HƯ NG I TƯ NG V I C++ C/ BÀI T P M U Ví d 1: C++ ch p nh n hai ki u chú thích. Các l p trình viên b ng C ã quen v i cách chú thích b ng /*…*/. Trình biên d ch s b qua m i th n m gi a /*…*/. Xét chương trình sau : CT1_1.CPP /* 1. Chương trình in các s t 0 n 9. */ #include <iostream.h> void main() { int I; for(I = 0; I < 10 ; ++ I)// 0 - 9 cout<<I<<"\n"; // In ra 0 - 9 } 2. M i th n m gi a /*…*/ t dòng 1 n dòng 3 u ư c chương trình b qua. Chương trình này còn minh h a cách chú thích th hai. ó là cách chú thích b t u b ng // dòng 8 và dòng 9. k t qu Nói chung, ki u chú thích /*…*/ ư c dùng cho các kh i chú thích l n g m nhi u dòng, còn ki u // ư c dùng cho các chú thích m t dòng. Ví d 2: Chương trình nh p vào hai s . Tính t ng và hi u c a hai s v a nh p. CT1_2.CPP #include <iostream.h> void main() { int X, Y; cout<< "Nhap vao mot so X:"; Trang 2
  3. L P TRÌNH HƯ NG I TƯ NG V I C++ cin>>X; cout<< "Nhap vao mot so Y:"; cin>>Y; cout<<"Tong cua chung:"<<X+Y<<"\n"; cout<<"Hieu cua chung:"<<X-Y<<"\n"; } Ví d 3 : S d ng toán t xu t nh p vi t th c ơn cho chương trình: CT1_2.CPP #include <iostream.h> void menu() { cout<<” Menu \n”; cout<<”1. Cong viec 1\n”; cout<<”2. Cong viec 2\n”; cout<<”3. Cong viec 3\n”; cout<<”4. Ket thuc chuong trinh \n\n”; } void main() { int lc; do { // viet menu len man hinh menu(); //lay lua chon cout<<”Ban hay chon cong viec can thuc hien:1->4”;cin>>lc; switch(lc) { case 1:cout<<”Thuc hien cong viec 1\n”; break; case 2:cout<<”Thuc hien cong viec 2\n”; break; case 3:cout<<”Thuc hien cong viec 3\n”; break; } //lap cho den khi nguoi su dung lua chon 4 } while(lc!=4); } Ví d 4 : Tìm l i sai c a o n chương trình sau: int n; cin>>n; for(int i=0;i<n;i++) { int a[100]; cin>>a[i]; } for(i=0;i<n;i++) cout<<a[i]; L ig i Chương trình b l i trong vòng for th hai do bi n m ng a không ư c nh nghĩa. M ng a ư c khai báo trong vòng for th nh t ch có t m ho t ng trong vòng for ó mài thôi. Do v y, chương trình không th bi t trong vòng l p for th hai. Chú ý Trang 3
  4. L P TRÌNH HƯ NG I TƯ NG V I C++ bi n nguyên i ư c khai báo trong dòng l nh for có v trí tương ương v i vi c khai báo i bên ngoài for. Vì v y, trong vòng for th hai ta s d ng bi n i nhưng chương trình không báo l i. Ví d 5 : Tìm l i sai cho các khai báo prototype hàm dư i ây (các hài này ư c khai báo trong cùng m t chương trình) int func1(int); // (1) float func1(int); // (2) int func1(float); //(3) void func1(int=0,int); //(4) void func2(int,int=0); //(5) void func2(int); //(6) void func2(float); //(7) L i g i: Trong nh nghĩa ch ng hàm, trình biên d ch phân bi t các hàm b i ki u d li u tr ra c a hàm mà ch phân bi t b i danh sách tham s c a hàm. Do v y hàm 1 và hàm 2 b nh nghĩa ch ng lên nhau và trình biên d ch báo l i. Gi a hàm 2 và hàm 3 không có l i b i chúng khác nhau b i ki u d li u c a tham s . Trong hàm 4 ta ã s d ng sai cách truy n giá tr m c nh cho tham s . Không báo gi truy n giá tr m c nh cho m t tham s trư c m t tham s không ư c truy n giá tr ng m nh. Trong cách nh nghĩa hai hàm 5 và 6 có s nh p nh ng. Khi ta g i hàm func2 v i tham s là m t s nguyên thì trình biên d ch không bi t là s g i hàm 5 hay hàm 6 b i vì c hai hàm này u ư c. Trong trư ng h p này trình biên d ch cũng thông báo l i. Ví d 6: Tìm l i sai(l i cú pháp và b nh ) cho chương trình sau: int & refl() { int a=5; return a; } int & rè2(int a) { a++; return a; } int & ref3(int & a) { a++; return a; } int a=5; int &r1; int &r2=22; int &r3=a; int &r4=ref3(5); int &r5=ref3(a); Tr l i: Trong các hàm có k t qu tr v là m t tham chi u, chúng ta luôn ph i chú ý r ng bi n ư c tr l i có giá tr là tham chi u không b xoá kho i b nh chương trình khi k t thúc th c hi n hàm. Do v y hai hàm ref1 và ref2 là sai b i vì nó tr v tham chi u t i biên mà a l i là bi n c c b trong ref1 và là tham s trong ref2 ch ư c t o ra t m th i Trang 4
  5. L P TRÌNH HƯ NG I TƯ NG V I C++ trên stack khi g i hàm và xoá kh i stack khi k t thúc hàm. Hàm ref3 không có l i vì a là m t tham chi u t i m t bi n không n m trong hàm. Trong khái báo các tham chi u ph i ư c g n v i m t bi n nào ó trong b nh . Do v y các khai báo r1, r2 là sai. L i g i ref3(5) cũng là sai b i vì tham s cho hàm ph i là tham chi u n m t bi n, trong khi ó ta l i truy n vào h ng s . Ví d 7: Cho bi t k t qu th c hi n chương trình sau: #include <iostream.h> int & foo(int &a,int b) { b+=a; if (b>5) a++; return a; } void main() { int i=2,j=4; int k=foo(i,j); k++; cout<<i<<” “<<j<<” “<<k<<endl; int &l=foo(i,j); l++ ; cout<<i<<” “<<j<<” “<<l<<endl; } L i g i: Trong chương trình trên c n chú ý hai i m. Thi nh t là ta truy n vào cho hàm tham chi u c a bi n i ch không ph i bi n i. Do v y, m i thay i c a tham s này trong hàm là thay i t i bi n i ư c tham chi u t i. Tương t như v y v i tham chi u l. Tham chi u l ư c xác l p b ng tham chi u tr ra c a hàm chính là tham chi u t i bi n i. Do v y m i thay i l chính là thay i i. Ví d 8: Vi t m t hàm hoanvi dùng hoán v hai s nguyên. Sau ó viêt chương trình nh p và s p x p m t m ng s nguyên. Tr l i: CT1_8.CPP #include <iostream.h> void hoanvi(int &a,int &b) { int tam=a; a=b; b=tam; } void main() { // Nhap du lieu int n; cout<<” Ban hay cho so phan tu cua mang n=”;cin>>n; //Cap phat bo nho cho mang int *a=new int(n); cout<<”\n Hay nhap gia tri cho cac phan tu cua mang \n”; for(int i=0;i<n;++i) { cout<<”a[“<<i<<”]=”;cin>>a[i]; } // Sap xep for(i=0;i<n-1;i++) for(int j=i++;j<n;j++) Trang 5
  6. L P TRÌNH HƯ NG I TƯ NG V I C++ if (a[i]>a[j]) hoanvi(a[i],a[j]); // In ket qua cout<<”\n Cac phan tu cua mang sau khi da sap xep la \n”; for(i=0;i<n;i++) cout<<a[i]<<” “; delete a; } Ví d 9: Chương trình t o m t m ng ng, kh i ng m ng này v i các giá tr ng u nhiên và s p x p chúng. CT1_9.CPP #include <iostream.h> #include <time.h> #include <stdlib.h> void main() { int N; cout<<"Nhap vao so phan tu cua mang:"; cin>>N; int *P=new int[N]; if (P==NULL) { cout<<"Khong con bo nho de cap phat\n"; } srand((unsigned)time(NULL)); for(int I=0;I<N;++I) P[I]=rand()%100; //T o các s ng u nhiên t 0 n 99 cout<<"Mang truoc khi sap xep\n"; for(I=0;I<N;++I) cout<<P[I]<<" "; for(I=0;I<N-1;++I) for(int J=I+1;J<N;++J) if (P[I]>P[J]) { int Temp=P[I]; P[I]=P[J]; P[J]=Temp; } cout<<"\nMang sau khi sap xep\n"; for(I=0;I<N;++I) cout<<P[I]<<" "; delete []P; } k t qu Trang 6
  7. L P TRÌNH HƯ NG I TƯ NG V I C++ Ví d 10: Chương trình c ng hai ma tr n trong ó m i ma tr n ư c c p phát ng. Chúng ta có th xem m ng hai chi u như m ng m t chi u như hình 1.2 dư i ây Hình 1.2: M ng hai chi u có th xem như m ng m t chi u. G i X là m ng hai chi u có kích thư c m dòng và n c t. A là m ng m t chi u tương ng. N u X[i][j] chính là A[k] thì k = i*n + j Chúng ta có chương trình như sau : CT1_10.CPP #include <iostream.h> #include <conio.h> //prototype void AddMatrix(int * A,int *B,int*C,int M,int N); int AllocMatrix(int **A,int M,int N); void FreeMatrix(int *A); void InputMatrix(int *A,int M,int N,char Symbol); void DisplayMatrix(int *A,int M,int N); int main() { int M,N; int *A = NULL,*B = NULL,*C = NULL; clrscr(); cout<<"Nhap so dong cua ma tran:"; cin>>M; cout<<"Nhap so cot cua ma tran:"; cin>>N; //C p phát vùng nh cho ma tr n A if (!AllocMatrix(&A,M,N)) { //endl: Xu t ra kí t xu ng dòng (‘\n’) cout<<"Khong con du bo nho!"<<endl; return 1; } //C p phát vùng nh cho ma tr n B if (!AllocMatrix(&B,M,N)) { Trang 7
  8. L P TRÌNH HƯ NG I TƯ NG V I C++ cout<<"Khong con du bo nho!"<<endl; FreeMatrix(A);//Gi i phóng vùng nh A return 1; } //C p phát vùng nh cho ma tr n C if (!AllocMatrix(&C,M,N)) { cout<<"Khong con du bo nho!"<<endl; FreeMatrix(A);//Gi i phóng vùng nh A FreeMatrix(B);//Gi i phóng vùng nh B return 1; } cout<<"Nhap ma tran thu 1"<<endl; InputMatrix(A,M,N,'A'); cout<<"Nhap ma tran thu 2"<<endl; InputMatrix(B,M,N,'B'); clrscr(); cout<<"Ma tran thu 1"<<endl; DisplayMatrix(A,M,N); cout<<"Ma tran thu 2"<<endl; DisplayMatrix(B,M,N); AddMatrix(A,B,C,M,N); cout<<"Tong hai ma tran"<<endl; DisplayMatrix(C,M,N); FreeMatrix(A);//Gi i phóng vùng nh A FreeMatrix(B);//Gi i phóng vùng nh B FreeMatrix(C);//Gi i phóng vùng nh C return 0; } //C ng hai ma tr n void AddMatrix(int *A,int *B,int*C,int M,int N) { for(int I=0;I<M*N;++I) C[I] = A[I] + B[I]; } //C p phát vùng nh cho ma tr n int AllocMatrix(int **A,int M,int N) { *A = new int [M*N]; if (*A == NULL) return 0; return 1; } //Gi i phóng vùng nh void FreeMatrix(int *A) { if (A!=NULL) delete [] A; } //Nh p các giá tr c a ma tr n void InputMatrix(int *A,int M,int N,char Symbol) { for(int I=0;I<M;++I) for(int J=0;J<N;++J) { cout<<Symbol<<"["<<I<<"]["<<J<<"]="; cin>>A[I*N+J]; } } //Hi n th ma tr n void DisplayMatrix(int *A,int M,int N) { Trang 8
  9. L P TRÌNH HƯ NG I TƯ NG V I C++ for(int I=0;I<M;++I) { for(int J=0;J<N;++J) { out.width(7);//Hien thi canh le phai voi chieu dai 7 ky tu cout<<A[I*N+J]; } cout<<endl; } } kt qu D/ BÀI T P T GI I Câu h i tr c nghi m Câu 1: Cho bi t giá tr c a k sau khi th c hi n o n chương trình int i=5,k; { int i=6; ::i--; k=i; } k-=i; V i các k t qu : a) k=0 b) k=1 c) k=2 d)k=3 Câu 2: Tìm l i g i hàm sai cho hàm sau: void func(int i=0,int j=0); a)func() b)dunc(1); Trang 9
  10. L P TRÌNH HƯ NG I TƯ NG V I C++ c)func(1.5,2.5); d)func(1,2); Câu 3: Cho bi t giá tr c a y sau khi th c hi n: int &foo(int &a) { a++; return a; } int i=5; int &r=foo(i); r++; a) i=5; b) i=6; c) i=7; d) không câu nào úng Câu 4: Tìm giá tr c a x, y: void test(int &a, int b) { a+=b; b=a; } int x=1,y=2; test(x,y); a) x=1,y=2; b) x=1,y=3 c) x=3,y=2 d) x=3,y=3 Bài t p t gi i Bài 1.1: Anh (ch ) hãy vi t l i chương trình sau b ng cách s d ng l i các dòng nh p/xu t trong C++. /* Chương trình tìm m u chung nh nh t */ #include <stdio.h> void main() { int a,b,i,min; printf("Nhap vao hai so:"); scanf("%d%d",&a,&b); min=a>b?b:a; Trang 10
  11. L P TRÌNH HƯ NG I TƯ NG V I C++ for(i = 2;i<min;++i) if (((a%i)==0)&&((b%i)==0)) break; if(i==min) { printf("Khong co mau chung nho nhat"); } printf("Mau chung nho nhat la %d\n",i); } Bài 1.2: Vi t chương trình nh p vào s nguyên dương h (2<h<23), sau ó in ra các tam giác có chi u cao là h như các hình sau: Bài 1.3: M t tam giác vuông có th có t t c các c nh là các s nguyên. T p c a ba s nguyên c a các c nh c a m t tam giác vuông ư c g i là b ba Pitago. ó là t ng bình phương c a hai c nh b ng bình phương c a c nh huy n, ch ng h n b ba Pitago (3, 4, 5). Vi t chương trình tìm t t c các b ba Pitago như th sao cho t t c các c nh không quá 500. Bài 1.4: Vi t chương trình in b ng c a các s t 1 n 256 dư i d ng nh phân, bát phân và th p l c phân tương ng. Bài 1.5: Vi t chương trình nh p vào m t s nguyên dương n. Ki m tra xem s nguyên n có thu c dãy Fibonacci không? Bài 1.6: Vi t chương trình nhân hai ma trân Amxn và Bnxp. M i ma tr n ư c c p phát ng và các giá tr c a chúng phát sinh ng u nhiên (V i m, n và p nh p t bàn phím). Trang 11
  12. L P TRÌNH HƯ NG I TƯ NG V I C++ Bài 1.7: Vi t chương trình t o m t m ng m t chi u ng có kích thư c là n (n nh p t bàn phím). Các giá tr c a m ng này ư c phát sinh ng u nhiên trên o n [a, b] v i a và b u nh p t bàn phím. Hãy tìm s dương nh nh t và s âm l n nh t trong m ng; n u không có s dương nh nh t ho c s âm l n nh t thì xu t thông báo "không có s dương nh nh t" ho c "không có s âm l n nh t". Bài 1.8: Anh (ch ) hãy vi t m t hàm tính bình phương c a m t s . Hàm s tr v giá tr bình phương c a tham s và có ki u cùng ki u v i tham s . Bài 1.9: Trong ngôn ng C, chúng ta có hàm chuy n i m t chu i sang s , tùy thu c vào d ng c a chu i chúng ta có các hàm chuy n i sau : int atoi(const char *s); Chuy n i m t chu i s thành s nguyên ki u int. long atol(const char *s); Chuy n i m t chu i s thành s nguyên ki u long. double atof(const char *s); Chuy n i m t chu i s thành s th c ki u double. Anh (ch ) hãy vi t m t hàm có tên là aton (ascii to number) chuy n i chu i sang các d ng s tương ng. Bài 1.10: Anh ch hãy vi t các hàm sau: Hàm ComputeCircle() tính di n tích s và chu vi c c a m t ư ng tròn bán kính r. Hàm này có prototype như sau: void ComputeCircle(float & s, float &c, float r = 1.0); Hàm ComputeRectangle() tính di n tích s và chu vi p c a m t hình ch nh t có chi u cao h và chi u r ng w. Hàm này có prototype như sau: void ComputeRectangle(float & s, float &p, float h = 1.0, float w = 1.0); Hàm ComputeTriangle() tính di n tích s và chu vi p c a m t tam giác có ba c nh a,b và c. Hàm này có prototype như sau: void ComputeTriangle(float & s, float &p, float a = 1.0, float b = 1.0, float c = 1.0); Hàm ComputeSphere() tính th tích v và di n tích b m t s c a m t hình c u có bán kính r. Hàm này có prototype như sau: void ComputeSphere(float & v, float &s, float r = 1.0); Trang 12
  13. L P TRÌNH HƯ NG I TƯ NG V I C++ Hàm ComputeCylinder() tính th tích v và di n tích b m t s c a m t hình tr có bán kính r và chi u cao h. Hàm này có prototype như sau: void ComputeCylinder(float & v, float &s, float r = 1.0 , float h = 1.0); Bài 1.11: Vi t chương trình qu n lý i m h c sinh v i c u trúc danh sách n i ơn. Trong chương trình s d ng toán t vào ra và toán t new c p phát b nh ng. Bài 1.12: Vi t m t hàm th c hi n vi c s p x p m t m ng s nguyên theo chi u tăng d n ho c gi m d n. Hàm này t ng m c nh ki u s p x p theo chi u tăng d n. Bài 1.13: Vi t m t hàm gi i phương trình b c hai. Hàm này tr l i thông báo r ng phương trình có nghi m hay không có nghi m kép. N u có nghi m thì nghi m s ư c lưu vào tham s x1, x2 và ư c truy n như là tham bi n. Bài 1.14:Vi t m t hàm tìm v trí xu t hi n u tiên c a m t t khoá trong m t xâu. Hàm này tr l i v trí tìm th y c a t khoá trong xâu(b t u t 0) và thay i con tr xâu ư c truy n vào thành v trí c a ký t ngay sau ký t cu i cùng c a t khoá. T khoá c n tìm ư c ưa vào như là m t tham s và có m t giá tr m c nh. Trang 13
  14. L P TRÌNH HƯ NG I TƯ NG V I C++ §èi t−îng vµ líp (Class and Object) M C TIÊU C A BÀI NÀY GIÚP NGƯ I H C Phân tích ư c khái ni m óng gói d li u Khai báo và s d ng m t l p Khai báo và s d ng i tư ng. S d ng hàm thi t l p và hàm hu b Khai báo và s d ng hàm thi t l p sao chép Vai trò c a hàm thi t l p ng m nh A/ NH C L I LÝ THUY T Trong C++, tên c u trúc là m t ki u d li u không c n kèm theo t khoá struct. L p cho phép ngư i l p trình mô t các i tư ng th c t v i các thu c tính và hành vi. Trong C++ thư ng s d ng t khoá class khai báo m t l p. Tên l p là m t ki u d li u dùng khi khai báo các i tư ng thư c l p(các th hi n c th c a l p). Thu c tính c a i tư ng trong m t l p ư c mô t dư i d ng các bi n th hi n. Các hành vi là các hàm thành ph n bên trong l p. Có hai cách nh nghĩa các hàm thành ph n c a m t l p; khi nh nghĩa hàm thành ph n bên ngoài khai báo l p ph i t trư c tên hàm thành ph n tên c a l p và toán t “::” phân bi t v i các hàm t do cùng tên. Ch nên nh nghĩa hàm thành ph n bên trong khai báo l p khi nó không quá ph c t p cho chương trình d c. Có th khai báo và s d ng các con tr i tư ng, tham chi u i tư ng. Hai t khoá public và private dùng ch nh thu c tính truy nh p cho các thành ph n( d li u/hàm) khai báo bên trong l p. Thành ph n bên trong l p ư c khai báo public có th truy nh p t m i hàm khai báo m t i tư ng thu c l p ó. Thành ph n private trong m t i tư ng ch có th truy nh p ư c b i các hàm thành ph n c a i tư ng ho c các hàm thành ph n c a l p dùng t o i tư ng( ây tính c trư ng h p i tư ng là tham s c a hàm thành ph n) Hai hàm thành ph n c bi t c a m t l p g i là hàm thi t l p và hàm hu b . Hàm thi t l p ư c g i t ng(ng m nh) m i khi m t i tư ng ư c t o ra và hàm hu b ư cg it ng khi i tư ng h t th i gian s d ng. Hàm thi t l p có thu c tính public, cùng tên v i tên l p nhưng không có giá tr tr v. M t l p có ít nh t hai hàm thi t l p: hàm thi t l p sao chép ng m nh và hàm thi t l p do ngư i l p trình thi t l p(n u không mô t tư ng minh thì ó là hàm thi t l p ng m nh). Hàm hu b cũng có thu c tính public, không tham s , không giá tr tr v và có tên b t u b i ~ theo sau là tên c a l p. Bên trong ph m v l p( nh nghĩa c a các hàm thành ph n), các thành ph n c a l p ư c g i theo tên. Trư ng h p có m t i tư ng toàn c c cùng tên, mu n xác nh i tư ng y ph i s d ng toán t “::”. L p có th ch a các thành ph n d li u là các i tư ng c a l p khác. Các i tư ng này ph i ư c kh i t o trư c i tư ng tương ng c a l p bao. M i i tư ng có m t con tr ch n b n thân nó, ta g i ó là con tr this. Con tr này có th ư c s d ng tư ng minh ho c ng m nh tham xác nh các thành ph n bên trong i tư ng. Thông thư ng ngư i ta s d ng this dư i d ng ng m nh. Hàm b n c a m t l p là hàm không thu c l p nhưng có quy n truy nh p t i các thành ph n private c a l p. Trang 14
  15. L P TRÌNH HƯ NG I TƯ NG V I C++ Khai báo b n b có th khai báo b t kỳ ch nào trong khai báo l p. B. M T S LƯU Ý (Các l i thư ng g p, m t s thói quen l p trình t t...) Các l i thư ng g p Quên d u “;” cu i khai báo l p Kh i t o các thành ph n giá tr trong khai báo l p nh nghĩa ch ng m t hàm thành ph n b ng m t hàm không thu c l p Truy nh p n các thành ph n riêng c a l p t bên ngoài ph m vi l p Khai báo giá tr tr v cho hàm thi t l p và hàm hu b Khai báo hàm hu b có tham s , nh nghĩa ch ng hàm hu b G i tư ng minh hàm thi t l p và hàm hu b G i các thàm thành ph n bên trong hàm thi t l p M t s thói quen l p trình t t Nhóm t t c c các thành ph n có cùng thu c tính truy nh p m t nơi trương khái báo l p, nh v y m i t khoá mô t truy nh p ch ư c xác nh m t l n. Khai báo l p vì v y d c hơn. Theo kinh nghi m, các thành ph n private trư c tiên r i n các thành ph n protectech, cu i cùng là t khoá public. nh nghĩa t t c các hàm thành ph n bên ngoài khai báo l p. i u này nh m ph n bi t gi a hai ph n giao di n và ph n cài t l p. S d ng các ti n x lý #ifndef, #define, #endif cho các t p tin tiêu ch xu t hi n m t l n bên trong chương trinhg ngu n. Ph i nh nghĩa các hàm thi t l p m b o r ng các i tư ng u ư c kh i t o n i dung m t cách úng n. C/ BÀI T P M U Ví d 1: nh nghĩa m t l p mô t và x lý các i m trên màn hình ho . V i tên l p là point L i gi i + Các thu c tính c a l p int x;// hoành (c t) int y;// tung ( hàng) int m;// màu + Các phương th c Nh p d li u m t i m Hi n th m t i m nm t i m L p i m ư c xây d ng như sau: class point { private: int x,y,m; public: void nhapsl(); void hien(); void an() { putpixcel(x,y,getbkcolor()); } void point::nhap() { cout<<”\n Nh p hoành (c t) và tung (hàng) c i m:”; cin>>x>>y; cout<<” Nh p màu c a i m:”;cin>>m; } void point::hien() Trang 15
  16. L P TRÌNH HƯ NG I TƯ NG V I C++ { int mau_ht; mau_ht=getcolor(); putpixcel(x,y,m); setcolor(mau_ht); } Nh n xét: + Trong c ba phương th c( dù vi t trong hay vi t ngoài nh nghĩa l p) u ư c truy nh p n các thu c tính x,y và m c a l p. + Các phương th c vi t bên trong nh nghĩa l p (như phương th c an()) ư c vi t như m t hàm bình thư ng. +Khi xây d ng các phương th c bên ngoài l p, c n dùng thêm tên l p và toán t ph m vi :: t ngay trư c tên phương th c quy nh rõ ây là phương th c c a l p nào. Ví d 2: Chúng ta xây d ng ki u c u trúc Time v i ba thành viên s nguyên: Hour, Minute và second. Chương trình nh nghĩa m t c u trúc Time g i là DinnerTime. Chương trình in th i gian dư i d ng gi quân i và d ng chu n. CT2_2.CPP #include <iostream.h> class Time { public: Time(); //Constructor void SetTime(int, int, int); //Thiet lap Hour, Minute va Second void PrintMilitary(); //In thoi gian duoi dang gio quan doi void PrintStandard(); //In thoi gian duoi dang chuan private: int Hour; // 0 - 23 int Minute; // 0 - 59 int Second; // 0 - 59 }; //Constructor khoi tao moi thanh vien du lieu voi gia tri zero //Bao dam tat ca cac doi tuong bat dau o trang thai thich hop Time::Time() { Hour = Minute = Second = 0; } //Thiet lap mot gia tri Time moi su dung gio quan doi //Thuc hien viec kiem tra tinh hop le tren cac gia tri du lieu //Thiet lap ca gia tri khong hop le thanh zero void Time::SetTime(int H, int M, int S) { Hour = (H >= 0 && H < 24) ? H : 0; Minute = (M >= 0 && M < 60) ? M : 0; Second = (S >= 0 && S < 60) ? S : 0; } //In thoi gian duoi dang gio quan doi void Time::PrintMilitary() { cout << (Hour < 10 ? "0" : "") << Hour << ":" Trang 16
  17. L P TRÌNH HƯ NG I TƯ NG V I C++ << (Minute < 10 ? "0" : "") << Minute << ":" << (Second < 10 ? "0" : "") << Second; } //In thoi gian duoi dang chuan void Time::PrintStandard() { cout << ((Hour == 0 || Hour == 12) ? 12 : Hour % 12) << ":" << (Minute < 10 ? "0" : "") << Minute << ":" << (Second < 10 ? "0" : "") << Second << (Hour < 12 ? " AM" : " PM"); } int main() { Time T; cout << "The initial military time is "; T.PrintMilitary(); cout << endl << "The initial standard time is "; T.PrintStandard(); T.SetTime(13, 27, 6); cout << endl << endl << "Military time after SetTime is "; T.PrintMilitary(); cout << endl << "Standard time after SetTime is "; T.PrintStandard(); T.SetTime(99, 99, 99); //Thu thiet lap gia tri khong hop le cout << endl << endl << "After attempting invalid settings:" << endl << "Military time: "; T.PrintMilitary(); cout << endl << "Standard time: "; T.PrintStandard(); cout << endl; return 0; } k t qu Trang 17
  18. L P TRÌNH HƯ NG I TƯ NG V I C++ Ví d 3 Nh p m t ngày tháng năm t bàn phím sau ó in ra màn hình. L i gi i CT2_3.CPP #include <iostream.h> #include <conio.h> #define FALSE 0 #define TRUE !FALSE char* Thang[]={"","gieng","hai","ba","bon","nam","sau","bay","tam", "chin","muoi","muoi mot","chap"}; int NgayThang[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; class CDate { private: int mNgay,mThang,mNam; int laNamNhuan(int); public: void nhap(); int hopLe(); void in(); }; void CDate::nhap() { cout<<endl<<"Ngay: ";cin>>mNgay; cout<<endl<<"Thang: "; cin>>mThang; cout<<endl<<"Nam: ";cin>>mNam; } int CDate::hopLe() { if ((mThang<1)||(mThang>12)) return FALSE; else { if ((mNgay>=1)&&(mNgay<=NgayThang[mThang])) return TRUE; else if ((mNgay==29)&&laNamNhuan(mNgay)) return TRUE; else return FALSE; } } int CDate::laNamNhuan(int nam) { if (((nam%400)==0)||(((nam%4)==0)&&((nam%100)!=0))) return TRUE; else return FALSE; } void CDate::in() { cout<<endl<<"Ban da nhap vao ngay "<<mNgay; cout<<" thang "<<Thang[mThang]; cout<<" nam "<<mNam; } void main() { CDate ngay; ngay.nhap(); if (ngay.hopLe()) ngay.in(); else Trang 18
  19. L P TRÌNH HƯ NG I TƯ NG V I C++ cout<<"BAN NHAP NGAY KHONG HOP LE"; getch(); } Ví d 4 Ch ra các cách khai báo i tư ng có th cho các l p i tư ng dư i ây: class A { }; class B { B(int, int); public: B(int=0); }; class C { C(C&); public: C(); }; class D { public: D(D&); }; L i gi i V l pA Cách 1: S d ng hàm thi t l p ng m nh A a; ho c A a(); Cách 2: S d ng hàm thi t l p sao chép m c nh. Gi s a là m t i tư ng c a l p A ã ư c khai báo trư c. Ta có th khai báo i tư ng a1 như sau: A a1(a); ho c A a1=a; Nh n xét: Khi trong l p không có m t khai báo hàm thi t l p nào thì trình biên d ch t ng t o ra m t hàm thi t l p m c nh cho l p ó. Do v y ta có th s d ng khai báo i tư ng theo cách 1 cho l p A. Hai chách vi t khai báo A a1(a); và A a1=a; là hoàn toàn gi ng nhau, chúng u s d ng hàm thi t l p sao chép kh i t o i tư ng. V l pB Cách 1: S d ng hàm thi t l p B(int). Ví d : B b(5); Cách 2: S d ng hàm thi t l p B(int) v i tham s ng m nh là 0. B b; tương ương v i B b(0); Cách 3: S d ng hàm thi t l p sao chép tương t như l p A. B b1=b; Nh n xét Chúng ta ch có th khai báo i tư ng theo các hàm thi t l p có thu c tính quy n truy nh p là public Trang 19
  20. L P TRÌNH HƯ NG I TƯ NG V I C++ Trong hàm thi t l p cũng có th s d ng tham s ng m nh gi ng như các hàm thành ph n khác. V l p C: Ch có th khai báo i tư ng theo hàm thi t l p C() b i vì hàm thi t l p sao chép ã ư c ngư i s d ng nh nghĩa và t quy n truy xu t là private. Do v y không th dùng hàm thi t l p sao chép. Ví d : C c; V l p D: Không th khai báo i tư ng cho l p D b i vì trong l p này ch có hàm thi t l p sao chép. Hàm thi t l p chép mu n s d ng ư c thì ph i có m t i tư ng c a l p D. Do v y mu n khai báo ư c m t i tư ng thu c l p D thì trong l p D c n có m t hàm thi t l p khác sa chép. Ví d 5 Có bao nhiêu l n hàm thi t l p sao chép ư c g i trong o n mã chương trình sau: Widget f(Widget u) { Widget v(u); Widget w=v; return w; } void main() { Widget x; Widget y=f(f(x)); } L i gi i: Hàm thi t l p sao chép ư c g i 7 l n trong o n mã chương trình này. M i l n g i hàm f òi h i 3 l n g i n hàm thi t l p sao chép: khi tham sô truy n vào b ng giá tr u, khi v và w ư c kh i t o. L nh g i th b y là kh i t o y. Ví d 6 Cho bi t k t qu in ra màn hình c a chương trình sau: L i gi i CT 2_6.CPP #include <iostream.h> 3. #include <conio.h> class A { static int count; public: A() { count++;} ~A() { count--;} static void printNum() { cout<<” Gia tri cua count la:”<<count<<endl; } }; int A::count=0; void main() { clrscr(); A::printNum(); A a1; a1.printNum(); A *pa=new A; a1.printNum(); Trang 20
Đồng bộ tài khoản