bài giảng môn nguyên lý các ngôn ngữ lập trình C7

17 560 0
bài giảng môn nguyên lý các ngôn ngữ lập trình C7

Đ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

Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại BÀI 7: CÁC ĐỐI TƯỢNG VÀ TÍNH HIỆU QUẢ THỜI GIAN CHẠY – C++ HƯỚNG ĐỐI TƯỢNG TỔNG QUAN C++ mở rộng hướng đối tượng ngôn ngữ C Ban đầu gọi C với lớp, có tên C++ vào khoảng 1984 Nhà nghiên cứu Phòng thí nghiệm Bell quan tâm mô tên Bjarne Stroustrup bắt đầu dự án C++ vào đầu năm 1980 Mục đích ông bổ sung đối tượng lớp cho C, sử dụng kinh nghiệm ông với Simula sở cho thiết kế Thiết kế c kinh nghiệm ông với Simula sở cho thiết kế Thiết kế cài đặt C++ ban đầu nỗ lực người, mục đích tạo sản phẩm thương mại Tuy nhiên, mối quan tâm đến đối tượng cấu trúc chương trình tăng năm 1980, nên C++ trở nên phổ cập sử dụng rộng rãi Trong năm 1990, C++ trở thành ngôn ngữ lập trình hướng đối tượng sử dụng rộng rãi nhất, với chương trình dịch môi trường phát triển tốt cho máy trạm Macintoch, PC dựa Unix Ngôn ngữ lập trình C sử dụng để viết hệ điều hành Unix Bell Laboratories Cài đặt gốc C++ bước tiền xử lý mà chuyển đổi C++ thành C 2.1 Các mục đích ràng buộc thiết kế Mục đích C++ cung cấp đặc tính hướng đối tượng ngôn ngữ dựa C mà không làm tính hiệu C Trong trình bổ sung đối tượng vào C, số cải tiến khác thực Mục tiêu thiết kế C++ tóm tắt sau: oạAn toàn bảo mật thông itn • Trừu tượng liệu đặc tính hướng đối tượng • Kiểm tra kiểu tĩnh tốt • Tính tương thích ngược lại với C Nói cách khác hầu hết mã C cần dịch C++ hợp lệ, không đòi hỏi thay đổi đáng kể mã • Tính hiệu mã dịch, tuân thủ theo nguyên tắc ‘nếu bạn không sử dụng đặc tính đó, bạn trả giá cho nó’ 13 Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Nguyên lý khẳng định mục đích cuối quan trọng đòi hỏi phải suy nghĩ để đánh giá Nguyên lý giả thiết chương trình C cần dịch hiệu chương trình dịch C++ giống chương trình dịch C Như vi phạm nguyên lý cài đặt số nguyên C đối tượng sử dụng phương thức tìm kiếm động để tìm hàm số nguyên thời gian chạy, giảm đáng kể việc thực thi tính toán số nguyên C Nguyên lý nghĩa lệnh C++ mà xuất C cần phải cài đặt xác theo cách hai ngôn ngữ, thay đổi chấp nhận C+ +, không làm chậm việc thực thi mã dịch trừ số đặc tính chậm C++ sử dụng chương trinh 2.1.1 Tương thích với C Quyết định giữ tính tương thích với C có tác động bao trùm lên thiết ké C++ Những người quen với C biết C có mô hình máy chuyên biệt, bộc lộ nhiều cấu trúc kiến trúc máy tính bên Cụ thể thao tác C mà trả địa biến đặt mẫu bit vào vị trí tùy ý cho chương trình C dựa biểu diễn xác liệu Do C++ cần tôn trọng biểu diễn liệu giống C Hầu hết ngôn ngữ hướng đối tượng khác, bao gồm ngôn ngữ thiết kế trước sau C++, sử dụng thu dọn rác để giảm nhẹ cho lập trình viên khỏi nhiệm vụ định danh đối tượng không truy cập giải phóng nhớ gắn kết Tuy nhiên, lý cố hữu nào, đối tượng cần thu dọn rác Kết nối mạnh với điểm nhấn gia tăng tính trừu tượng tính đắn kiểu Nó cần phải phù hợp với mục tiêu khác C++ để xuất dạng gom rác mà khả thi dạng không ảnh hưởng thời gian chạy chương trình mà không sử dụng đối tượng gom rác Tuy nhiên, có đặc tính C mà làm cho gom rác khó, khó đặt đối tượng C++ vào nơi gom rác Không đếm gom rác cho triết lý C để lập trình viên kiểm soát nhớ, mà tương tự trỏ số nguyên làm cho xây dựng hiệu gom rác mà làm việc chương trình C++ sử dụng số học trỏ chuyển số nguyên thành trỏ Một định quan trọng khác xử lý đối tượng C++ khái quát cấu trúc struct C Nó buộc phải cho phép đối tượng khai báo thao tác cách structs Nói riêng, đối tượng đặt ghi kích hoạt hàm khối cục bộ, heap, cần thao tác trực tiếp (tức không qua trỏ) Đây điểm mà C++ trệch hướng so với Simula Cụ thể, C++ cho phép dạng gán đối tượng mà đối tượng sang không gian trước chiếm đối tượng khác, hầu hết ngôn ngữ đối tượng khác cho phép gán trỏ cho đối tượng Một số khía cạnh khác đối tượng C++ ngăn xếp khám phá tập nhà 14 An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính 2.1.2 Bài 4: Mã khối đại Thành công C++ C++ ngôn ngữ thiết kế cẩn thận mà cách đáng khâm phục, ràng buộc thiết kế khó Đo theo số người sử dụng, C++ không nghi ngờ ngôn ngữ thành công thập niên từ phát triển đến năm 1980 Java đời năm 1990 Tuy nhiên, mục đích thiết kế tương thích ngược với C không cho phép có nhiều không gian cho xem xét bổ sung mặt thẩm mỹ Một số khía cạnh C++ trở nên phức tạp khó hiểu nhiều lập trình viên Mặt khác nhiều lập trình viên C sử dụng chương trình dịch C++ đánh giá lợi ích kiểm tra kiểu tốt Có lẽ tóm tắt công cho thành công C++ sử dụng rộng rãi, với hầu hết người sử dụng chọn để lập trình tập ngôn ngữ mà họ hiểu cảm thấy thuận tiện cho nhiệm vụ lập trình họ Nói cách khác, C++ công cụ lập trình hữu ích mà cho phép người thiết kế tạo chương trình hướng đối tượng tốt, không buộc phong cách lập trình tốt theo cách mà thiết kế ngôn ngữ khác thường làm Điều hướng tới khẳng định số thống kê chống lại C++ Trên thực tế, nhiều thành công qui cách mà C++ thiết kế lập trình viên lựa chọn hạn chế lập trình viên theo phong cách lập trình riêng Có nhiều hướng dẫn phong cách in mà biện hộ việc sử dụng số đặc tính C++ cảnh báo việc sử dụng khác Những mà quan tâm đến việc lập trình nghiêm túc C++ quan tâm tìm hiểu lập trình viên dùng ngôn ngữ này, muốn tham quan thư viện kho sách chúng đọc số hướng dẫn hành oạAn toàn bảo mật thông itn 15 Trần Văn Dũng BM Khoa học máy tính 2.2 Bài 4: Mã khối đại Tổng quan C++ Trước xem xét đặc tính C++ mục sau, ta lướt qua số bổ sung cho C mà không liên quan đến đối tượng 2.2.1 Bổ sung cho C không liên quan đến đối tượng Có số khác biệt C++ C mà không liên quan đến đối tượng Mặc dù quan tâm chủ yếu đến hệ thống đối tượng C++, nên xem xét thay đổi quan trọng Một số bổ sung thú vị • Kiểu bool • Kiểu tham chiếu truyền qua tham chiếu (pass-by-reference) • Tải chồng định nghĩa người sử dụng • Templates hàm • Ngoại lệ Cũng có số thay đổi lời gọi quản trị nhớ (new delete thay cho malloc free), thay đổi stream file đầu vào đầu ra, bổ sung giá trị tham số mặc định khai báo hàm, số thay đổi nhỏ bổ sung giải vào cuối dòng loại bỏ cần thiết từ khóa typedef với khai báo struct/unions/enum Ba bổ sung đầu, bool, pass-by-reference overloading bàn phần cuối mục Templates hàm xét chương trước Kiểu bool Trong C, giá trị để kiểm tra logic số nguyên Chẳng hạn, C Reference Manual định nghĩa phép so sánh phép toán logic && sau: • Phép toán < (nhỏ hơn) trả toán hạng thứ nhỏ toán hạng thứ hai trường hợp ngược lại • Phép toán && trả hai toán hạng khác không - ngược lại Điều cho phép viết lệnh C với biểu thức sau : mà kết hợp phép so sánh với số học 16 An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Để phân biệt cú pháp Booleans integers, C++ có kiểu riêng: bool với giá trị true false Dựa vào chuyển đổi, điều không hoàn toàn tách intergers Booleans Cụ thể, giá trị nguyên gán cho biến kiểu bool, với chuyển đổi ẩn từ số khác vào true số vào false Tuy nhiên, kiểu bool làm cho dễ đọc nhiều chương trình việc biến giá trị trả hàm sử dụng giá trị Bool thay số nguyên Các thay đổi C++ bắt chước C khai báo mà định nghĩa kiểu bool giá trị true, false Một khác biệt built-in Booleans C++ Booleans C booleans C++ in ra, chúng in true false Vì chuyển đổi ẩn, nên kiểu bool riêng biệt không giúp xử lý lỗi đơn giản thường gặp lập trình viên C Ít người bắt đầu, lệnh điều kiện sau: mà kết lỗi in ấn ; lập trình viên muốn viết oạAn toàn bảo mật thông itn 17 Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Lý kiểm tra kiểu câu lệnh dịch C bỏ qua phép gán số nguyên a=b có kiểu nguyên có giá trị b Vì lệnh điều kiện C đòi hỏi số nguyên (không phải Boolean), nên cảnh báo gắn kết với câu lệnh Trong đa số ngôn ngữ với bool khác số nguyên, lỗi viết if (a=b) c Tuy nhiên, Booleans C++ tự động chuyển đổi thành integers, nên lệnh if (a=b) c hợp lệ C++ Vì việc đưa bool vào C++ co tác động nhỏ, bạn ngạc nhiên phải làm Trước kiểu Bool bổ sung, C/C++ thường chứa định nghĩa bool, true false macro, mô tả Tuy nhiên, bool cần định nghĩa cách khác, với kiểu kết có ngữ nghĩa khác đôi chút Chẳng hạn, bool định nghĩa int, unsigned int, short int Nó gây vấn đề kết hợp thư viện mà sử dụng định nghĩa khác Vì có ích chuẩn code cách bổ sung kiểu bool xây sẵn Reference type Pass-By-Reference Trong C, tham số truyền giá trị Nếu bạn muốn sửa đổi giá trị truyền tham số, bạn cần truyền trỏ cho giá trị Chẳng hạn, code C cho hàm tăng số nguyên: Trong C++, dùng pass-by-reference sau: 18 An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Tác động tương tự đối số trỏ C, hàm gọi không cung cấp địa đối số hàm gọi trỏ tham chiếu Sự trừng phạt nhẹ thuận tiện với đối số trỏ C lập trình viên cần phải nhớ hàm cho dùng passby-value hay pointer danh sách tham số Nếu đối số trỏ thay đổi thành passby-reference C++, không tính toán địa cần thiết phần lời gọi lập trình viên sử dụng hàm từ thư viện tránh hoàn toàn vấn đề Lợi ích reference tường minh gọi pass-by-constant-reference Nếu đối số hàm không bị thay đổi hàm, đặc tả đối số cần phải số, void f (const int & x) Trong thân hàm với tham số x truyền cách đó, không hợp lệ gán cho x Tải chồng người sử dụng định nghĩa Như bàn chương trước, tải chồng cho phép tên sử dụng cho nhiều giá trị Trong C++ khai báo số hàm với tên, hàm có số kiểu tham số khác Chẳng hạn, chương trình C++ với ba kiểu hàm in, gọi show: oạAn toàn bảo mật thông itn 19 Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Vì ba hàm có kiểu đối số khác nhau, chương trình dịch xác định hàm gọi kiểu tham số thực tế sử dụng lời gọi hàm C++ không cho phép hàm tải chồng mà có số kiểu đối số khác giá trị trả chúng hàm C C++ gọi lệnh Khi hàm gọi lệnh, không để ý đến giá trị trả hàm, chương trình dịch cách xác định hàm gọi Một nguồn gốc gây nhầm lẫn tiềm C++ phát sinh từ kết hợp từ tải chồng chuyển đổi tự động Cụ thể, tham số thực tế lời gọi hàm không sánh cách xác với phương án hàm, chương trình dịch thử tạo cách sánh cách thăng cấp và/hoặc chuyển kiểu Trong code ví dụ sau: lời gọi f(‘a’) có kết f(int) thay f(int*) char thăng cấp trở thành int Khi hàm tải chồng có số cách chuyển ẩn, khó cho lập trình viên hiểu chuyển kiểu lời gọi sử dụng 2.2.2 Các đặc tính hướng đối tượng Phần quan trọng C++ tập khái niệm hướng đối tượng bổ sung vào C; có khái niệm sau: 20 • Classes, mà khai báo kiểu gắn kết với đối tượng tạo nên từ lớp đó, thành viên liệu đối tượng hàm thành viên lớp • Objects, mà bao gồm liệu riêng tư hàm công khai để truy cập liệu ẩn đó, giống ngôn ngữ hướng đối tượng khác • Dynamic lookup, hàm thành viên mà khai báo ảo Hàm ảo lớp suy diễn (lớp con) cài đặt khác so với hàm ảo có tên lớp sở (superclass) • Encapsulation, dựa định rõ lập trình viên public, private, protected mà xác định liệu hàm khai báo lớp có nhìn thấy bên định nghĩa lớp không • Inheritance, sử dụng subclassing: lớp định nghĩa việc kế thừa liệu hàm khai báo lớp khác C++ cho phép kế thừa đơn, lớp có lớp sở (superclass) kế thừa lặp lớp có nhiều lớp sở An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính • Bài 4: Mã khối đại Subtyping, dựa subclassing: dùng cho lớp định nghĩa kiểu kiểu định nghĩa lớp khác, kế thừa cần sử dụng Tuy nhiên, người lập trình viên định kế thừa có cho kết kiểu hay không Đây tóm tắt ngắn; có nhiều tính chất khác C++ Các mô tả class, inheritance object mục sau Thuật ngữ C++ Mặc dù thuật ngữ C++ khác với thuật ngữ Java, có tương ứng gần Thuật ngữ class object sử dụng tương tự Thuật ngữ subclass không thường dùng với C++ Thay vào đó, superclass gọi base class subclass gọi derived class Thuật ngữ inheritance có nghĩa hai ngôn ngữ 2.2.3 Các định tốt chỗ có vấn đề C++ kết nỗ lực lớn gồm phê phán đề xuất từ nhiều lập trình viên có kinh nghiệm Trong nhiều khía cạnh, ngôn ngữ thiết kế tốt có thể, với mục tiêu bổ sung đối tượng kiểm tra kiểu thời gian dịch tốt cho C, không làm tính hiệu tương thích ngược Một số phần thiết kế thành công riêng • Encapsulation: ý cẩn thận đến tính nhìn thấy ẩn giấu, bao gồm mức độ nhìn thấy public, protected, private hàm lớp friend • Sự tách biệt subtyping inheritance: lớp có lớp sở public private, cho lập trình viên kiểm soát tường minh phân cấp kiểu kết • Templates • Kiểm tra kiểu tĩnh tốt C Cũng có số định thành công nhỏ C++ Một ví dụ cách mà phép toán hóa giải phạm vi (được viết ::) sử dụng kết nối với kế thừa đơn lặp để hóa giải nhập nhằng mà vấn đề ngôn ngữ khác Một số chỗ có vấn đề Ở có số khía cạnh C++ mà lập trình viên thấy khó khăn Một số chỗ có vấn đề • Ép kiểu chuyển kiểu, mà phức tạp khó lường trước số tình • Các đối tượng gắn kết với ngăn xếp khía cạnh khác việc quản lý nhớ đối tượng oạAn toàn bảo mật thông itn 21 Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại • Tải chồng, chế chọn mã phức tạp C++ mà tương tác khó đoán với tìm kiếm động (tìm kiếm hàm ảo) • Kế thừa bội, mà phức tạp C++ so với ngôn ngữ khác cách đối tượng bảng hàm ảo cấu hình truy cập Các chỗ có vấn đề tồn quên sót mà mục tiêu C++, theo kết luận logic chúng, dẫn đến thiết kế với tính chất Nói cách khác, vấn đề kết không cẩn thận thiếu ý, mà hệ định đưa với suy nghĩ khách quan khác Công mà nói hầu hết chúng có nguồn gốc C, phần mở rộng C++ cho C Các đặc tính nguyên nhân làm cho lập trình viên ưu thích ngôn ngữ khác so sánh với C tính hiệu tuyệt đối mã dịch không chất cho ứng dụng Một số lập trình viên nói gom rác, giao diện chuẩn để viết chương trình song song vấn đề C++ Tuy nhiên có công cụ mà đơn giản nằm phạm vi của thiết kế ngôn ngữ Ép kiểu chuyển kiểu Ép kiểu hướng chương trình dịch xử lý biểu thức kiểu biểu thức kiểu khác Chẳng hạn, (float) i dẫn cho chương trình dịch xử lý biến i float, cho dù kiểu khác (int*)x buộc x xử lý trỏ đến số nguyên Trong số tình huống, chương trình dịch C C++ thực chuyển kiểu ẩn Chẳng hạn, biến gán giá trị biểu thức, biểu thức chuyển đến kiểu gắn kết với biến, cần thiết Trong hầu hết ngôn ngữ hướng đối tượng, chuyển kiểu tự động cho đối tượng từ kiểu sang kiểu khác không làm thay đổi biểu diễn đối tượng Chẳng hạn, Java đối tượng Point xử lý Colored Point mà không thay đổi biểu diễn đối tượng Point, Colored Point biểu diễn theo cách mà tương thích với biểu diễn đối tượng Point Tuy nhiên, kế thừa lặp sử dụng C++, chuyển đối tượng từ subtype sang supertype đòi hỏi thay đổi giá trị trỏ đến đối tượng Điều xảy dẫn tới lỗi khó tìm buộc lập trình viên phải hiểu biểu diễn bên đối tượng Khái quát hơn, Stroustrup tự nhủ ‘Về cú pháp ngữ nghĩa, ép kiểu đặc tính kỳ dị C C++’ The Design and Evolution of C++ (Addison-Wesley, 1994) Các đối tượng ngăn xếp Simula, Smalltalk, Java cho phép đối tượng tạo heap, ngăn xếp thời gian chạy Trong ngôn ngữ khác này, đối tượng truy cập thông qua trỏ, qua biến ngăn xếp thông thường mà chứa không gian cho đối tượng có kích thước Trong đối tượng ngăn xếp C++ cấp giải phóng cách hiệu phần việc nhập xuất khối cục bộ, có số nhược điểm Điểm thô hiển nhiên cách mà phép gán thực kết hợp với subtyping, cắt (truncating) đối tượng đến kích thước vừa phép gán thực Điều thay đổi hành vi đối tượng, việc loại bỏ số thành viên liệu buộc chương trình dịch thay đổi cách hàm ảo lựa chọn Mặc dù định nghĩa ngôn 22 An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại ngữ C++ giải thích xảy sao, hành vi phép gán đối tượng làm phương hướng lập trình viên Overloading Tải chồng thân đặc tính ngôn ngữ lập trình tồi, tải chồng người sử dụng định nghĩa C++ phức tạp Thêm vào đó, tương tác với tìm kiếm động (các hàm ảo) không đoán trước Vì tải chồng chế lựa chọn code thời gian dịch tìm kiếm động chế lựa chọn code thời gian chạy, hai chế có hành vi khác Nó gây nhầm lẫn cho nhiều lập trình viên Kế thừa bội Đây số phức tạp cố hữu gắn kết với kế thừa bội mà khó tránh khỏi Thiết kế ngôn ngữ C++ dàn xếp vấn đề với đối tượng phức tạp định dạng bảng tìm kiếm phương thức Không may, chi tiết cài đặt kế thừa bội đưa vào cẩu thả dựa lập trình thông thường, buộc lập trình viên người quan tâm đến sử dụng bội phải tìm hiểu số chi tiết cài đặt Ngay lập trình viên không sử dụng thừa kế bội bị ảnh hưởng lớp derived class định nghĩa sử dụng kế thừa bội 2.3 Các lớp, kế thừa hàm ảo Các đặc tính hướng đối tượng C++ qua ví dụ lớp Point Colored Point 2.3.1 Các lớp C++ đối tượng Chúng ta đối tượng điểm C++ việc khai báo lớp Pt, khai báo riêng hàm thành viên lớp Pt Khai báo lớp cài đặt định nghĩa giao diện đối tượng điểm liệu dùng để cài đặt điểm, không cần chứa code cho oạAn toàn bảo mật thông itn 23 Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại hàm thành viên Khai báo xuất lớp Pt chia thành ba phần, public members, protected members privated members lớp Để đơn giản, Pt điểm chiều, điểm có tọa độ x: Constructors Hàm tạo dùng để khởi tạo liệu thành viên đối tượng chương trình chứa lệnh biểu thức đối tượng tạo Khi điểm tạo, nhớ cấp, heap ghi kích hoạt ngăn xếp, tùy thuộc vào lệnh tạo đối tượng Do hàm tạo gọi khởi tạo vị trí cấp cho đối tượng Hàm tạo khai báo với cú pháp hàm thành viên, loại trừ tên hàm trùng với tên lớp Trong lớp Point, hai hàm tạo khai báo Kết hàm tải chồng Pt, với hàm tạo gọi đối số integer hàm khác gọi đối số Pt Visibility Như nói, khai báo xuất lớp Pt chia thành ba phần: thành viên public, thành viên protected thành viên private lớp Các định rõ này, mà tác động đến tính nhìn thấy khai báo, tóm tắt sau: 24 • public: thành viên mà nhìn thấy phạm vi đối tượng lớp tạo truy cập • protected: thành viên mà nhìn thấy lớp lớp suy diễn An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính • Bài 4: Mã khối đại private: thành viên nhìn thấy lớp thành viên tạo Lớp Pt viết theo qui ước nhìn thấy chuẩn mà sử dụng nhiều lập trình viên C++ Dữ liệu thành viên private, cho lập trình viên muốn thay đổi cách biểu diễn đối tượng lớp, điều thực mà không làm ảnh hưởng đến lớp khác (bao gồm derived classes) phụ thuộc vào lớp Các thành viên thay đổi liệu private tạo protected, cho lớp suy diễn thay đổi giá trị liệu thành viên, code bên không cho phép làm điều Cuối cùng, hàm thành viên, mà đọc giá trị liệu thành viên cung cấp thao tác có ích đối tượng, khai báo public, cho code với truy cập đến đối tượng lớp thao tác đối tượng theo nhiều cách có ích Một đặc tính C++ ví dụ định friend, mà sử dụng cho phép tính nhìn thấy có hiệu lực cho phần private lớp Một lớp khai báo hàm friend lớp friend Nếu lớp Pt chứa khai báo friend class A, code viết phần lớp A (như hàm thành viên lớp A) truy cập đến phần private lớp Pt Cơ chế friend sử dụng cặp lớp có quan hệ chặt chẽ, ma trận vectơ Các hàm ảo Các hàm thành viên định virtual lại nonvirtual, mà mặc định cho hàm thành viên mà từ khóa virtual đứng trước Nếu phương thức virtual, định nghĩa lại lớp suy diễn Vì đối tượng khác có hàm thành viên khác có tên, việc chọn hàm thành viên ảo tiến hành tìm kiếm động: có chế chọn code thời gian chạy mà sử dụng để tìm triệu hồi hàm Các bước thêm gọi hàm ảo hiệu hàm không ảo Các phương thức không ảo định nghĩa lại lớp suy diễn Như kết quả, lời gọi đến phương thức không ảo, dịch thực theo cách lời gọi hàm thông thường không gắn kết với đối tượng lớp Điểm chung hay nhầm lẫn là, mặt cú pháp, khai báo lại hàm không ảo xuất lớp suy diễn Tuy nhiên, tạo hàm tải chồng, với code chọn thời gian dịch Chúng ta bàm thêm việc mục sau 2.3.2 Các lớp suy diễn C++ (kế thừa) Lớp ColorPt sau định nghĩa mở rộng điểm chiều lớp Pt Như tên đề xuất, đối tượng ColorPt có màu bổ sung Để đơn giản, giả thiết oạAn toàn bảo mật thông itn 25 Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại màu biểu diễn số nguyên Thêm vào đó, để thể định nghĩa hàm ảo, dịch chuyển điểm màu làm cho màu tối chút: Inheritance Dòng đầu khai báo lớp ColorPt có lớp Pt lớp sở công khai; điều ý nghĩa mệnh đề: public Pt đứng sau tên lớp ColorPt Nếu từ khóa public bỏ qua, lớp sở gọi private base class 26 An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Khi lớp có lớp sở tiếp, lớp kế thừa tất thành viên lớp sở Điều có nghĩa đối tượng ColorPt có thành viên public, protected private lớp Pt Cụ thể, lớp ColorPt khai báo liệu thành viên color, đối tượng ColorPt có liệu thành viên x, kế thừa từ Pt Sự khác biệt lớp sở public lớp sở private lớp sở public, lớp khai báo (suy diễn) khai báo kiểu lớp sở Nếu không, C++ không xử lý lớp kiểu con, có đủ thành viên lớp sở Nó bàn cụ thể mục 7.4 Constructors Lớp ColorPt có ba hàm tạo Như lớp Pt, kết hàm tải chồng ColorPt với lựa chọn ba hàm thực thời gian dịch tùy thuộc vào kiểu đối số hàm tạo Thân hai hàm tạo nêu trước mô tả hàm tạo lớp suy diễn gọi hàm tạo lớp sở Như với Points, colored point tạo, không gian cấp, heap ghi kích hoạt ngăn xếp, phụ thuộc lệnh tạo đối tượng, hàm tạo gọi để khởi tạo vị trí cấp cho đối tượng Vì lớp suy diễn có thành viên liệu lớp sở, hầu hết hàm tạo lớp suy diễn gọi hàm tạo lớp sở để khởi tạo thành viên liệu kế thừa Nếu lớp sở có thành viên liệu private, mà trường hợp Pt, có cách để lớp suy diễn ColorPt khoải tạo thành viên private gọi hàm tạo lớp sở Visibility Khi lớp kế thừa từ lớp khác, thành viên chất có tầm nhìn lớp suy diễn lớp sở Cụ thể hơn, thành viên public lớp sở trở thành thành viên public lớp suy diễn, thành viên protected lớp sở truy cập lớp suy diễn lớp suy diễn nó, mà tầm nhìn thành viên khai báo protecred lớp suy diễn Các thành viên private kế thừa tồn lớp suy diễn, không gọi tên trực tiếp code viết phần lớp suy diễn Chẳng hạn, đối tượng ColorPt có thành viên số nguyên x, có cách gán đọc giá trị thành viên gọi hàm public protected từ lớp Pt Virtual functions Như nói từ trước, hàm ảo lớp sở định nghĩa lại lớp suy diễn Hàm thành viên move khai báo ảo virtual lớp Pt đinh nghĩa lại lớp ColorPt Trong ví dụ này, hàm move cho điểm t thay đổi tọa độ x điểm, hàm move điểm màu thay đổi tọa độ x màu Nếu cài đặt ColorPt ::move bỏ qua, hàm move từ Pt trở thành kế thừa cho ColorPt Cài đặt hàm ảo bàn mục sau oạAn toàn bảo mật thông itn 27 Trần Văn Dũng BM Khoa học máy tính 2.3.3 Bài 4: Mã khối đại Các hàm ảo Tìm kiếm động sử dụng cho hàm ảo Hàm ảo f định nghĩa đối tượng o gọi cú pháp o.f(…) p->f(…) p trỏ đến đối tượng o Khi hàm ảo gọi, mã hàm xác định vị trí dãy bước thời gian chạy Các bước tương tự thuật toán tìm kiếm Smalltalk, đơn giản hơn, số tối ưu thực hệ thống kiểu tĩnh C++ Mỗi đối tượng có trỏ đến cấu trúc liệu gắn kết với lớp nó, gọi bảng hàm ảo viết tắt vtable Quan hệ đối tượng, vtable lớp code hàm ảo nêu Hình 7.1 với điểm điểm màu Hình 7.1 Biểu diễn điểm điểm màu C++ Hàm ảo lớp sở Giả sử p trỏ đến đối tượng Pt Hình 7.1 Khi biểu thức dạng p -> move(…) tính toán, code move tìm thực thi Quá trình bắt đầu việc theo trỏ vtable p để đến bảng dành cho lớp Pt Vtable Pt mảng trỏ tới hàm Vì move hàm ảo tiên (và có nó) lớp Pt, chương trình dịch xác định vị trí mảng trỏ move Do đó, mã thời gian chạy tìm cho move lần theo trỏ bảng vtable Pt gọi hàm đạt nhờ trỏ Không giống Smalltalk, không cần tìm vtable thời gian chạy để xác định trỏ dành cho move Hệ thống kiểu C++ cho phép chương trình dịch xác định kiểu trỏ đối tượng thời gian dịch điều cho phép chương trình dịch tìm vị trí tương đối trỏ hàm ảo vtable thời gian dịch, loại bỏ cần thiết phải tìm kiếm thời gian chạy vtable 28 An toàn bảo mật thông tin Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối đại Hàm ảo lớp suy diễn Giả sử cp trỏ đến đối tượng điểm màu Hình 7.1 Khi biểu thức dạng cp -> move(…) tính toán, thuật toán tìm code cho move xác p->move(…): bảng Vtable ColorPt mảng chứa hai trỏ, cho move cho darken Chương trình dịch xác định thời gian dịch cp trỏ tới đối tượng Colorpt move hàm ảo lớp, thuật toán thời gian chạy lần theo trỏ vtable mà không cần tìm kiếm thời gian chạy kiểu Smalltalk vtable Tương ứng vtables lớp sở lớp suy diễn Như hệ subtyping, chương trình gán điểm màu cho trỏ đến điểm gọi move qua trỏ lớp sở theo xác định tiếp đối tượng cài đặt chúng Quan hệ đối tượng quan hệ giao diện chúng quan hệ cài đặt chúng Ngôn ngữ lập trình hướng đối tượng đại cung cấp chế để sử dụng quan hệ giao diện quan hệ cài đặt trình thiết kế cài đặt Các cấu trúc liệu sử dụng ví dụ trước lập trình top-down rẩ đơn giản tồn bất biến trình làm mịn chương trình Khi việc làm mịn bao gồm thay thủ tục thủ tục chi tiết hơn, ngôn ngữ lập trình cấu trúc Algol, Pascal C đáp ứng Tuy nhiên, toán phức tạp hơn, thủ tục cấu trúc liệu chương trình cần làm mịn Vì đối tượng kết hợp hàm liệu, ngôn ngữ lập trình hướng đối tượng hỗ trợ làm mịn kết hợp hàm liệu hiệu so với ngôn ngữ hướng thủ tục oạAn toàn bảo mật thông itn 29 [...]... trong quá trình làm mịn của chương trình Khi việc làm mịn bao gồm thay thế một thủ tục bằng một thủ tục chi tiết hơn, thì các ngôn ngữ lập trình cấu trúc như Algol, Pascal và C là đáp ứng được Tuy nhiên, đối với các bài toán phức tạp hơn, thì cả thủ tục và cả cấu trúc dữ liệu của chương trình đều cần được làm mịn cùng nhau Vì các đối tượng là sự kết hợp của hàm và dữ liệu, các ngôn ngữ lập trình hướng... định tiếp các đối tượng và cài đặt chúng Quan hệ giữa các đối tượng ở đây có thể là quan hệ giữa các giao diện của chúng hoặc quan hệ giữa các cài đặt của chúng Ngôn ngữ lập trình hướng đối tượng hiện đại cung cấp cơ chế để sử dụng quan hệ giữa các giao diện và quan hệ giữa các cài đặt trong quá trình thiết kế và cài đặt đó Các cấu trúc dữ liệu được sử dụng trong các ví dụ trước đây của lập trình top-down... khác nhau Nó gây ra nhầm lẫn cho nhiều lập trình viên Kế thừa bội Đây là một số phức tạp cố hữu gắn kết với kế thừa bội mà khó tránh khỏi Thiết kế ngôn ngữ C++ dàn xếp các vấn đề này với đối tượng phức tạp và định dạng bảng tìm kiếm phương thức Không may, các chi tiết cài đặt kế thừa bội có vẻ được đưa vào cẩu thả dựa trên lập trình thông thường, đôi khi buộc lập trình viên người quan tâm đến sử dụng... học máy tính • Bài 4: Mã khối hiện đại private: các thành viên chỉ được nhìn thấy trong lớp ở đó các thành viên này được tạo Lớp Pt được viết theo một qui ước nhìn thấy chuẩn mà được sử dụng bởi nhiều lập trình viên C++ Dữ liệu thành viên là private, sao cho nếu lập trình viên muốn thay đổi cách biểu diễn các đối tượng của lớp, thì điều này có thể được thực hiện mà không làm ảnh hưởng đến các lớp khác...Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối hiện đại ngữ C++ giải thích cái gì xảy ra và tại sao, hành vi của phép gán đối tượng có thể làm mất phương hướng lập trình viên Overloading Tải chồng bản thân nó không phải đặc tính của ngôn ngữ lập trình tồi, nhưng tải chồng do người sử dụng định nghĩa của C++ có thể phức tạp Thêm vào đó, sự tương tác với tìm kiếm động (các hàm ảo) có thể không đoán trước... số chi tiết cài đặt Ngay cả lập trình viên không sử dụng thừa kế bội có thể bị ảnh hưởng nếu lớp derived class được định nghĩa sử dụng kế thừa bội 2.3 Các lớp, kế thừa và các hàm ảo Các đặc tính hướng đối tượng chính của C++ qua ví dụ lớp Point và Colored Point 2.3.1 Các lớp C++ và các đối tượng Chúng ta đối tượng điểm trong C++ bằng việc khai báo lớp Pt, và khai báo riêng các hàm thành viên của lớp... thêm về việc này trong mục sau nữa 2.3.2 Các lớp suy diễn C++ (kế thừa) Lớp ColorPt sau định nghĩa sự mở rộng của các điểm một chiều trong lớp Pt Như tên nó đề xuất, các đối tượng ColorPt có màu bổ sung Để đơn giản, chúng ta giả thiết các oạAn toàn và bảo mật thông itn 25 Trần Văn Dũng BM Khoa học máy tính Bài 4: Mã khối hiện đại màu được biểu diễn bằng các số nguyên Thêm vào đó, để thể hiện định nghĩa... tác các đối tượng này theo nhiều cách có ích Một đặc tính của C++ không được thể hiện trong ví dụ này là chỉ định friend, mà được sử dụng cho phép tính nhìn thấy có hiệu lực cho các phần private của lớp Một lớp có thể khai báo các hàm friend và các lớp friend Nếu lớp Pt chứa khai báo friend class A, thì code được viết như một phần của lớp A (như các hàm thành viên của lớp A) có thể được truy cập đến các. .. cơ chế chọn code thời gian chạy mà được sử dụng để tìm và triệu hồi hàm đúng Các bước thêm này gọi các hàm ảo kém hiệu quả hơn hàm không ảo Các phương thức không ảo không thể định nghĩa lại trong các lớp suy diễn Như kết quả, lời gọi đến các phương thức không ảo, được dịch và được thực hiện theo cùng một cách như lời gọi các hàm thông thường không gắn kết với đối tượng hoặc lớp Điểm chung hay nhầm... dữ liệu của lớp cơ sở, hầu hết các hàm tạo của lớp suy diễn sẽ gọi hàm tạo của lớp cơ sở để khởi tạo các thành viên dữ liệu kế thừa Nếu lớp cơ sở có các thành viên dữ liệu private, mà trong trường hợp này là của Pt, thì chỉ có một cách để lớp suy diễn ColorPt khoải tạo các thành viên private là gọi hàm tạo của lớp cơ sở Visibility Khi một lớp kế thừa từ một lớp khác, các thành viên về bản chất có cùng

Ngày đăng: 03/04/2016, 20:35

Mục lục

  • 2.1. Các mục đích và ràng buộc thiết kế

    • 2.1.1. Tương thích với C

    • 2.1.2. Thành công của C++

    • 2.2. Tổng quan về C++

      • 2.2.1. Bổ sung cho C không liên quan đến đối tượng

      • 2.2.2. Các đặc tính hướng đối tượng

      • 2.2.3. Các quyết định tốt và các chỗ có vấn đề

      • 2.3. Các lớp, kế thừa và các hàm ảo

        • 2.3.1. Các lớp C++ và các đối tượng

        • 2.3.2. Các lớp suy diễn C++ (kế thừa)

Tài liệu cùng người dùng

Tài liệu liên quan