1. Trang chủ
  2. » Công Nghệ Thông Tin

C++ và lập trình hướng đối tượng_chương 2 pptx

62 248 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

chơng 2 Hàm trong C++ Chơng này trình bầy những khả năng mới của C++ trong việc xây dựng sử dụng hàm. Đó là: + Kiểu tham chiếu việc truyền dữ liệu cho hàm bằng tham chiếu. + Đối tham chiếu hằng (const) + Đối có giá trị mặc định + Hàm trực tuyến + Việc định nghĩa chồng các hàm + Việc định nghĩa chồng các toán tử Đ 1. Biến tham chiếu (Reference variable) 1.1. Hai loại biến dùng trong C Trớc khi nói đến biến tham chiếu, chúng ta nhắc lại 2 loại biến gặp trong C là: Biến giá trị dùng để chứa dữ liệu (nguyên, thực, ký tự, ) Biến con trỏ dùng để chứa địa chỉ Các biến này đều đợc cung cấp bộ nhớ có địa chỉ. Ví dụ câu lệnh khai báo: double x , *px; sẽ tạo ra biến giá trị kiểu double x biến con trỏ kiểu double px. Biến x có vùng nhớ 8 byte, biến px có vùng nhớ 4 byte (nếu dùng mô hình Large). Biến x dùng để chứa giá trị kiểu double, ví dụ lệnh gán: x = 3.14; sẽ chứa giá trị 3.14 vào biễn x. Biến px dùng để chứa địa chỉ của một biến thực, ví dụ câu lệnh: px = &x ; sẽ lu trữ địa chỉ của biễn x vào con trỏ px. 1.2. Biến tham chiếu Trong C++ cho phép sử dụng loại biến thứ ba là biến tham chiếu. So với 2 loại biến quen biết nói trên, thì biến này có những đặc điểm sau: + Biến tham chiếu không đợc cấp phát bộ nhớ, không có địa chỉ riêng. + Nó dùng làm bí danh cho một biến (kiểu giá trị) nào đó nó sử dụng vùng nhớ của biến này. Ví dụ câu lệnh: float u, v, &r = u ; tạo ra các biến thực u, v biến tham chiếu thực r. Biến r không đợc cấp phát bộ nhớ, nó là một tên khác (bí danh) của u nó dùng chung vùng nhớ của biến u. Thuật ngữ: Khi r là bí danh (alias) của u thì ta nói r tham chiếu đến biến u. Nh vậy 2 thuật ngữ trên đợc hiểu nh nhau. ý nghĩa: Khi r là bí danh của u thì r dùng chung vùng nhớ của u, dó đó : + Trong mọi câu lệnh, viết u hay viết r đều có ý nghĩa nh nhau, vì đều truy nhập đến cùng một vùng nhớ. + Có thể dùng biến tham chiếu để truy nhập đến một biến kiểu giá trị. Ví dụ: int u, v, &r = u; r = 10 ; // u=10 cout << u ; // in ra số 10 r++ ; // u = 11 ++ u ; // r = 12 cout << r ; // in ra số 12 v = r ; // v=12 & r ; // Cho địa chỉ của u Công dụng: Biến tham chiếu thờng đợc sử dụng làm đối của hàm để cho phép hàm truy nhập đến các tham số biến trong lời gọi hàm. Vài chú ý về biến tham chiếu: a. Vì biến tham chiếu không có địa chỉ riêng, nó chỉ là bí danh của một biến kiểu giá trị nên trong khai báo phải chỉ rõ nó tham chiếu đến biến nào. Ví dụ nếu khai báo: double &x ; thì Trình biên dịch sẽ báo lỗi: Reference variable x must be initialized b. Biến tham chiếu có thể tham chiếu đến một phần tử mảng, ví dụ: int a[10] , &r = a[5]; r = 25 ; // a[5] = 25 c. Không cho phép khai báo mảng tham chiếu d. Biến tham chiếu có thể tham chiếu đến một hằng. Khi đó nó sẽ sử dụng vùng nhớ của hằng nó có thể làm thay đổi giá trị chứa trong vùng nhớ này. Ví dụ nếu khai báo: int &s = 23 ; thì Trình biên dịch đa ra cảnh báo (warning): Temporary used to initialize 's' Tuy nhiên chơng trình vẫn làm việc. Các câu lệnh dới đây vẫn thực hiện cho kết quả nh sau: s++; cout << "\ns= " << s; // In ra s=24 Chơng trình dới đây minh hoạ cách dùng biến tham chiếu đến một phần tử mảng cấu trúc để nhập dữ liệu thực hiện các phép tính trên các trờng của phần tử mảng cấu trúc. #include <iostream.h> #include <conio.h> struct TS { char ht[25]; float t,l,h,td; } ; void main() { TS ts[10],&h=ts[1]; // h tham chiếu đến ts[1] cout << "\n Ho ten: " ; cin.get(h.ht,25) ; cout << "Cac diem toan, ly, hoa: "; cin >> h.t >> h.l >> h.h ; h.td = h.t + h.l + h.h ; cout << "\n Ho ten: " << ts[1].ht; cout << "\n Tong diem: " << ts[1].td; getch(); } 1.3. Hằng tham chiếu (const) Hằng tham chiếu đợc khai báo theo mẫu: int n = 10 ; const int &r = n; Cũng giống nh biến tham chiếu, hằng tham chiếu có thể tham chiếu đến một biến hoặc một hằng. Ví dụ: int n = 10 ; const int &r = n ; // Hằng tham chiếu r tham chiếu đến biến n const int &s=123 ; //Hằng tham chiếu s tham chiếu đến hằng 123 Sự khác nhau giữa biến hằng tham chiếu ở chỗ: Không cho phép dùng hằng tham chiếu để làm thay đổi giá trị của vùng nhớ mà nó tham chiếu. Ví dụ: int y = 12, z ; const int &py=y; // Hằng tham chiếu py tham chiếu đến biến y y++; // Đúng z = 2*py ; // Đúng z = 26 cout << y <<" "<< py; // In ra: 13 13 py=py+1; // Sai, Trình biên dịch thông báo lỗi: // Cannot modify a const object Cách dùng: Hằng tham chiếu cho phép sử dụng giá trị chứa trong một vùng nhớ, nhng không cho phép thay đổi giá trị này. Hằng tham chiếu thờng đợc sử dụng làm đối của hàm để cho phép hàm sử dụng giá trị của các tham số trong lời gọi hàm, nhng tránh không làm thay đổi giá trị của các tham số. Đ 2. Truyền giá trị cho hàm theo tham chiếu 2.1. Hàm trong C Trong C chỉ có một cách truyền dữ liệu cho hàm theo giá trị : + Cấp phát vùng nhớ cho các đối. + Gán giá trị các tham số trong lời gọi hàm cho các đối sau đó hàm làm việc trên vùng nhớ của các đối chứ không liên quan gì đến các tham số. Nh vây chơng trình sẽ tạo ra các bản sao (các đối) của các tham số hàm sẽ thao tác trên các bản sao này, chứ không làm việc trực tiếp với các tham số. Phơng pháp này có 2 nhợc điểm chính: Tốn kém về thời gian bộ nhớ vì phải tạo ra các bản sao. Không thao tác trực tiếp trên các tham số, vì vậy không làm thay đổi đợc giá trị các tham số. 2.2. Truyền giá trị cho hàm theo tham chiếu Trong C++ cung cấp thêm cách truyền dữ liệu cho hàm theo tham chiếu bằng cách dùng đối là biến tham chiếu hoặc đối là hằng tham chiếu. Cách này có u điểm: Không cần tạo ra các bản sao của các tham số, do đó tiết kiệm bộ nhớ thời gian chạy máy. Hàm sẽ thao tác trực tiếp trên vùng nhớ của các tham số, do đó dễ dàng thay đổi giá trị các tham số khi cần. 2.3. Mối quan hệ giữa đối tham số trong lời gọi hàm Nếu đối là biến hoặc hằng tham chiếu kiểu K thì tham số (trong lời gọi hàm) phải là biến hoặc phần tử mảng kiểu K. Ví dụ: + Đối là biến hoặc hằng tham chiếu kiểu double, thì tham số là biến hoặc phần tử mảng kiểu double + Đối là biến hoặc hằng tham chiếu kiểu cấu trúc, thì tham số là biến hoặc phần tử mảng kiểu cấu trúc 2.4. Các chơng trình minh hoạ /* Chơng trình sau đợc tổ chức thành 3 hàm: Nhập dẫy số double Hoán vị 2 biến double Sắp xếp dẫy số double theo thứ tự tăng dần Chơng trình sẽ nhập một dẫy số in dẫy sau khi sắp xếp */ #include <iostream.h> #include <conio.h> #include <stdio.h> void nhapds(double *a, int n) { for (int i=1; i<= n ; ++i) { cout << "\nPhan tu thu " << i << " : " ; cin >> a[i] ; } } void hv(double &x, double &y) { double tg=x; x=y; y= tg; } void sapxep(double * a, int n) { for (int i=1; i <= n-1 ;++i) for (int j=i+1 ; j<=n ;++j) if (a[i] > a[j]) hv(a[i],a[j]); } void main() { double x[100]; int i, n; cout <<"\n N= "; cin >> n; nhapds(x,n); sapxep(x,n); for (i=1;i<=n;++i) printf("\n%0.1lf",x[i]); getch(); } /* Chơng trình sau gồm các hàm: - Nhập dẫy cấu trúc (mỗi cấu trúc chứa dữ liệu một thí sinh) - Hoán vị 2 biến cấu trúc - Sắp xếp dẫy thí sinh theo thứ tự giảm của tổng điểm - In một cấu trúc (in họ tên tổng điểm) Chơng trình sẽ nhập dữ liệu một danh sách thí sinh, nhập điểm chuẩn in danh sách thí sinh trúng tuyển */ #include <iostream.h> #include <iomanip.h> #include <conio.h> struct TS { char ht[20]; float t,l,h,td; } ; void ints(const TS &ts) { cout << setiosflags(ios::showpoint) << setprecision(1) ; cout << "\nHo ten: " << setw(20) << ts.ht << setw(6) << ts.td ; } void nhapsl(TS *ts,int n) { for (int i=1;i<=n;++i) { cout << "\n Thi sinh " << i ; cout << "\n Ho ten: " ; cin.ignore(1); cin.get(ts[i].ht,25) ; cout << "Cac diem toan, ly, hoa: "; cin >> ts[i].t >> ts[i].l >> ts[i].h ; ts[i].td = ts[i].t + ts[i].l + ts[i].h ; } } void hvts(TS &ts1, TS &ts2) { TS tg=ts1; ts1=ts2; ts2=tg; } void sapxep(TS *ts,int n) { for (int i=1;i<=n-1;++i) for (int j=i+1;j<=n;++j) if (ts[i].td < ts[j].td) hvts(ts[i],ts[j]); } void main() { TS ts[100]; int n,i; clrscr(); cout << " So thi sinh: " ; cin >> n ; nhapsl(ts,n); sapxep(ts,n) ; float dc; cout << " Diem chuan: " ; cin >> dc; cout << "\n\nDanh sach trung tuyen\n" ; for (i=1;i<=n;++i) if (ts[i].td >= dc) ints(ts[i]); else break; getch(); } /* Chơng trình sau gồm các hàm: Nhập một ma trận thực cấp mxn In một ma trận thực dới dạng bảng Tìm phần tử lớn nhất phần tử nhỏ nhất của dẫy số thc; Chơng trình sẽ nhập một ma trận, in ma trận vừa nhập in các phần tử lớn nhất nhỏ nhất trên mỗi hàng của ma trận */ #include <iostream.h> #include <iomanip.h> #include <conio.h> #include <stdio.h> void nhapmt(float a[20][20], int m, int n) { [...]... n) ; } void main() { MT a,b,c,d; // d= abc MT u; clrscr(); nhapmt(a,"A" ,2) ; nhapmt(b,"B" ,2) ; nhapmt(c,"C" ,2, 3); nhanmt(a,b,u ,2) ; nhanmt(u,c,d ,2, 2,3); inmt(a,"A" ,2) ; inmt(b,"B" ,2) ; inmt(u,"U = A*B" ,2) ; inmt(c,"C" ,2, 3); inmt(d,"D = U*C" ,2, 3); getch(); } Đ 7 Định nghĩa chồng các toán tử 7.1 Các phép toán trong C C++ Trong C C++ có khá nhiều các phép toán dùng để thực hiện các thao tác trên các kiểu... định của đối (Không có tham số trong lời gọi) delay() ; // Đối n = 1000 4 .2 Quy tắc xây dựng hàm với đối mặc định + Các đối mặc định cần phải là các đối cuối cùng tính từ trái sang phải Giả sử có 5 đối theo thứ tự từ trái sang phải là d1, d2, d3, d4, d5 Khi đó: nếu một đối mặc định thì phải là d5 nếu hai đối mặc định thì phải là d4, d5 nếu ba đối mặc định thì phải là d3, d4, d5 Các ví dụ sai: d3 d5... getch(); } Ví dụ 2: Chương trình sau thực hiện phép nhân ma trận: D = A*B*C trong đó A, B là các ma trận vuông, C là ma trận chữ nhật Trong chương trình có 3 cặp hàm trùng tên để thực hiện 3 nhiệm vụ (nhưng trên 2 đối tượng khác nhau là ma trận vuông chữ nhật): Nhập ma trận, nhân 2 ma trận in ma trân #include #include #include typedef int MT [20 ] [20 ]; void nhapmt(MT... (về số lượng hoặc kiểu) Nếu 2 hàm hoàn toàn trùng tên trùng đối thì Trình biên dịch sẽ không có cách nào phân biệt được Ngay cả khi 2 hàm này có kiểu khác nhau thì Trình biên dịch vẫn báo lỗi Ví dụ sau xây dựng 2 hàm cùng có tên là f cùng có một đối nguyên a, nhưng kiểu hàm khác nhau Hàm thứ nhất kiểu nguyên (trả về a*a), hàm thứ hai kiểu void (in giá trị a) Chương trình sẽ bị thông báo lỗi khi... "\n Tong diem: " . chơng 2 Hàm trong C++ Chơng này trình bầy những khả năng mới của C++ trong việc xây dựng và sử dụng hàm. Đó là: + Kiểu tham chiếu và việc truyền dữ liệu cho hàm bằng tham chiếu. + Đối tham. delay(5000) ; // Đối n = 5000 + Sử dụng giá trị mặc định của đối (Không có tham số trong lời gọi) delay() ; // Đối n = 1000 4 .2. Quy tắc xây dựng hàm với đối mặc định + Các đối mặc định cần. trong lời gọi hàm phải bằng số đối của hàm. Mỗi đối sẽ đợc khởi gán giá trị theo tham số tơng ứng của nó. Trong C++ cho phép tạo giá trị mặc định cho các đối. Các đối này có thể có hoặc không

Ngày đăng: 18/06/2014, 11:20

TỪ KHÓA LIÊN QUAN

w