Bài giảng Lập trình Hướng đối tượng - Chương 2: Các mở rộng của C++ so với C - Lê Đức Thịnh

ppt 21 trang hoanguyen 3440
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 2: Các mở rộng của C++ so với C - Lê Đức Thịnh", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pptbai_giang_lap_trinh_huong_doi_tuong_chuong_2_cac_mo_rong_cua.ppt

Nội dung text: Bài giảng Lập trình Hướng đối tượng - Chương 2: Các mở rộng của C++ so với C - Lê Đức Thịnh

  1. LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG LÊ ĐỨC THỊNH
  2. Chương II: CÁC MỞ RỘNG CỦA C++ SO VỚI C 1. Các điểm không tương thích giữa C++ và ANSI C 2. Các khả năng vào ra mới của C++ 3. Những tiện ích cho người lập trình 4. Hàm inline 5. Tham chiếu 6. Định nghĩa hàm chồng 7. Tham số ngầm định trong lời gọi hàm 8. Bổ sung thêm toán tử quản lý bộ nhớ động: new và delete
  3. 1. Các điểm không tương thích giữa C++ và ANSI C 1.1 Định nghĩa hàm /*C++ không cho phép khai báo kiểu này */ double fexple(u, v) int u; double v; { } /*cả C và C++ cho phép */ double fexple(int u, double v) { }
  4. 1.2 Khai báo nguyên mẫu hàm C C++ ◼ có thể sử dụng một hàm ◼ một lời gọi hàm chỉ được chưa được định nghĩa trước chấp nhận khi trình biên dịch mà không cần khai báo hoặc biết được kiểu của tham số, chỉ cần khai báo tên và giá trị kiểu của giá trị trrả về. Trong trả về. trường hợp khác kiểu, sẽ thực hiện một số chuyển kiểu tự động: - char → int → long int → float → double
  5. C C++ ◼ không cần thiết ◼ phải có từ khóa void trước tên hàm nếu hàm không trả về giá trị. Nếu để trống thì hiểu kiểu trả về là int và trong định nghĩa hàm phải có lệnh return. ◼ void * tương thích với các ◼ chỉ có chuyển đổi ngầm định kiểu con trỏ khác cả hai chiều: từ một kiểu trỏ tùy ý thành void *gen; void*, còn muốn chuyển đổi int *adj; ngược lại, ta phải thực hiện chuyển kiểu tường minh: //hợp lệ gen = adj; gen = adj; adj = (int *)gen; adj = gen;
  6. 2. Các khả năng vào ra mới của C++ ➢ Các toán tử và phương thức xuất nhập ◼ Trong C++ còn dùng toán tử xuất, nhập: cout > biến >> >> biến; ◼ Để nhập một dẫy không quá n ký tự và chứa vào mảng h (kiểu char) có thể dùng phương thức cin.getline như sau: cin.getline(h,n);
  7. ◼ Toán tử nhập cin >> sẽ để lại ký tự chuyển dòng ‘\n’ trong bộ đệm. Để xóa sạch bộ nhớ đệm bàn phím, gọi: cin.clear(); //trong iostream.h hoặc: fflush(stdin); //trong stdio.h
  8. ➢ Định dạng khi in ra màn hình ◼ Để quy định số thực (float, double) được in ra có đúng p chữ số sau dấu chấm thập phân, ta sử dụng đồng thời các hàm sau: setiosflags(ios::showpoint); // Bật cờ hiệu showpoint setprecision(p);
  9. ◼ Các hàm này cần đặt trong toán tử xuất như sau: cout << setiosflags(ios::showpoint) << setprecision(p) ; ◼ Câu lệnh trên sẽ có hiệu lực đối với tất cả các toán tử xuất tiếp theo cho đến khi gặp một câu lệnh định dạng mới. ◼ Để quy định độ rộng tối thiểu là w vị trí cho giá trị (nguyên, thực, chuỗi) được in trong các toán tử xuất, ta dùng hàm setw(w)
  10. ◼ 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. Như vậy câu lệnh: cout
  11. 3. Những tiện ích cho người lập trình 3.1. Chú thích cuối dòng ◼ Trong C++ còn cho phép viết ghi chú trên một dòng sau 2 dấu gạch chéo int x,y ; // Khai báo 2 biến thực 3.2. Khai báo mọi nơi ◼ Trong C tất cả các câu lệnh khai báo biến, mảng cục bộ phải đặt tại đầu khối. ◼ C++ cho phép các lệnh khai báo biến, mảng có thể đặt bất kỳ chỗ nào trong chương trình trước khi các biến, mảng được sử dụng.
  12. 4. Hàm inline inline kiểu_trả về tên_hàm(danh_sách_tham_số) { //các lệnh } ➢ Hàm inline tương tự như macro trong C, lời gọi hàm được thay thế thành mã lệnh. ➢ Tăng tốc độ thực hiện chương trình. ➢ Nhược điểm: Nếu hàm inline quá lớn và được gọi nhiều lần thì kích thước chương trình sẽ tăng nhanh.
  13. 5. Tham chiếu ➢ Biến tham chiếu int m=8; int &i=m; m=10; cout<<“i=“<<i<<“ m=“<<m; //i=10 m=10 ➢ Đối số kiểu tham chiếu void func(int &n) { n=n*10; } int k=8; func(k); cout<<“k=“<<k; //k=80;
  14. ➢ Đối tham chiếu const ➢ Dùng để tăng tốc độ truyền dữ liệu cho hàm và không làm thay đổi giá trị biến gốc. void func(const int &n) { //các lệnh không được phép thay đổi n }
  15. 6. Định nghĩa chồng hàm ➢ Các hàm trùng tên (định nghĩa chồng các hàm) ➢ Cho phép sử dụng một tên cho nhiều hàm khác nhau. Các hàm này được phân biệt dựa vào danh sách tham số. ➢Định nghĩa chồng toán tử ➢Cho phép định nghĩa lại toán tử như +, -, *, /, >>, <<.
  16. 7. Tham số ngầm định trong lời gọi hàm ➢ Đối có giá trị ngầm định ➢ Cho phép tham số lấy giá trị mặc định khi lời gọi hàm bỏ qua không truyền giá trị cho tham số đó. void func(int a, int b=10) { cout<<“a+b=“<<(a+b); } func(7, 3); //a+b=10 func(7); //a+b=17 Chú ý: Các tham số mặc định phải được đặt ở cuối danh sách tham số.
  17. 8. Bổ sung thêm toán tử quản lý bộ nhớ động: new và delete ➢ Trong C++ có thể sử dụng các hàm cấp phát bộ nhớ động của C như: hàm malloc để cấp phát bộ nhớ, hàm free để giải phóng bộ nhớ được cấp phát. ➢ Ngoài ra trong C++ còn đưa thêm toán tử new để cấp phát bộ nhớ và toán tử delete để giải phóng bộ nhớ được cấp phát bởi new ➢ Cách dùng toán tử new để cấp phát bộ nhớ như sau: Kiểu *p; p = new Kiểu ; // Cấp phát bộ nhớ cho một biến (một phần tử) p = new Kiểu[n] ; //Cấp phát bộ nhớ cho n phần tử
  18. ➢ Nếu thành công thì p sẽ chứa địa chỉ đầu vùng nhớ được cấp phát. ➢ Nếu không thành công thì p = NULL.
  19. VD: xin cấp phát ma trận 10x10 void main() { int mat; int i; mat=new int* [10]; if(mat==NULL) return; //hết bộ nhớ → kết thúc chương trình for(i=0; i<10; i++) mat[i]=new int [10]; //các lệnh nhập, xử lý và xuất ma trận }
  20. ➢ Toán tử delete dùng để giải phóng vùng nhớ được cấp phát bởi new Cách dùng như sau: delete p ; // p là con trỏ dùng trong new Ví dụ: float *px ; px = new float[2000] ; // Cấp phát bộ nhớ cho 2000 phần tử thực // Sử dụng bộ nhớ được cấp phát delete px ; // giải phóng bộ nhớ
  21. Bài tập ◼ Bài tập chương 1 sách Nguyễn Thanh Thủy, Bài tập lập trình hướng đối tượng với C++, NXB Khoa học kỹ thuật Hà Nội 2001.