Giáo trình C++ căn bản

MỤC LỤC

Khai báo các hằng (const)

Một tính chất của toán tử này là nó có thể là tiền tố hoặc hậu tố, có nghĩa là có thể viết trước tờn biến (++a) hoặc sau (a++) và mặc dự trong hai biểu thức rất ủơn giản ủú nú cú cựng ý nghĩa nhưng trong cỏc thao tỏc khỏc khi mà kết quả của việc tăng hay giảm ủược sử dụng trong một biểu thức thỡ chỳng cú thể cú một khỏc biệt quan trọng về ý nghĩa: Trong trường hợp toỏn tử ủược sử dụng như là một tiền tố (++a) giỏ trị ủược tăng trước khi biểu thức ủược tớnh và giỏ trị ủó tăng ủược sử dụng trong biểu thức; trong trường hợp ngược lại (a++) giỏ trị trong biến a ủược tăng sau khi ủó tớnh toỏn. Một cỏch khỏc ủể làm ủiều này trong C++ là sử dụng cỏc constructors (ở một số sỏch thuật ngữ này ủược dịch là cấu tử nhưng tụi thấy nú cú vẻ khụng xuụi tai lắm) thay vỡ dựng cỏc toỏn tử : ủặt trước biểu thức cần chuyển ủổi kiểu tờn kiểu mới và bao bọc biểu thức giữa một cặp ngoặc ủơn.

Thứ tự ưu tiên của các toán tử

Toỏn tử này cú một tham số, ủú cú thể là một kiểu dữ liệu hay là một biến và trả về kớch cỡ bằng byte của kiểu hay ủối tượng ủú. Associativity ủịnh nghĩa trong trường hợp cú một vài toỏn tử cú cựng thứ tự ưu tiờn thỡ cỏi nào sẽ ủược tớnh trước, toỏn tử ở phớa xa nhất bờn phải hay là xa nhất bờn trỏi.

Xuất dữ liệu ( cout )

Tham số endl cú một tỏc dụng ủặc biệt khi nú ủược dựng với cỏc dũng dữ liệu sử dụng bộ ủệm: cỏc bộ ủệm sẽ ủược flushed ( chuyển toàn bộ thụng tin từ bộ ủệm ra dũng dữ liệu).

Nhập dữ liệu ( cin )

Bởi vậy khi bạn sử dụng dữ liệu nhập vào từ cin bạn phải tin chắc rằng người dùng sẽ hoàn toàn hợp tác và rằng anh ta sẽ không nhập tên của mình khi chương trình yêu cầu nhập số nguyên. Trong cả hai trường hợp người sử dụng phải cung cấp hai dữ liệu, một cho biến a và một cho biến b và ủược ngăn cỏch bởi một dấu trống hợp lệ: một dấu cỏch, dấu tab hay kớ tự xuống dòng.

Cấu trỳc ủiều kiện: if và else

Cấu trỳc if + else cú thể ủược múc nối ủể kiểm tra nhiều giỏ trị. Vớ dụ sau ủõy sẽ kiểm tra xem giá trị chứa trong biến x là dương, âm hay bằng không.

Các cấu trúc lặp

Chỳng ta cần phải nhớ rằng vũng lặp phải kết thỳc ở một ủiểm nào ủú, vỡ vậy bờn trong vũng lặp chỳng ta phải cung cấp một phương thức nào ủú ủể buộc condition trở thành sai nếu không thì nó sẽ lặp lại mãi mãi. Chức năng của nú là hoàn toàn giống vũng lặp while chỉ trừ cú một ủiều là ủiều kiện ủiều khiển vũng lặp ủược tớnh toỏn sau khi statement ủược thực hiện, vỡ vậy statement sẽ ủược thực hiện ớt nhất một lần ngay cả khi condition khụng bao giờ ủược thoả món.

Các lệnh rẽ nhánh và lệnh nhảy

2, condition ủược kiểm tra, nếu nú là ủỳng vũng lặp tiếp tục cũn nếu khụng vũng lặp kết thỳc và statement ủược bỏ qua. Bằng cách sử dụng dấu phẩy, chúng ta có thể dùng nhiều lệnh trong bất kì trường nào trong vòng for, như là trong phần khởi tạo.

Cấu trúc lựa chọn: switch

Theo quy ước, mã trả về 0 có nghĩa là chương trình kết thúc bình thường còn các giá trị khác 0 có nghĩa là có lỗi. Nếu bạn cần kiểm tra các khoảng hay nhiều giá trị không phải là hằng số hãy kết hợp các lệnh if và else if.

Hàm (I)

Bạn cần nhớ rằng phạm vi hoạt ủộng của cỏc biến khai bỏo trong một hàm hay bất kỡ một khối lệnh nào khỏc chỉ là hàm ủú hay khối lệnh ủú và khụng thể sử dụng bờn ngoài chúng. Ví dụ, trong chương trình ví dụ trên, bạn không thể sử dụng trực tiếp các biến a, b hay r trong hàm main vỡ chỳng là cỏc biến cục bộ của hàm addition.

Các hàm không kiểu. Cách sử dụng void

Chỳ ý rằng dấu chấm phẩy ủược ủặt ở cuối biểu thức chứ khụng cần thiết phải ủặt ngay sau lời gọi hàm. Hai dấu ngoặc ủơn là cần thiết ủể cho trỡnh dịch hiểu ủú là một lời gọi hàm chứ khụng phải là một tên biến hay bất kì dấu hiệu nào khác.

Truyền tham số theo tham số giá trị hay tham số biến

Khi truyền tham số dưới dạng tham số biến chỳng ta ủang truyền bản thõn biến ủú và bất kỡ sự thay ủổi nào mà chỳng ta thực hiện với tham số ủú bờn trong hàm sẽ ảnh hưởng trực tiếp ủến biến ủú. Trong vớ dụ trờn, chỳng ta ủó liờn kết a, b và c với cỏc tham số khi gọi hàm (x, y và z) và mọi sự thay ủổi với a bờn trong hàm sẽ ảnh hưởng ủến giỏ trị của x và hoàn toàn tương tự với b và y, c và z.

Giỏ trị mặc ủịnh của tham số

Kiểu khai báo tham số theo dạng tham số biến sử dụng dấu và (&) chỉ có trong C++. Truyền tham số dưới dạng tham số biến cho phép một hàm trả về nhiều hơn một giá trị.

Quá tải các hàm

Trong vớ dụ này chỳng ta ủịnh nghĩa hai hàm cú cựng tờn nhưng một hàm dựng hai tham số kiểu int và hàm còn lại dùng kiểu float. Trình biên dịch sẽ biết cần phải gọi hàm nào bằng cỏch phõn tớch kiểu tham số khi hàm ủược gọi.

Các hàm inline

Chú ý trong hàm factorial chúng ta có thể lệnh gọi chính nó nhưng chỉ khi tham số lớn hơn 1, nếu khụng thỡ hàm sẽ thực hiện một vũng lặp vụ hạn vỡ sau khi ủến 0 nú sẽ tiếp tục nhân cả những số âm. Hàm này có một hạn chế là kiểu dữ liệu mà nó dùng (long) không cho phép tính giai thừa quá 12!.

Khai báo mẫu cho hàm

Tụi chắc chắn rằng cỏc bạn cú thể nhận ủược kết quả như trờn chỉ với một nửa số dũng lệnh. Tuy nhiờn lý do ủặc biệt giải thớch tại sao chương trỡnh này lại cần ớt nhất một hàm phải ủược khi bỏo mẫu là trong odd cú một lời gọi ủến even và trong even cú một lời gọi ủến.

Khởi tạo một mảng

Số phần tử trong mảng mà chúng ta khởi tạo với cặp ngoặc nhọn { } phải bằng số phần tử của mảng ủó ủược khai bỏo với cặp ngoặc vuụng [ ]. Bởi vỡ ủiều này cú thể ủược coi là một sự lặp lại khụng cần thiết nờn C++ cho phộp ủể trống giữa cặp ngoặc vuụng, kớch thước của mảng ủược xỏc ủịnh bằng số giỏ trị giữa cặp ngoặc nhọn.

Truy xuất ủến cỏc phần tử của mảng

Trong C++, việc vượt quá giới hạn chỉ số của mảng là hoàn toàn hợp lệ, tuy nhiên nó có thể gõy ra những vấn ủề thực sự khú phỏt hiện bởi vỡ chỳng khụng tạo ra những lỗi trong quá trình dịch nhưng chúng có thể tạo ra những kết quả không mong muốn trong quá trỡnh thực hiện. Cần phải nhấn mạnh rằng chỳng ta sử dụng cặp ngoặc vuụng cho hai tỏc vụ: ủầu tiờn là ủặt kớch thước cho mảng khi khai bỏo chỳng và thứ hai, ủể chỉ ủịnh chỉ số cho một phần tử cụ thể của mảng khi xem xột ủến nú.

Dùng mảng làm tham số

Như bạn cú thể thấy, tham số ủầu tiờn (int arg[]) chấp nhận mọi mảng cú kiểu cơ bản là int, bất kể ủộ dài của nú là bao nhiờu, vỡ vậy cần thiết phải cú tham số thứ hai ủể bỏo cho hàm này biết ủộ dài của mảng mà chỳng ta truyền cho nú. Mảng, cả một chiều và nhiều chiều, khi truyền cho hàm như là một tham số thường là nguyờn nhõn gõy lỗi cho những lập trỡnh viờn thiếu kinh nghiệm.

Khởi tạo các xâu kí tự

Trong cả hai trường hợp mảng (hay xõu kớ tự) mystring ủược khai bỏo với kớch thước 6 kí tự: 5 kí tự biểu diễn Hello cộng với một kí tự null. Trước khi tiếp tục, tôi cần phải nhắc nhở bạn rằng việc gán nhiều hằng như việc sử dụng dấu ngoặc kép (") chỉ hợp lệ khi khởi tạo mảng, tức là lúc khai báo mảng.

Gán giá trị cho xâu kí tự

Nguyên nhân là một thao tác gán (=) không thể nhận vế trái là cả một mảng mà chỉ có thể nhận một trong những phần tử của nú. • Nú chỉ cú thể nhận những từ ủơn (khụng nhận ủược cả cõu) vỡ phương thức này sử dụng kí tự trống(bao gồm cả dấu cách, dấu tab và dấu xuống dòng) làm dấu hiệu kết thúc.

Chuyển ủổi xõu kớ tự sang cỏc kiểu khỏc

Chương trỡnh của bạn cú thể chạy khụng ổn ủịnh nếu dữ liệu vào lớn hơn kớch cỡ của mảng chứa nú. Vì những nguyên nhân trên, khi muốn nhập vào các xâu kí tự bạn nên sử dụng.

Toỏn tử lấy ủịa chỉ ( & )

Chỳng ta ủó gỏn cho fred nội dung của biến andy như chỳng ta ủó làm rất lần nhiều khỏc trong những phần trước nhưng với biến ted chỳng ta ủó gỏn ủịa chỉ mà hệ ủiều hành lưu giá trị của biến andy, chúng ta vừa giả sử nó là 1776. Trong C++ con trỏ cú rất nhiều ưu ủiểm và chỳng ủược sử dụng rất thường xuyờn, Tiếp theo chỳng ta sẽ thấy cỏc biến kiểu này ủược khai bỏo như thế nào.

Toán tử tham chiếu ( * )

Những biến lưu trữ ủịa chỉ của một biến khỏc (như ted ở trong vớ dụ trước) ủược gọi là con trỏ. Nú chỉ ra rằng cỏi cần ủược tớnh toỏn là nội dung ủược trỏ bởi biểu thức ủược coi như là một ủịa chỉ.

Khai báo biến kiểu con trỏ

Chỳ ý rằng giỏ trị của value1 và value2 ủược thay ủổi một cỏch giỏn tiếp. Nguyờn nhõn là kiểu dữ liệu khai báo cho cả dòng là int và vì theo thứ tự từ phải sang trái, dấu sao ủược tớnh trước tờn kiểu.

Con trỏ và mảng

Trong bài "mảng" chỳng ta ủó dựng dấu ngoặc vuụng ủể chỉ ra phần tử của mảng mà chỳng ta muốn trỏ ủến. Cặp ngoặc vuụng này ủược coi như là toỏn tử offset và ý nghĩa của chỳng khụng ủổi khi ủược dựng với biến con trỏ.

Khởi tạo con trỏ

Biến con trỏ terry trỏ tới một xõu kớ tự và nú cú thể ủược sử dụng như là ủối với một mảng (hóy nhớ rằng một mảng chỉ ủơn thuần là một con trỏ hằng).

Các phép tính số học với pointer

Nguyên nhân là khi cộng thêm 1 vào một con trỏ thì nú sẽ trỏ tới phần tử tiếp theo cú cựng kiểu mà nú ủó ủược ủịnh nghĩa, vỡ vậy kớch thước tớnh bằng byte của kiểu dữ liệu nú trỏ tới sẽ ủược cộng thờm vào biến con trỏ. Lệnh ủầu tiờn tương ủương với *(p++) ủiều mà nú thực hiện là tăng p (ủịa chỉ ụ nhớ mà nó trỏ tới chứ không phải là giá trị trỏ tới).

Con trỏ trỏ tới con trỏ

Như ủó núi trong cỏc bài trước, tụi khuyờn cỏc bạn nờn dựng cỏc cặp ngoặc ủơn ủể trỏnh những kết quả không mong muốn.

Bộ nhớ ủộng

Bộ nhớ ủộng núi chung ủược quản lớ bởi hệ ủiều hành và trong cỏc mụi trường ủa nhiệm cú thể chạy một lỳc vài chương trỡnh cú một khả năng cú thể xảy ra là hết bộ nhớ ủể cấp phỏt. Vỡ bộ nhớ ủộng chỉ cần thiết trong một khoảng thời gian nhất ủịnh, khi nú khụng cần dựng ủến nữa thỡ nú sẽ ủược giải phúng ủể cú thể cấp phỏt cho cỏc nhu cầu khỏc trong tương lai.

Bộ nhớ ủộng trong ANSI-C

Nú cú thể phải thay ủổi vị vị trớ của khối nhớ ủể cú thể ủủ chỗ cho kớch thước mới của khối nhớ, trong trường hợp này nội dung hiện thời của khối nhớ ủược copy tới vị trớ mới ủể ủảm bảo dữ liệu khụng bị mất. Nếu khụng thể thay ủổi kớch thước của khối nhớ thỡ hàm sẽ trả về một con trỏ null nhưng tham số pointer và nội dung của nú sẽ khụng bị thay ủổi.

Các cấu trúc dữ liệu

Sau khi ủó khai bỏo ba ủối tượng cú kiểu là một mẫu cấu trỳc xỏc ủịnh (apple, orange and melon) chúng ta có thể thao tác với các trường tạo nên chúng. Chỳ ý rằng cả mine and yours ủều ủược coi là cỏc biến hợp lệ kiểu movie_t khi ủược truyền cho hàm printmovie().Hơn nữa một lợi thế quan trọng của cấu trúc là chúng ta có thể xét các phần tử của chúng một cách riêng biệt hoặc toàn bộ cấu trúc như là một khối.

Con trỏ trỏ ủến cấu trỳc

Nú cho phộp chỳng ta khụng phải dựng ngoặc mỗi khi tham chiếu ủến một phần tử của cấu trỳc.

Các cấu trúc lồng nhau

Cỏc khỏi niệm cơ bản về cấu trỳc ủược ủề cập ủến trong phần này là hoàn toàn giống với ngụn ngữ C, tuy nhiờn trong C++, cấu trỳc ủó ủược mở rộng thờm cỏc chức năng của một lớp với tớnh chất ủặc trưng là tất cả cỏc phần tử của nú ủều là cụng cộng (public).

Union

Nhưng vỡ tất cả chỳng ủều nằm cựng một chỗ trong bộ nhớ nờn bất kỡ sự thay ủổi nào ủối với một phần tử sẽ ảnh hưởng tới tất cả cỏc thành phần còn lại. Tôi dùng nhiều kiểu dữ liệu khác nhau, mảng và cấu trúc trong union ủể bạn cú thể thấy cỏc cỏch khỏc nhau mà chỳng ta cú thể truy xuất dữ liệu.

Các unions vô danh

Sự khỏc biệt duy nhất giữa hai ủoạn mó này là trong ủoạn mó ủầu tiờn chỳng ta ủặt tờn cho union (price) còn trong cái thứ hai thì không. Một lần nữa tụi nhắc lại rằng vỡ nú là một union, hai trường dollars và yens ủều chiếm cùng một chỗ trong bộ nhớ nên chúng không thể giữ hai giá trị khác nhau.