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

3 minute read

1.6 C++ and Object-Oriented Programming

Các cuộc thảo luận trước đã giả định rằng C++ là ngôn ngữ hướng đối tượng, và tất cả các tính năng của ngôn ngữ hướng đối tượng mà chúng ta đã thảo luận, minh họa với mã C++. Tuy nhiên, C++ không thuần khiết là một ngôn ngữ hướng đối tượng. C++ là ngôn ngữ có tính hướng đối tượng hơn C hoặc Pascal, chúng không có các tính năng hướng đối tượng, hoặc Ada, hỗ trợ cho các lớp (packages) và instances. Tuy nhiên, C++ ít hướng đối tượng hơn các ngôn ngữ hướng đối tượng khác như Smalltalk hoặc Eiffel.

C++ không thực thi tiếp cận hướng đối tượng. Chúng ta có thể lập trình trong C++ mà không biết các tính năng như vậy là một phần của ngôn ngữ. Lý do cho điều này chính là sự phổ biến của C, C++ là bản nâng cấp của C, vì thế một lập trình viên C có thể dễ dàng chuyển qua C++ chỉ cần thích nghi với các tính năng quen thuộc như I/O, cơ chế gọi tham chiếu, giá trị mặc định đối với các tham số của hàm, nạp chồng toán tử, hàm nội tuyến, và những thứ tương tự. Sử dụng ngôn ngữ lập trình hướng đối tượng như là C++ không đảm bảo rằng chúng tôi đang lập trình hướng đối tượng. Mặc khác, không phải lúc nào cũng cần thiết phải gọi toàn bộ các máy móc của các lớp và các hàm thành viên, đặc biệt trong chương trình nhỏ, không thực hiện lập trình hướng đối tượng không hẳn là một bất lợi. Ngoài ra, C++ dễ tích hợp với mã C hiện có hơn các ngôn ngữ lập trình hướng đối tượng khác.

C++ có phương tiện đóng gói tuyệt vời cho phép kiểm soát các thông tin được ẩn đi. Tuy nhiên, có một sự nới lỏng đói với quy tắc này trong việc sử dụng lời gọi các hàm bạn bè. Vấn đề là thông tin cá nhân của một lớp nhất định không thể truy cập bởi bất kì ai, và mọi thông tin công khai thì mọi người dùng có thể truy cập. Nhưng thỉnh thoảng chúng tôi chỉ muốn cho phép người dùng có quyền truy cập đến kho thông tin riêng tư. Điều này có thể thực hiện nếu class liệt kê các chức năng của người dùng dưới dạng bạn bè. Ví dụ, nếu định nghĩa là:

class C {
    int n;
    friend int f();
} ob;

hàm f() có quyền truy cập trực tiếp đến biến n thuộc lớp C, như trong

int f ()
{ return 10 * ob.n; }

Điều này có thể được coi là vi phạm nguyên tắc che giấu thông tin, tuy nhiên, bản thân class C cấp quyền công khai cho một số người dùng những gì là riêng tư và không thể truy cập đối với những người khác. Như vậy, bởi vì lớp có quyền kiểm soát những gì cần xen xét một hàm bạn bè, cơ chế hàm bạn bè có thể xem xét như là một tiện ích mở rộng của nguyên tắc che giấu thông tin. Cơ chế này thừa nhận rằng, nó được sử dụng để tạo điều kiện lập trình và tăng tốc độ thực hiện, bởi vì viết code mà không sử dụng đến hàm bạn bè có thể là một vấn đề lớn. Việc nới lỏng một số quy tắc như vậy không phải là hiếm trong khoa học máy tính, các ví dụ khác bao gồm sự tồn tại của vòng lặp trong ngôn ngữ chức năng, như là LISP, hoặc lưu trữ một số thông tin ở đầu tệp dữ liệu vi phạm mô hình quan hệ cơ sở dữ liệu, như trong dBaseIII+.

Updated: