Thời gian chuyển thành string rồi so sánh c năm 2024

Trong chương này, chúng ta sẽ cùng nói về lập trình hướng đối tượng [object oriented programmation – OOP]. Như lúc trước tôi đã nói, đây là 1 phương thức lập trình khác so với lập trình truyền thống. Có thể ban đầu bạn thấy là mã nguồn mà bạn viết không thay đổi nhiều lắm và những kiến thức này có vẻ là vô dụng. Thế nhưng tôi tin rằng khi đã quen thuộc, bạn sẽ nhận ra chương trình được diễn đạt tự nhiên hơn và mã nguồn của bạn được sắp xếp hợp lý hơn.

Các bạn sẽ thấy, trong OOP có 2 dạng lập trình viên : những người tạo ra đối tượng [object] và những người sử dụng chúng. Chúng ta sẽ đề cập đến họ trong bài học này. Rồi tôi sẽ chỉ cho các bạn cách để sử dụng 1 đối tượng đã được tạo sẵn qua 1 số ví dụ về kiểu

vector vanBan;

7 của C++.

Đối tượng… là cái gì ?

Tổng quan về « đối tượng »

Tôi dám cá là nếu có 1 nhóm những từ gì mà khi nghe bạn cảm thấy vô cùng mơ hồ, vô cùng khó hiểu và khó giải thích thì chắc chắn là « đối tượng » sẽ nằm trong nhóm đó.

Thuật ngữ của khái niệm này trong tiếng Anh là « object », dịch ra tiếng Việt thì có nghĩa là « vật » hay « vật thể ». Vậy chúng ta có thể kết luận là « đối tượng » là 1 « vật thể » và thế là chúng ta đã bước thêm được 1 bước dài…. chừng 1 cm trên con đường để hiểu về khái niệm này. Nói vậy là bởi vì « vật thể » thì cũng là khái niệm mơ hồ đến không thể mơ hồ hơn được, nhưng chúng ta có thể hiểu rõ hơn qua các ví dụ : cái ôtô là 1 vật thể, cái máy vi tính là 1 vật thể và con mèo Tobi nhà tôi cũng là 1 vật thể, vv…

Thực ra, tồn tại xung quanh chúng ta đều là các « vật thể ». Cả những kiến thức của chúng ta cũng có thể coi là 1 dạng « vật thể ». Vậy nên, mọi thứ đều là « vật thể », và cũng chính là các « đối tượng ».

Ý tưởng của lập trình hướng đối tượng chính là trong mã nguồn chương trình, chúng ta sẽ thao tác với các yếu tố thành phần được gọi là « đối tượng ».

1 vài ví dụ về các đối tượng thường gặp trong lập trình :

  • Cửa sổ giao diện của chương trình
  • Các nút tương tác
  • Nhân vật trong trò chơi 3D siêu cấp
  • ….

Như các bạn thấy, rất nhiều thứ có thể được coi là đối tượng.

Hoàn toàn không giống như các biến hay các hàm, đối tượng là 1 khái niệm mới trong lập trình. Nếu muốn nói cụ thể hơn thì tôi có thể cho các bạn biết là đối tượng là tập hợp của nhiều biến và nhiều hàm khác nhau.

Tuy nhiên, đừng quá mất thời gian dừng lại ở tiết lộ vừa rồi của tôi, hãy tiếp tục và bạn sẽ hiểu rõ ràng hơn.

Hình dung về đối tượng

Để tránh việc các bạn bị lạc giữa đống sương mù các khái niệm mơ hồ, chúng ta sẽ cùng hình dung 1 đối tượng thông qua các hình ảnh cụ thể.

Cùng tưởng tượng 1 lâp trình viên luốn viết 1 chương trình thao tác với các cửa số giao diện. Anh ta muốn hiển thị nó ra màn hình, thay đổi kích thước, di chuyển và cũng muốn xóa đi khi không cần sử dụng nữa. Đoạn mã đó khá phức tạp với nhiều hàm gọi lẫn nhau và vô số biến để lưu những dữ liệu con như màu nền hay giá trị kích thước cửa sổ, vv…

Anh ta mất rất nhiều thời gian, thế nhưng rồi 1 ngày anh ấy cũng làm xong. Mã nguồn của chương trình gồm 1 đống hàm và biến khác nhau mà chúng ta chả hiều gì mấy, giống như mấy bài thực hành hồi học cấp 3 vậy.

Lập trình viên này rất hài lòng với thành quả của mình và muốn chia sẻ nó cho mọi người qua Internet để không ai còn phải mất thười gian đi viết mã mỗi khi muốn tạo ra các cửa sổ nữa.

Mục đích rất tốt đẹp nhưng còn tồn tại 1 vấn đề đó là bạn không biết làm sao để sử dụng được đoạn mã đó. Hàng loạt câu hỏi như « Phải truyền thông số gì cho hàm nào để có thể thay đổi kích thước cửa số ? » hay « Gọi hàm nào để xóa cửa sổ ? » được đặt ra trong quá trình sử dụng.

Thật may là anh bạn lập trình viên của chúng ta đã tính trước tất cả và thiết kế đoạn mã của anh ta theo hướng đối tượng, nghĩa là đặt tất cả những quy trình phức tạp và đau đầu đó vào trong 1 cái hộp kín mà ta gọi là « đối tượng ».

Trong hình ảnh này, tôi cố tình để cho chiếc hộp trong suốt để các bạn thấy đống quy trình được đặt trong đấy. Trên thực tế thì chiếc hộp này hoàn toàn kín và người dùng sẽ không nhìn thấy gì ở bên trong cả.

Tất cả những xử lý phức tạp vẫn còn đó nhưng bị che lấp trước mắt người dùng.

Người tạo ra chiếc hộp không bắt buộc chúng ta phải hiểu hết cơ chế hoạt động bên trong. Thay vào đó, anh ta cung cấp cho chúng ta 1 số cái nút và cần gạt ở bên ngoài chiếc hộp để có thể tương tác với nó : có chiếc nút để thay đổi kích thước cửa số, có chiếc nút để xóa cửa sổ, vv… Người dùng sử dụng những chiếc nút với cách thức hoạt động khá đơn giản thay vì đau đầu vì đống cơ chế khó hiểu bên trong.

Lập trình hướng đối tượng chính là công việc tạo ra chiếc hộp đó. Chúng ta tạo ra những đoạn mã nguồn phức tạp để thực hiện 1 số xử lý nhất định nhưng che giấu chúng trước người dùng bằng cách cho vào trong 1 cái « hộp » [đối tượng]. Về phần người dùng cần phải biết cách ấn nút và không cần quan tâm đến cái gì khác.

Bất cứ khi nào các bạn thấy mơ hồ, hãy nhớ lại hình ảnh của chiếc hộp này, hy vọng sẽ giúp bạn hiểu rõ thêm điều gì đó.

Trước tiên, chúng ta sẽ chưa học cách tạo ra các đối tượng mà bắt đầu với việc đơn giản hơn là cách sử dụng chúng.

Các ví dụ chúng ta sắp xem tới đây có liên quan tới kiểu dữ liệu mà các bạn tưởng như đã quen thuộc, kiểu

vector vanBan;

7.

Sự thật là không giống như những kiểu dữ liệu khác như

vector vanBan;

9,

include

include

using namespace std; int main[]{    string chuoiKyTu; //Tao ra doi tuong ‘chuoiKyTu’ kieu string    return 0; }

0 hay

include

include

using namespace std; int main[]{    string chuoiKyTu; //Tao ra doi tuong ‘chuoiKyTu’ kieu string    return 0; }

1, kiểu

vector vanBan;

7 bản thân nó chính là chiếc hộp bí mật. Đúng vậy,

vector vanBan;

7 chính là 1 đối tượng. Từ trước cho tới giờ thì những gì chúng ta làm mới chỉ là ấn nút trên chiếc hộp này. Hôm nay chúng ta sẽ vén lên bức màn vẫn luôn che giấu bí mật kinh hoàng của kiểu dữ liệu này.

Bí mật kinh hoàng của kiểu string

Nhờ sự thần kỳ của lập trình hướng đối tượng, các bạn có thể sử dụng kiểu

vector vanBan;

7 khi viết những chương trình đầu tiên dù không hiểu nó hoạt động như thế nào. Hãy chuẩn bị tâm lý vì sau đây, tôi sẽ giới thiệu cho bạn cơ chế phức tạp ẩn bên trong chiếc hộp này.

Với máy vi tính, các ký tự không hề tồn tại !

Kiểu string mang 1 cơ chế vận hành phức tạp vì nó làm việc với các chữ cái.

? Có thể có chuyện gì phức tạp khi thao tác với các chữ cái chứ ?

Sự thật thì sự phức tạp nằm chính trong các ký tự mà bạn cho là đơn giản đó. Bởi vì, máy vi tính không hề biết đến sự tồn tại của các ký tự. Đúng như tên gọi, nó là 1 chiếc máy để tính toán và không biết gì khác ngoài các con số.

? Nếu máy tính chỉ biết đến các con số, làm thế nào nó in được các thông điệp ra màn hình ?

Đó là nhờ một mánh khóe nhỏ được sử dụng từ rất rất lâu về trước : bảng ASCII. Bảng này có công dụng để chuyển đổi những con số thành các ký tự.

Số Ký tự Số Ký tự 64 @ 96 ' 65 A 97 a 66 B 98 b 67 C 99 c 68 D 100 d 69 E 101 e 70 F 102 f 71 G 103 g 72 H 104 h 73 I 105 i 74 J 106 j 75 K 107 k 76 L 108 l 77 M 109 m

Như các bạn đã thấy, chữ A tương đương với số 65 trong khi đó chữ a thì là số 97, vv… Tất cả các chữ cái tiếng Anh đều có ở trong bảng này. Nguyên nhân mà những chữ có dấu trong tiếng Việt đều không dùng được trong C++ cũng nằm ở đây, bởi vì chúng không nằm trong bảng.

? Điều này nghĩa là mỗi khi máy tính thấy số 65, nó sẽ nghĩ đó là chữ A ?

Không phải, máy tính chỉ dịch từ số sang chữ nếu được yêu cầu. Trên thực tế, máy tính dựa vào kiểu dữ liệu của biến để xác định xem dữ liệu được lưu là chữ hay là số :

  • Nếu dùng kiểu vector vanBan; 9 để lưu số 65, máy tính sẽ coi đây là 1 số.
  • Nếu dùng kiểu

include

include

using namespace std; int main[]{    string chuoiKyTu; //Tao ra doi tuong ‘chuoiKyTu’ kieu string    return 0; } 6 để lưu số 65, máy tính sẽ coi đây là chữ cái A do kiểu

include

include

using namespace std; int main[]{    string chuoiKyTu; //Tao ra doi tuong ‘chuoiKyTu’ kieu string    return 0; } 6 là kiểu dữ liệu dành cho các ký tự. Vậy nên nếu bạn dùng kiểu

include

include

using namespace std; int main[]{    string chuoiKyTu; //Tao ra doi tuong ‘chuoiKyTu’ kieu string    return 0; } 6 để lưu 1 số, nó sẽ tự động bị quy đổi.

? 1

include

include

using namespace std; int main[]{    string chuoiKyTu; //Tao ra doi tuong ‘chuoiKyTu’ kieu string    return 0; }

6 chỉ có thể lưu được 1 ký tự, vậy làm sao để lưu được 1 chuỗi ?

Việc này không hề đơn giản chút nào. Xin mời đọc tiếp…

Mảng ký tự

Bởi vì mỗi

include

include

using namespace std; int main[]{    string chuoiKyTu; //Tao ra doi tuong ‘chuoiKyTu’ kieu string    return 0; }

6 chỉ có thể lưu được 1 ký tự, các lập trình viên đã nảy ra ý tưởng là tạo ra 1 mảng ký tự để có thể lưu được 1 câu chứa nhiều ký tự. Nhờ cấu trúc mảng, trong bộ nhớ, các ký tự này sẽ nằm cạnh nhau và tạo thành 1 chuỗi. Đó là nguồn gốc tại sao chúng ta gọi là chuỗi ký tự.

Vậy nên, chỉ cần khai báo 1 mảng kiểu char với kích thước 100 là đủ để lưu 1 đoạn văn dài 100 ký tự

char vanBan[100];

hoặc sử dụng

int main[]{    string chuoiKyTu["Xin chao, Tan Binh !"];    //Tao ra doi tuong 'chuoiKyTu' kieu string va khoi tao gia tri    return 0; }

1 nếu các bạn muốn kích thước thay đổi

vector vanBan;

Các văn bản trong bộ nhớ thực chất chỉ là các ký tự liên tiếp nhau.

Về lý thuyết thì chúng ta hoàn toàn có thể sử dụng các thao tác với mảng ký tự mỗi khi chúng ta muốn thao tác văn bản. Tuy nhiên việc này quá tốn công sức nên những người thiết kế ra ngôn ngữ đã quyết định sẽ tạo ra 1 đối tượng và sử dụng đối tượng đó để che giấu những xử lý phức tạp đằng sau.

Tạo và sử dụng đối tượng string

Các bạn đã thấy rằng thao tác với các chuỗi ký tự hoàn toàn không đơn giản như trong tưởng tượng : cần tạo ra 1 mảng ký tự với kích thước đủ dài, vv… Vô vàn thứ phải tính đến.

Đây chính là lúc lập trình hướng đối tượng thể hiện ra mặt mạnh của nó. Lập trình viên giấu những phức tạp bên trong chiếc hộp đối tượng

vector vanBan;

7 và chỉ bày ra trước mắt chúng ta những chiếc nút bấm.

Tạo ra đối tượng string

Như các bạn đã biết, tạo ra 1 đối tượng không khác mấy với tạo ra các biến truyền thống như

vector vanBan;

9 hay

include

include

using namespace std; int main[]{    string chuoiKyTu; //Tao ra doi tuong ‘chuoiKyTu’ kieu string    return 0; }

1.

include

include

using namespace std; int main[]{    string chuoiKyTu; //Tao ra doi tuong ‘chuoiKyTu’ kieu string    return 0; }

Chắc là các bạn vẫn chưa quên là để có thể sử dụng các đối tượng

vector vanBan;

7, cần thêm gói thư viên string như tôi đã làm ở dòng thứ 2 trong đoạn mã.

Bây giờ, hãy chú ý đến dòng lệnh dùng để tạo ra đối tượng.

? Vậy cách để tạo ra 1 đối tượng giống với cách khai báo 1 biến ?

Thật ra có nhiều phương thức để tạo ra 1 đối tượng. Cách mà chúng ta vừa nhìn thấy ở trên chỉ là cách đơn giản nhất. Và đúng thế, nó y chang như cách để tạo ra 1 biến.

? Vậy làm thế nào để phân biệt 1 đối tượng với 1 biến bình thường ?

Rất tiếc là trong đoạn mã thì chúng hoàn toàn giống nhau, không thể nào phân biệt được. Thế nhưng nếu các bạn tuân thủ theo những quy tắc đặt tên mà chúng ta thống nhất với nhau thì cũng có thể dễ dàng tránh được nhầm lẫn. Quy tắc sau đây được tất cả các lập trình viên thống nhất sử dụng :

  • Kiểu của biến bắt đầu bằng chữ viết thường [ ví dụ : int]
  • Kiểu của đối tượng bắt đầu bằng chữ in hoa [ví dụ : DongVat]

? Thế tại sao kiểu string là 1 kiểu đối tượng nhưng lại không bắt đầu bằng chữ in hoa ?

Đơn giản là quy tắc nêu trên là không bắt buộc và những người tạo nên kiểu

vector vanBan;

7 thì không tuân theo quy tắc này. Tuy vậy, đa phần những lập trình viên hiện nay đều bắt đầu tên đối tượng của họ bằng 1 chữ cái in hoa.

Thêm vào đấy, các bạn sẽ nhanh chóng nhận ra rằng khi đã quen thuộc với các đối tượng thì nhu cầu phân biệt chúng sẽ không còn nữa vì sẽ có những cách khác để nhận ra 1 đối tượng giữa các biến, ví dụ như cách chúng ta sử dụng các đối tượng.

Khởi tạo chuỗi khi khai báo

Chúng ta có rất nhiều cách để khởi tạo đối tượng khi khai báo và gán cho chúng giá trị. Cách thông dụng nhất là sử dụng dấu

int main[]{    string chuoiKyTu["Xin chao, Tan Binh !"];    //Tao ra doi tuong 'chuoiKyTu' kieu string va khoi tao gia tri    return 0; }

7 như chúng ta vẫn làm từ trước đến giờ.

int main[]{    string chuoiKyTu["Xin chao, Tan Binh !"];    //Tao ra doi tuong 'chuoiKyTu' kieu string va khoi tao gia tri    return 0; }

! Chúng ta cũng có thể sử dụng dấu

int main[]{    string chuoiKyTu["Xin chao, Tan Binh !"];    //Tao ra doi tuong 'chuoiKyTu' kieu string va khoi tao gia tri    return 0; }

8 giống như khi thao tác với các biến :

int main[]{    string chuoiKyTu["Xin chao, Tan Binh !"];    //Tao ra doi tuong 'chuoiKyTu' kieu string va khoi tao gia tri    return 0; }

9

Chúng ta có thể hiển thị chuỗi ra màn hình như bình thường.

int main[]{    string chuoiKyTu["Xin chao, Tan Binh !"];    cout

Chủ Đề