Bài giảng Lập trình hướng đối tượng - Chương 1: Các khái niệm cơ bản của lập trình hướng đối tượng - Phạm Minh Hoàn
GIỚI THIỆU TIẾP CẬN HƯỚNG ĐỐI TƯỢNG
Những nhược điểm của lập trình hướng thủ tục:
Lập trình hướng thủ tục (LTHTT) là cách tiếp cận theo các hàm chức năng. Một hệ thống phần mềm gồm một dãy các công việc cần thực hiện như đọc dữ liệu, tính toán, xử lý, lập báo cáo và in ấn kết quả v.v. Mỗi công việc đó sẽ được thực hiện bởi một số hàm nhất định.
Chương trình khó kiểm soát và khó khăn trong việc bổ sung, nâng cấp chương trình.
Mô hình được xây dựng theo cách tiếp cận hướng thủ tục không mô tả được đầy đủ, trung thực hệ thống trong thực tế.
Phương pháp LTHTT đặt trọng tâm vào hàm là hướng tới hoạt động sẽ không thực sự tương ứng với các thực thể trong hệ thống của thế giới thực.
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng - Chương 1: Các khái niệm cơ bản của lập trình hướng đối tượng - Phạm Minh Hoàn", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Bài giảng Lập trình hướng đối tượng - Chương 1: Các khái niệm cơ bản của lập trình hướng đối tượng - Phạm Minh Hoàn
CHƯƠNG 1. CÁC KHÁI NIỆM CƠ BẢN CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Phạm Minh Hoàn Bộ môn công nghệ thông tin – Đại học Kinh tế Quốc dân Email: hoanpm@neu.edu.vn Phạm Minh Hoàn - NEU NỘI DUNG CHƯƠNG TRÌNH BÀI 1. GIỚI THIỆU TIẾP CẬN HƯỚNG ĐỐI TƯỢNG BÀI 2. CÁC KHÁI NIỆM CƠ BẢN CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG BÀI 3. CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Phạm Minh Hoàn - NEU GIỚI THIỆU TIẾP CẬN HƯỚNG ĐỐI TƯỢNG Những nhược điểm của lập trình hướng thủ tục : Lập trình hướng thủ tục (LTHTT) là cách tiếp cận theo các hàm chức năng. Một hệ thống phần mềm gồm một dãy các công việc cần thực hiện như đọc dữ liệu, tính toán, xử lý, lập báo cáo và in ấn kết quả v.v... Mỗi công việc đó sẽ được thực hiện bởi một số hàm nhất định. Chương trình khó kiểm soát và khó khăn trong việc bổ sung, nâng cấp chương trình . Mô hình được xây dựng theo cách tiếp cận hướng thủ tục không mô tả được đầy đủ, trung thực hệ thống trong thực tế. Phương pháp LTHTT đặt trọng tâm vào hàm là hướng tới hoạt động sẽ không thực sự tương ứng với các thực thể trong hệ thống của thế giới thực. Phạm Minh Hoàn - NEU GIỚI THIỆU TIẾP CẬN HƯỚNG ĐỐI TƯỢNG Tiếp cận hướng đối tượng Trong thế giới thực, vật chất tồn tại dưới dạng đối tượng, đó là các thực thể có mối quan hệ với nhau. Đối với việc tổ chức chương trình, ứng dụng có thể được định nghĩa như một tập các thực thể - hoặc các đối tượng, sao cho quá trình tái tạo những suy nghĩa là gần sát nhất về thế giới thực. Cách tiếp cận hướng đối tượng. Phạm Minh Hoàn - NEU GIỚI THIỆU TIẾP CẬN HƯỚNG ĐỐI TƯỢNG Lập trình hướng đối tượng : Lập trình hướng đối tượng (Object Oriented Programming - LTHĐT) là phương pháp lập trình lấy đối tượng làm nền tảng để xây dựng thuật giải, xây dựng chương trình. Phương pháp LTHĐT là thiết kế chương trình xoay quanh dữ liệu của hệ thống. LTHĐT không cho phép dữ liệu chuyển động tự do trong hệ thống. Phạm Minh Hoàn - NEU CÁC KHÁI NIỆM CƠ BẢN CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Đối tượng Trong thế giới thực: đối tượng được hiểu như là một thực thể , nó có thể là người, vật hoặc một bảng dữ liệu cần xử lý trong chương trình, . Ví dụ: sinh_viên, máy_tính, . Trong LTHĐT: đối tượng là biến thể hiện của lớp . Phạm Minh Hoàn - NEU CÁC KHÁI NIỆM CƠ BẢN CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Lớp Lớp là một khái niệm mới trong LTHĐT so với kỹ thuật LTHTT . Lớp là một bản mẫu mô tả các thông tin cấu trúc dữ liệu và các thao tác hợp lệ của các phần tử dữ liệu. Ví dụ: lớp_sinh_viên, lớp_máy_tính, . Đối tượng = Dữ liệu + Phương thức. Phạm Minh Hoàn - NEU CÁC KHÁI NIỆM CƠ BẢN CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Mối liên hệ giữa lớp và đối tượng: Lớp là khái niệm tĩnh. Đối tượng là khái niệm động. Đối tượng được xác định trong bộ nhớ của máy tính. Đối tượng được tạo ra để xử lý thông tin, thực hiện nhiệm vụ được thiết kế, sau đó bị hủy bỏ khi đối tượng đó hết vai trò. Phạm Minh Hoàn - NEU CÁC KHÁI NIỆM CƠ BẢN CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Trừu tượng hóa dữ liệu và bao gói thông tin Trừu tượng hóa là cách biểu diễn những đặc tính chính và bỏ qua những chi tiết vụn vặt hoặc những giải thích. Bao gói thông tin là việc đóng gói dữ liệu và các phương thức vào một đơn vị cấu trúc lớp. Dữ liệu được tổ chức sao cho thế giới bên ngoài (các đối tượng ở lớp khác) không truy nhập vào được. Phương thức của lớp sẽ đóng vai trò như là giao diện giữa dữ liệu của đối tượng và phần còn lại của chương trình. Nguyên tắc bao gói dữ liệu để ngăn cấm sự truy nhập trực tiếp trong lập trình được gọi là sự che giấu thông tin . Phạm Minh Hoàn - NEU CÁC KHÁI NIỆM CƠ BẢN CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Kế thừa Kế thừa là quá trình mà các đối tượng của lớp này được quyền sử dụng một số tính chất của các đối tượng của lớp khác. Sự kế thừa cho phép định nghĩa một lớp mới trên cơ sở các lớp đã tồn tại. Lớp mới này, ngoài những thành phần được kế thừa, sẽ có thêm những thuộc tính và các hàm mới. Nguyên lý kế thừa hỗ trợ cho việc tạo ra cấu trúc phân cấp các lớp. Phạm Minh Hoàn - NEU CÁC KHÁI NIỆM CƠ BẢN CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Tương ứng bội Tương ứng bội là khả năng của một khái niệm có thể sử dụng với nhiều chức năng khác nhau. Tương ứng bội đóng vai quan trọng trong việc tạo ra các đối tượng có cấu trúc bên trong khác nhau nhưng cùng dùng chung một giao diện bên ngoài. Phạm Minh Hoàn - NEU CÁC KHÁI NIỆM CƠ BẢN CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Liên kết động Liên kết động là dạng liên kết các thủ tục và hàm khi chương trình thực hiện lời gọi tới các hàm, thủ tục đó. Trong liên kết động, nội dung của đoạn chương trình ứng với thủ tục, hàm sẽ không được biết cho đến khi thực hiện lời gọi tới thủ tục, hàm đó. Phạm Minh Hoàn - NEU CÁC KHÁI NIỆM CƠ BẢN CỦA LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Truyền thông báo Truyền thông báo cho một đối tượng là yêu cầu đối tượng thực hiện một việc gì đó. Ví dụ: Hinh_vuong.Dien_tich(canh) Sinh_vien.Diem_trung_binh(ho_ten) Sự trao đổi thông tin chỉ có thể thực hiện trong thời gian đối tượng tồn tại. Phạm Minh Hoàn - NEU QUY TRÌNH LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Xác định các dạng đối tượng (lớp) của bài toán. Tìm kiếm các đặc tính chung (dữ liệu chung) trong các dạng đối tượng này, những gì chúng cùng nhau chia sẻ. Xác định lớp cơ sở dựa trên cơ sở các đặc tính chung của các dạng đối tượng. Xây dựng các lớp dẫn xuất chứa các thành phần, những đặc tính không chung còn lại của các dạng đối tượng từ lớp cơ sở. Ngoài ra, ta còn đưa ra các lớp có quan hệ với các lớp cơ sở và lớp dẫn xuất. Phạm Minh Hoàn - NEU NGÔN NGỮ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Ngôn ngữ lập trình dựa trên đối tượng là ngôn ngữ gồm các đặc tính: Bao gói dữ liệu Cơ chế che giấu và truy nhập dữ liệu Tự động tạo lập và xóa bỏ các đối tượng Phép toán tải bội Ngôn ngữ lập trình hướng đối tượng là ngôn ngữ gồm các đặc tính: Các đặc tính dựa trên đối tượng + kế thừa + liên kết động. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Giới thiệu chung về C++: C++ là ngôn ngữ lập trình hướng đối tượng. C++ là sự mở rộng của ngôn ngữ C. Phần lớn các chương trình C đều có thể chạy được trong C++. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Đặt lời chú thích Cách 1: /* Đây là câu chú thích trên nhiều dòng */ Cách 2: // Đây là chú thích trên một dòng Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Khai báo biến Lệnh khai báo biến có thể đặt bất kỳ chỗ nào trong chương trình trước khi các biến được sử dụng. Phạm vi hoạt động của biến là khối trong đó biến được khai báo. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ: Nhập một dãy số thực rồi sắp xếp theo thứ tự tăng dần. #include #include #include main() { int n; printf("\n So phan tu cua day n="); scanf("%d",&n); float *x=(float*)malloc((n+1)*sizeof(float)); for (int i=0;i<n;i++) { printf("\n X[%d]=",i); scanf("%f",x+i);//&x[i] } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp): float tg; for(i=0;i<n-1;++i) for (int j=i+1;j<n;++j) if (x[i]>x[j]) //(*(x+i)>*(x+j)) { tg = x[i]; x[i] = x[j]; x[j] = tg; } printf("\n Day sau khi sap xep\n"); for (i=0;i<n;++i) printf("%0.2f ",x[i]);//*(x+i) free(x); getch(); } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Phép chuyển kiểu bắt buộc : Ngoài phép chuyển kiểu bắt buộc được viết trong C theo cú pháp: (kiểu) biểu thức C++ còn sử dụng một phép chuyển kiểu mới như sau: Kiểu(biểu thức) Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ: Tính sau tổng S = #include #include main() { int n; printf("\n So phan tu cua day n="); scanf("%d",&n); float s=0.0; for (int i=1;i<=n;++i) s+= 1/i; printf("S=%0.2f",s); getch(); } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ: Tính sau tổng S = #include #include main() { int n; printf("\n So phan tu cua day n="); scanf("%d",&n); float s=0.0; for (int i=1;i<=n;++i) s+= float(1)/float(i); //chuyen kieu theo C++ printf("S=%0.2f",s); getch(); } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Lấy địa chỉ các phần tử mảng thực 2 chiều : C++ cho phép dùng phép toán & để lấy địa chỉ các phần tử mảng thực 2 chiều. Có thể dùng hàm scanf() để nhập trực tiếp vào các phần tử mảng. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ : Nhập một mảng thực cấp mxn (m,n<=20) và tìm phần tử có giá trị lớn nhất: #include #include main() { float a[20][20], smax; int m, n, i, j, imax, jmax; puts(“Nhap so hang va so cot cua ma tran: "); scanf("%d%d", &m, &n); for (i=0;i<m; i++) for (j=0;j<n; j++) { printf("\n a[%d][%d]=",i,j); scanf("%f",&a[i][j]); } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp) : smax=a[0][0]; imax=0; jmax=0; for (i=0;i<m;++i) for(j=0;j<n;++j) if(smax<a[i][j]) { smax=a[i][j]; imax=i; jmax=j; } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp) : puts("\n\n Ma tran"); for (i=0;i<m;++i) for (j=0;j<n;++j) { if (j==0) puts(“\n"); printf("%6.1f",a[i][j]); } puts("\n\n Phan tu max:"); printf("\n Co gia tri=%6.1f", smax); printf("\n\n Tai hang %d cot %d",imax,jmax); getch(); } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Vào ra trong C++: Xuất dữ liệu: cout<< biểu thức 1<<. . .<< biểu thức n; Trong đó: cout được định nghĩa trước như một đối tượng biểu diễn cho thiết bị xuất chuẩn của C++ là màn hình, cout được sử dụng kết hợp với toán tử chèn << để hiển thị giá trị các biểu thức 1, 2,..., n ra màn hình. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Vào ra trong C++: Nhập dữ liệu cin>>biến 1>>. . . >>biến n; Trong đó: Toán tử cin được định nghĩa trước như một đối tượng biểu diễn cho thiết bị vào chuẩn của C++ là bàn phím, cin được sử dụng kết hợp với toán tử trích >> để nhập dữ liệu từ bàn phím cho các biến 1, 2, ..., n. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Chú ý 1: Để sử dụng các loại toán tử và phương thức nói trên cần khai báo tập tin dẫn hướng iostream.h #include iostream.h; Để nhập một chuỗi không quá n ký tự và lưu vào mảng một chiều s (kiểu char) có thể dùng hàm cin.get như sau: cin.get(s, n); Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Chú ý 2: Toán tử nhập cin>> sẽ để lại ký tự chuyển dòng ’\n’ trong bộ đệm. Ký tự này có thể làm trôi phương thức cin.get(). Để khắc phục tình trạng trên cần dùng phương thức cin.ignore(1) để bỏ qua một ký tự chuyển dòng. cin.ignore(1); Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Định dạng khi in ra màn hình : Quy định độ rộng tối thiểu để hiển thị k vị trí cho giá trị (nguyên, thực, chuỗi) dùng hàm: setw(k) Hàm này cần đặt trong toán tử xuất và nó chỉ có hiệu lực cho một giá trị được in gần nhất. Các giá trị in ra tiếp theo sẽ có độ rộng tối thiểu mặc định là 0. Ví dụ: cout<<setw(6)<<“Khoa”<<setw(8)<<“CNTT” sẽ in ra chuỗi “ Khoa CNTT”. Để sử dụng hàm setw cần khai báo thư viện iomanip.h. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ: Nhập một danh sách n thí sinh (n<=100). Dữ liệu mỗi thí sinh gồm họ tên, các điểm thi môn 1, môn 2, môn 3. Sau đó in danh sách thí sinh theo thứ tự giảm dần của tổng điểm. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp 0): #include // thu vien cout, cin #include // thu vien getch() #include // thu vien setw #include // thu vien ham chuoi ky tu using namespace std; main() { struct { char ht[25]; float d1, d2, d3, td; }ts[100], tg; int n, i, j; cout >n; cin.ignore(1); Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp 1): for (i=0;i<n;++i) { cout << "\n Thi sinh: "<<i; cout << "\n Ho ten:"; cin.get(ts[i].ht,25); cin.ignore(1); cout << « \nDiem cac mon thi :"; cin>>ts[i].d1>>ts[i].d2>>ts[i].d3; cin.ignore(1); ts[i].td=ts[i].d1+ts[i].d2+ts[i].d3; } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp 2): for (i=0;i<n-1;++i) for(j=i+1;j<n;++j) if(ts[i].td<ts[j].td) { tg=ts[i]; ts[i]=ts[j]; ts[j]=tg; } cout<< "\ Danh sach thi sinh sau khi sap xep :"; for (i=0;i<n;++i) { cout<<"\n"<< setw(25)<<ts[i].ht<<setw(5)<<ts[i].td; } getch(); } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Cấp phát và giải phóng bộ nhớ Trong C có thể sử dụng các hàm cấp phát bộ nhớ như malloc(), calloc() và hàm free() để giải phóng bộ nhớ được cấp phát. C++ đưa thêm một cách thức mới để thực hiện việc cấp phát và giải phóng bộ nhớ bằng cách dùng hai toán tử new và delete. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Toán tử new để cấp phát bộ nhớ Toán tử new thay cho hàm malloc() và calloc() của C có cú pháp như sau: new tên kiểu ; hoặc new(tên kiểu); Trong đó: tên kiểu là kiểu dữ liệu của biến con trỏ, nó có thể là: các kiểu dữ liệu chuẩn như int, float, double, char,... hoặc các kiểu do người lập trình định nghĩa như mảng, cấu trúc, lớp,... Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Toán tử new để cấp phát bộ nhớ Toán tử new để cấp phát bộ nhớ cho biến, có cú pháp như sau: new tên kiểu ; hoặc new(tên kiểu); Trong đó: tên kiểu là kiểu dữ liệu của biến con trỏ, nó có thể là: các kiểu dữ liệu chuẩn như int, float, double, char,... hoặc các kiểu do người lập trình định nghĩa như mảng, cấu trúc, lớp,... Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Toán tử new để cấp phát bộ nhớ Chú ý: Để cấp phát bộ nhớ cho mảng một chiều, dùng cú pháp như sau: Biến con trỏ = new kiểu[n]; Trong đó n là số nguyên dương xác định số phần tử của mảng. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Toán tử new để cấp phát bộ nhớ Kiểm tra lỗi cấp phát bộ nhớ : double *p; int n; cout>n; p = new double[n]; if (p == NULL) { cout << “Loi cap phat bo nho”; exit(0); } Chú ý: Để sử dụng lệnh exit phải khai báo thư viện stdlib.h Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Toán tử delete Toán tử delete thay cho hàm free() của C, nó có cú pháp như sau: delete con trỏ; hay: delete(con trỏ); Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ: Viết chương trình minh hoạ cách dùng new để cấp phát bộ nhớ chứa n thí sinh. Mỗi thí sinh là một cấu trúc gồm các trường ht(họ tên), sobd(số báo danh), và td(tổng điểm). Chương trình sẽ nhập n, cấp phát bộ nhớ chứa n thí sinh, kiểm tra lỗi cấp phát bộ nhớ, nhập n thí sinh, sắp xếp thí sinh theo thứ tự giảm của tổng điểm, in danh sách thí sinh sau khi sắp xếp, giải phóng bộ nhớ đã cấp phát. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp 0): #include #include #include #include #include struct TS { char ht[20]; long sobd; float td; }; Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp 1): main() { TS *ts; int n; cout>n; ts = new TS[n+1]; if (ts == NULL) { cout << "\n Loi cap phat vung nho"; getch(); exit(0); } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp 2): for (int i=0;i<n;++i) { cout << "\n Thi sinh thu "<<i+1; cout<< "\n Ho ten"; cin.ignore(1); cin.get (ts[i].ht,20); //cin(ts[i].ht); cout << "so bao danh"; cin>> ts[i].sobd; cout<< "tong diem:"; cin>>ts[i].td; } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp 3): for (i=0;i<n-1;++i) for (int j=i+1;j<n;++j) if (ts[i].td<ts[j].td) { TS tg=ts[i]; ts[i]=ts[j]; ts[j]=tg; } for (i=0;i<n;++i) cout << "\n" << setw(20)<<ts[i].ht<<setw(6)<<ts[i].td; delete ts; getch(); } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Biến tham chiếu Trong C có 2 loại biến là: Biến giá trị dùng để chứa dữ liệu (nguyên, thực, ký tự,...) và biến con trỏ dùng để chứa địa chỉ . Các biến này đều được cung cấp bộ nhớ và có địa chỉ. C++ cho phép sử dụng loại biến thứ ba là biến tham chiếu . Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Biến tham chiếu Biến tham chiếu là một tên khác (bí danh) cho biến đã định nghĩa trước đó. Cú pháp khai báo biến tham chiếu như sau: Kiểu &Biến tham chiếu = Biến; Biến tham chiếu có đặc điểm là nó được dùng làm bí danh cho một biến (kiểu giá trị) nào đó và sử dụng vùng nhớ của biến này. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ: int a, &tong = a; tong =1; //a=1 cout<< tong; //in ra số 1 tong++; //a=2 ++a; //a=3 cout<<“\n”<<tong; //in ra số 3 cout<<a; Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Chú ý: Trong khai báo biến tham chiếu phải chỉ rõ tham chiếu đến biến nào. Biến tham chiếu có thể tham chiếu đến một phần tử mảng, nhưng không cho phép khai báo mảng tham chiếu. Biến tham chiếu có thể tham chiếu đến một hằng. Khi đó nó sử dụng vùng nhớ của hằng và có thể làm thay đổi giá trị chứa trong vùng nhớ này. 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 biến trong lời gọi hàm Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Hằng tham chiếu: Cú pháp khai báo hằng tham chiếu như sau: const Kiểu dữ liệu &Biến = Biến/Hằng; Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ: int n = 10; const int &m = n; const int &p = 123; Hằng tham chiếu có thể tham chiếu đến một biến hoặc một hằng. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Chú ý: Hằng tham chiếu chỉ cho phép sử dụng giá trị chứa trong một vùng nhớ mà nó tham chiếu, không cho phép thay đổi giá trị của vùng nhớ này. Ví dụ: int y=12, z; const int &p = y //Hằng tham chiếu p tham //chiếu đến biến y p = p + 1; //Sai, trình biên dịch sẽ thông báo lỗi Hằng tham chiếu thường được sử dụng làm tham số của hàm để cho phép sử dụng giá trị của các tham số trong lời gọi hàm, nhưng tránh làm thay đổi giá trị tham số. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Truyền tham số cho hàm theo tham chiếu: Trong C: truyền dữ liệu cho hàm theo tham trị. Tạo ra các bản sao của các tham số thực sự trong lời gọi hàm. Thao tác trên các bản sao này chứ không xử lý trực tiếp với các tham số thực. Không làm thay đổi giá trị của biến gốc. Trong C++: truyền dữ liệu cho hàm theo tham chiếu bằng cách dùng đối là tham chiếu. Không cần tạo ra các bản sao của các tham số thực. Tiết kiệm bộ nhớ và thời gian chạy máy. Thao tác trực tiếp trên vùng nhớ của các tham số Thay đổi giá trị của biến gốc. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ: Viết chương trình nhập dãy số thực, sắp xếp dãy theo thứ tự tăng dần và hiển thị ra màn hình. #include #include #include #include void nhapds(double *a,int n) { for(int i=0;i<n;++i) { cout>a[i]; } } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp): void hv (double &x,double &y) { double tam=x; x=y; y=tam; } void sapxep(double *a,int k) { for(int i=0;i<k-1;++i) for(int j=i+1;j<k;++j) if(a[i]>a[j]) hv(a[i],a[j]); } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp): void inds(double *a, int k) { for(int i=0;i<k;++i) { cout<<setw(5)<<a[i]; } } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp): main() { double x[100]; int i,n; cout>n; nhapds(x,n); sapxep(x,n); cout<<"\nCac phan tu mang sau khi sap xep :"; inds(x,n); getch(); } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ: Viết chương trình nhập một mảng thực kích thước 20x20, in mảng đã nhập và in các phần tử lớn nhất và nhỏ nhất trên mỗi hàng của mảng. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp 0): #include #include #include #include void nhapmt(float a[20][20], int m, int n) { for(int i=0;i<m;++i) for(int j=0;j<n;++j) { cout> a[i][j]; } } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp 1): void inmt(float a[20][20], int m, int n) { cout<<"\nMang da nhap : "; for(int i=0;i<m;++i) for(int j=0;j<n;++j) { if(j==0) cout<<"\n"; cout<<setw(6)<<a[i][j]; } } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp 2): void maxminds(float *x,int n, int &vtmax, int &vtmin) { vtmax = vtmin = 0; for(int i=1;i<n;++i) { if(x[i]>x[vtmax]) vtmax=i; if(x[i]<x[vtmin]) vtmin=i; } } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp 3): main() { float a[20][20]; int m, n; cout<<"\n Nhap so hang va so cot : "; cin>>m>>n; nhapmt(a,m,n); inmt(a,m,n); float *p=(float*) a; int vtmax,vtmin; Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp 4): for(int i=0;i<m;++i) { p=((float*)a)+i*20; maxminds(p,n,vtmax,vtmin); printf("\n Hang %d phan tu max=%6.1f tai cot %d", i, p[vtmax], vtmax); printf("\n Phan tu min=%6.1f tai cot %d", p[vtmin], vtmin); } getch(); } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Hàm với tham số có giá trị mặc định Các đối có giá trị mặc định cần là các tham số cuối cùng tính từ trái qua phải. Nếu chương trình sử dụng khai báo nguyên mẫu hàm: các tham số mặc định cần được khởi gán trong nguyên mẫu hàm, không được khởi gán lại cho các đối mặc định trong dòng đầu của định nghĩa hàm. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Hàm với tham số có giá trị mặc định Ví dụ: void f(int a, float x, char *st=”TRUNG TAM”, int b=1, double y = 1.234); void f(int a, float x, char *st=”TRUNG TAM”, int b=1, double y = 1.234) { //Các câu lệnh } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Chú ý: Đối với các hàm có tham số mặc định thì lời gọi hàm cần viết theo quy định: Các tham số vắng mặt trong lời gọi hàm tương ứng với các tham số mặc định cuối cùng (tính từ trái sang phải), Ví dụ với hàm: void f(int a, float x, char *st=”TRUNG TAM”, int b=1, double y = 1.234); thì các lời gọi hàm đúng: f(3,3.4,”TIN HOC”,10,1.0); //Đầy đủ tham số f(3,3.4,”ABC”); //Thiếu 2 tham số cuối f(3,3.4); //Thiếu 3 tham số cuối Các lời gọi hàm sai: f(3); f(3,3.4, ,10); Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Các hàm nội tuyến (inline) Hàm có ưu điểm chương trình được chia thành các đơn vị độc lập. Hàm cũng có nhược điểm là làm chậm tốc độ thực hiện chương trình: cấp phát vùng nhớ cho các tham số và biến cục bộ, truyền dữ liệu của các tham số cho các đối, giải phóng vùng nhớ trước khi thoát khỏi hàm. C++ khắc phục nhược điểm nói trên bằng cách dùng hàm nội tuyến. Để biến một hàm thành hàm nội tuyến thêm từ khóa inline vào trước khai báo nguyên mẫu hàm. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Chú ý: Trong mọi trường hợp, từ khóa inline phải xuất hiện trước các lời gọi hàm thì trình biên dịch mới biết cần xử lý hàm theo kiểu inline. Ví dụ: Hàm f() trong chương trình sau sẽ không phải là hàm nội tuyến vì inline viết sau lời gọi hàm. #include #include main() { int s = f(5,6); cout<<s; getch(); } inline int f(int a,int b) { return a*b; } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Chú ý: Chương trình dịch các hàm inline tương tự như các macro. Cách làm này sẽ tăng tốc độ chương trình do không phải thực hiện các thao tác có tính thủ tục khi gọi hàm Hàm inline làm tăng khối lượng bộ nhớ chương trình (nhất là đối với các hàm nội tuyến có nhiều câu lệnh). Vì vậy chỉ nên dùng hàm inline đối với các hàm có nội dung đơn giản. Không phải khi gặp từ khoá inline là chương trình dịch nhất thiết phải xử lý hàm theo kiểu nội tuyến. Từ khoá inline chỉ là một từ khoá gợi ý cho chương trình dịch chứ không phải là một mệnh lệnh bắt buộc. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ 2: Chương trình sau sử dụng hàm inline để tính chu vi và diện tích hình chữ nhật. #include #include inline void dtcvhcn(int a,int b,int &dt,int &cv) { dt=a*b; cv=2*(a+b); } main() { int a[20], b[20], cv[20], dt[20], n; cout>n; Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ 2 (tiếp): for(int i=0;i<n;++i) { cout<<"\n Nhap 2 canh cua hinh chu nhat"<<i<<":"; cin>>a[i]>>b[i]; dtcvhcn(a[i],b[i],dt[i],cv[i]); } for(i=0;i<n;++i) { cout<<"\n Hinh chu nhat thu "<<i+1<<":"; cout<<"\n Do dai hai canh "<<a[i]<<"va"<<b[i]; cout<<"\n dien tich "<<dt[i]; cout<<"\n chu vi "<<cv[i]; } getch(); } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Hàm tải bội Các hàm tải bội là các hàm có cùng tên và có tập tham số khác nhau (về số lượng các tham số hoặc kiểu của tham số). Trình biên dịch căn cứ vào số lượng và kiểu các tham số để gọi hàm có đúng tên và đúng các tham số tương ứng. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ: Chương trình tìm max của một dãy số nguyên và max của một dãy số thực. Trong chương trình có 6 hàm: hai hàm dùng để nhập dãy số nguyên và dãy số thực có tên chung là nhapds, bốn hàm: tính max 2 số nguyên, tính max 2 số thực, tính max của dãy số nguyên, tính max của dãy số thực được đặt chung một tên là max. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp 0): #include #include #include void nhapds(int *x, int n); void nhapds(double *x, int n); int max(int x,int y); double max(double x, double y); Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp 1): void nhapds(int *x, int n) { for(int i=0;i<n;++i) { cout>x[i]; } } void nhapds(double *x, int n) { for (int i=0;i<n;i++) { cout>x[i]; } } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp 2): int max(int x, int y) { return x>y?x:y; } double max(double x, double y) { return x>y?x:y; } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp 3): int max(int *x, int n) { int s=x[0]; for(int i=1;i<n;++i) s = max(s,x[i]); return s; } double max(double *x, int n) { double s=x[0]; for(int i=1;i<n;++i) s = max(s,x[i]); return s; } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Ví dụ (tiếp 4): main() { int a[20], n, ni, nd, maxi; double x[20], maxd; cout>ni; cout<<"\n Nhap day so nguyen: "; nhapds(a,ni); cout>nd; cout<<"\n Nhap day so thuc: "; nhapds(x,nd); maxi = max(a,ni); maxd = max(x,nd); cout<<"\n Max day so nguyen ="<<maxi; cout<<"\n Max day so thuc="<<maxd; getch(); } Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Viết chương trình thực hiện các yêu cầu sau đây: Nhập dữ liệu cho các sinh viên (dùng cấu trúc danh sách liên kết đơn), các thông tin của sinh viên bao gồm: mã sinh viên, họ tên, lớp, điểm trung bình. Chương trình có sử dụng toán tử new và delete. In ra danh sách sinh viên có sắp xếp vị thứ theo điểm trung bình. Phạm Minh Hoàn - NEU CÁC MỞ RỘNG CỦA NGÔN NGỮ C++ Viết chương trình thực hiện các yêu cầu sau đây: Nhập dữ liệu cho các sinh viên (dùng mảng động), các thông tin của sinh viên bao gồm: mã sinh viên, họ tên, lớp, điểm trung bình. Chương trình có sử dụng toán tử new và delete. In ra danh sách sinh viên có sắp xếp vị thứ theo điểm trung bình. In ra những sinh viên có điểm trung bình cao nhất. Phạm Minh Hoàn - NEU
File đính kèm:
- bai_giang_lap_trinh_huong_doi_tuong_chuong_1_cac_khai_niem_c.ppt