Trang chủ » Lập trình » Nền tảng lập trình C/ C++ là gì ? Nên bắt đầu từ C hay C++ ?

Nền tảng lập trình C/ C++ là gì ? Nên bắt đầu từ C hay C++ ?

2328 Lượt xem

Bây giờ, chúng ta bắt đầu xem xét C++ như là một ngôn ngữ lập trình hướng đối tượng. Một câu hỏi mà đa số các người muốn học lập trình C++ là: "Tôi có nên học C trước khi học C++ hay không?Liệu chúng ta có thể xem C++ là C kèm với các lớp hoặc C++ là phiên bản hướng đối tượng của C hay không?". Câu hỏi này giúp tôi nhận ra rằng cần phải tìm sự khác nhau giữa hai ngôn ngữ này.



Về cú pháp, tập hợp lệnh của C++ là một tập rộng hơn của C. Điều này có nghĩa là việc biên dịch một chương trình C bởi trình biên dịch C++ vẫn tốt đẹp nhưng ngược lại thì không.



Về ngữ nghĩa, giữa hai ngôn ngữ này có sự khác biệt rất lớn. Ngữ nghĩa của một ngôn ngữ bảo cho bạn biết ngôn ngữ được sử dụng như thế nào, bạn phải mô tả những gì cho ý tưởng của bạn bằng ngôn ngữ. Về phương diện này, có một bước nhảy khá xa giữa C++ và C. Có thể minh họa sự khác biệt về vấn đề cú pháp và ngữ nghĩa của C++ và C như sau:



Giả sử bạn là một nhà khoa học người Anh vào năm 1600. Bạn nhận được hai quyển sách khoa học. Một quyển được viết tại Việt Nam vào năm 1600. Một quyển khác được viết tại Anh vào năm 1997 và được gửi ngược về quá khứ cho bạn. Đối với quyển thứ nhất, bạn sẽ thấy những ký tự thật buồn cười và phải tốn một thời gian dài bạn mới hiểu được cú pháp của nó. Nhưng một khi bạn đã học được tiếng Việt Nam thì những ký tự này không còn làm bạn ngạc nhiên nữa. Còn quyển sách thứ hai rất giống những ký tự bằng tiếng Anh mà bạn biết nhưng nó lại mang một ý nghĩa lạ lùng. 



" Điểm khác nhau cơ bản về mặt ngữ nghĩa là: C là ngôn ngữ lập trình thủ tục còn C++ là ngôn ngữ lập trình hướng đối tượng. Bạn có thể viết chương trình hướng đối tượng trong C, Pascal, thậm chí bằng Assembler. Tuy nhiên, bạn nên biết một điều là những ngôn ngữ này không được thiết kế cho lập trình hướng đối tượng như C++.

Đối với lập trình thủ tục, những gì ta nghĩ về chương trình gồm có một loạt các chức năng và cấu trúc dữ liệu. Những chức năng này sẽ tác động lên cấu trúc dữ liệu, điều tác chúng và cuối cùng là xuất thông tin kết quả. Họ ngôn ngữ lập trình thủ tục như C, Pascal được xây dựng để hỗ trợ cho kỹ thuật lập trình cấu trúc. Trong đó một vấn đề sẽ được phân rã thành những chương trình nhỏ hơn có thể giải quyết được.



Để cảm nhận được cách tiếp cận của lập trình thủ tục, tôi lấy một ví dụ là việc cập nhật lương cho nhân viên của một tổ chức. Bạn có thể tạo ra một thủ tục có tên là GiveARaise và truyền cấu trúc Employee cho thủ tục này. Trong C, mã lệnh viết cho tác vụ này như sau:



#include <stdio.h>

struct Employee

{

int salary;

int level;

};

void GiveARaise (struct Employee * pEmployee, double pctg);

void InitializeEmployee (struct Employee *pEmp) ;

int main()

{

struct Employee Emp;

InitializeEmployee(&Emp);

Emp.salary = 50 000;

Emp.level =3;

Printf("Emp''s salary : %d\n",Emp.salary);

GiveARaise(&Emp,.23);

Printf("Emp''s salary : %d\n",Emp.salary);

Return 0;

}



void GiveARaise (struct Employee * pEmployee, double pctg)

{

int increment = (int)(pEmployee ->salary*pctg);

printf("Incrementing Employee''s salary by %d\n",

increment);

pEmployee->salary+=increment;

}



void InitializeEmployee(struct Employee *pEmp)

{

pEmp->salary=50 000;

pEmp->level=3;

printf("Initializing Employee with salary :%d\n",

pEmp->salary);

}



Khi biên dịch và chạy đoạn chương trình trên, kết quả xuất hiện trên màn hình là: 



Initializing Employee with salary: 50000 

Emp''s salary: 50000 

Incrementing Employee''s salary by 11500 

Emp''s salary: 61500 



Đoạn chương trình C đơn giản trên minh hoạ một số vấn đề mà người lập trình thủ tục phải đối mặt. Chúng ta sẽ đi lướt qua những vấn đề đó. 



Trong chương trình trên có sử dụng một cấu trúc dữ liệu đơn giản là Emplyee. Cấu trúc này chỉ có những thuộc tính đó là lương hiện tại (salary) của nhân viên và bậc lương (level) của anh ta. Bạn có thể tưởng tượng rằng khi chương trình được phát triển lớn hơn, ta có thể thêm vào những thuộc tính khác như số năm làm việc, số điện thoại, địa chỉ, tên nhân viên, số bảo hiểm xã hội …



Trong đoạn chương trình này có hai hàm được định nghĩa. Một hàm làm công việc khởi tạo các thuộc tính trong cấu trúc Emplyee. Hàm thứ hai xác định mức tăng lương của một nhân viên cụ thể. Đây chỉ là chương trình minh hoạ nên nó rất đơn giản. Trong các chương trình thực tế có thể tạo ra những giao diện đồ hoạ để việc trao đổi thông tin với người dùng thân thiện hơn và hấp dẫn hơn.



Rõ ràng là một khi bạn muốn thêm vào những thuộc tính mới cho lớp Employee hoặc nếu bạn muốn thay đổi các thuộc tính đã có, ví dụ đổi mức lương từ số nguyên sang số thực, bạn phải thay đổi tất cả những hàm này.



Như vậy, một khi chương trình phát triển đến một độ phức tạp nào đó, việc quản lý các thủ tục của chương trình trở nên khó khăn hơn. Bạn cần quản lý một lượng lớn dữ liệu và cũng không có cơ chế kế thừa nên phần lớn các chương trình lập trình theo thủ tục phải làm mới gần như toàn bộ. Những gì mà bạn có thể thừa hưởng từ những chương trình trước đó chỉ là cắt và dán những đoạn mã nào đó.