MỤC LỤC
Hàm main trong C++ đợc định nghĩa kiểu để trả lại một giá trị nguyên cho hệ điều hành DOS, do đó phải khai báo là kiểu int, ngầm định-vì vậy sẽ là int. Khi chơng trình bắt đầu thực hiện, hàm main đợc gọi bởi một chơng trình khởi động đặc biệt (start up code) có sẵn trong C++.
Trong thân hàm, các giá trị này có thể bị thay đổi nhng ra khỏi hàm thì giá trị ban đầu của đối vẫn giữ nguyên. Sự thay đổi các giá trị trong hàm là chỉ thay đổi giá trị của bản sao của nó mà thôi.
Hai cách truyền theo con trỏ và truyền theo tham chiếu khác nhau ở chỗ: truyền theo tham chiếu tức là làm việc trực tiếp với địa chỉ của đối truyền vào hàm, còn truyền theo con trỏ thì can thiệp gián tiếp vào địa chỉ của. Ngợc lại biến tham chiếu gắn liền với địa chỉ tĩnh trong bộ nhớ và do đó không đợc phép thay đổi địa chỉ này.
Khi duyệt trên danh sách này luôn sử dụng thêm một biến con trỏ phụ để chạy trên các biến. Về mặt bản chất đó là các ô nhớ liên tục đợc cấp phát động, chứ không có liên kết gì cả.
Ta gọi là danh sách liên kết để tạo ra một cảm giác các biến động có liên kết với nhau. Trong khi khai báo các hàm thành phần của lớp, đặc biệt là constructor (constructor) ngời ta rất hay sử dụng các tham số ngầm định.
Qua ví dụ trên ta thấy toán tử new trả lại giá trị khác 0 của con trỏ thậm chí ta không đòi hỏi phải cấp phát bất cứ một bytes nào trong bộ nhớ. Ngoài hai khác biệt trên về bản chất cả new và malloc đều dùng để cấp phát bộ nhớ động cho các biến trong quá trình thực hiện chơng trình và con trỏ trả lại theo hai cách này khi thành công đều không có gì khác biệt.
+ Kiểu giá trị của hàm không cho phép phân biệt các hàm đợc tải bội nếu các hàm này có danh sách tham số nh nhau. Khi gọi các hàm tải bội, C++ sẽ đối sánh danh sách tham số và kiểu thích hợp với các tham số thực sự để cho thực hiện hàm thích hợp trong số các hàm tải bội.
Vì mỗi lần gọi inline (hoặc macro) thì các chỉ thị tơng ứng sẽ đợc sinh ra (không có cơ chế lu ngữ. cảnh để giải phóng bộ nhớ) do đo chí phí lu trữ tăng lên khi gọi hàm nhiều lần. Việc sử dụng inline trong C++ tốt hơn macro trong C ở chỗ hàm inline không cần phải viết các tham số trong dấu ngoặc nh đối với các hàm mà macro mô tả.
Mã sinh ra do bấm phím Enter của lần nhập trớc đó vẫn đợc xem xét cho lần nhập xâu ký tự tiếp theo, do đó sẽ có thể không nhập đợc ký tự mong muốn. Streams đợc sử dụng hoàn toàn độc lập với stdio nh- ng việc sử dụng đồng thời hai th viện này có thể làm phát sinh ra một số vấn đề, chẳng hạn sẽ không làm xuất ra dữ.
- Trong lập trình hớng đối tợng, khái niệm kế thừa kéo theo ý tởng sử dụng lại, nghĩa là từ một lớp đã xây dựng, ta có thể bổ sung một số tính chất riêng để tạo ra một lớp mới mà không làm thay đổi những cái đã có. Rõ ràng ta đang xét đến sự tơng ứng không phải là một mà là tơng ứng bội trong các liên kết tĩnh (trong thời gian dịch chơng trình) và liên kết động (trong thời gian chạy chơng trình).
Ví dụ nh các constructor của lớp là một tr- ờng hợp của hàm tải bội; chuyển đổi từ kiểu lớp sang kiểu cơ sở đợc coi là hàm tải bội. Nếu hiểu theo nghĩa "phép toán là tác động lên dữ liệu, làm thay đổi dữ liệu" thì toán tử tải bội và hàm tải bội đều là các phép toán tải bội.
Ngoài ra, việc tạo lập đối tợng với số lợng và thứ tự các tham số phải phù hợp với việc khai báo các constructor trong líp. Tuy nhiên khi có vấn đề cấp phát động cho các đối tợng trong chơng trình thì nên có destructor để huỷ bỏ đối tợng bằng cách giải phóng bộ nhớ.
- Trong trờng hợp này số ngôi của các toán tử, về mặt hình thức chỉ có 1 ngôi và điều đó thể hiện ở chỗ chỉ có 1 đối số truyền vào toán tử. - Kết quả trả lại là một số phức cho nên cần định nghĩa thêm constructor sao chép để có thể thực hiện phép gán dạng: p= m+n; (thử nghiệm cho thấy chơng trình trên không có constructor sao chép vẫn thực hiện đợc phép gán này, song đú là cỏch khụng rừ ràng).
Thực tế cho thấy, mặc dù không tờng minh nhng C++ cho khuyến khích dùng dạng tự nhiên này. (Chú ý tất cả các dạng không tờng minh, nói chung, đợc C++ ngầm tự chuyểnvề dạng tờng minh).
Chúng ta cần so sánh về cách sử dụng phép toán tải bội (nh một hàm thành phần của lớp) và phép toán tải bội thân thiện. Xây dựng lớp các phân số (FRAC) với các phép toán tải bội thân thiện cộng, trừ, nhân, chia phân số cùng với các phép toán vào/ra phân số.
Xây dựng lớp các đa thức bậc khác nhau (MULINO) (Mulinomial) hệ số nguyên, với các phép toán tải bội thân thiện: vào/ra và cộng, trừ, nhân 2 đa thức.
Để chuyển từ lớp X sang lớp Y, trong lớp Y phải có constructor khởi tạo đặc biệt nhận đối là đối tợng của lớp X. - Trong lớp Y đồng thời phải nhận hàm - toán tử này (của lớp X) là một hàm thân thiện - tức là hàm này của X là bạn của Y , nếu nó nhu cầu có sử dụng dữ liệu private của Y.
Bởi vì khi khai báo một biến kiểu const thì ngoài việc giá trị của nó không thay đổi trong quá trình thực hiện chơng trình, trình biên dịch còn có thể thực hiện việc kiểm tra kiểu của biến và tuy thế vẫn không cấp phát bộ nhớ cho các biến này khi không cần thiết. Theo cách này, i đợc xem nh tất cả các biến tham chiếu khác chỉ có một điều khác biệt là giá trị của nó không đợc phép thay đổi khi thực hiện chơng trình.
Vậy ta sẽ chỉ dùng từ khóa const cho tham số giá trị nếu ta còn muốn quy định trong thân hàm không đợc phép viết các lệnh làm thay đổi giá trị của các tham trị đó. - Trờng hợp đối truyền cho hàm có kiểu con trỏ hoặc kiểu tham chiếu thì ta sẽ dùng từ khoá const đặt trớc khai báo đối nếu ta muốn đảm bảo chắc chắn hoặc nhấn mạnh rằng không đợc thay đổi giá trị của đối truyền cho hàm trong thân hàm (và do đó không thay đổi giá trị khi ra khỏi hàm).
- Các toán tử sao chép đối tợng dạng operator = (const class_name&) cũng sử dụng đối tợng hằng truyền vào nó. Trong constructor - sao chép và toán tử sao chép, đối tợng khai báo hằng phải để ở dạng tham chiếu vì.
(2) Hàm thành phần const có thể định nghĩa chồng bằng một hàm thành phần khác không phải là hàm thành phÇn const. Tất nhiên nếu không khai báo hàm này thì chơng trình sẽ cho thực hiện hàm: int get_x(void) const { return x; }.
- Tóm lại từ khoá const đặt trớc khai báo hàm thành phần là để báo hiệu đợc phép chuyển kiểu của con trỏ this truyền cho hàm thành phần hoặc trả lại từ hàm thành phần. Trong trờng hợp này, ta phải khai báo kết hợp const ABC& ABC::lonhon(const ABC &m)const;.
Hàm thành phần const (khai báo const sau khai báo hàm) chỉ làm làm việc với các đối tợng hằng.
// Dùng constructor sao chép String(const String&) - Tuy nhiên, có thể viết các constructor khởi tạo và constructor sao chép không tờng minh. Nếu vế phải là một biểu thức giữa các đối tợng (giả sử đã. định nghĩa các phép toán trong biểu thức) thì phép gán trên là sai.
- Không thể chuyển hết những thành phần dữ liệu của lớp cơ sở sang vùng public vì nh vậy sẽ phá vỡ nguyên lý che dấu thông tin. Nh vậy kiểu dữ liệu protected là một phần dữ liệu private đợc truy nhập bởi các hàm thành phần trong cùng lớp và trong lớp dẫn xuất trực tiếp với lớp cơ sở.
+ Trong trờng hợp kế thừa bội thì constructor của các lớp cơ sở đợc thực hiện theo thứ tự của các lớp cơ sở đ- ợc khai báo mode kế thừa ở lớp dẫn xuất. + Trong trờng hợp kế thừa đa mức thì các constructor của lớp cơ sở đợc thực hiện theo thứ tự kế thừa ở các mức.
Rất hay sử dụng trong kế thừa để cài đặt khái niệm tơng ứng bội bằng cơ chế hàm. - Toán tử.* dợc sử dụng khi đối tợng đợc chỉ ra trực tiếp còn các thành phần của nó thì đợc xác định nhờ con trá.
* C++ sử dụng con trỏ this là con trỏ đặc biệt để biểu diễn cho đối tợng có liên quan đến hàm thành phần. * Trong toán tử tải bội (không thân thiện) thì nếu số ngôi của toán tử gốc là 2 thì số ngôi của toán tử tải bội sẽ là 1.
- Con trỏ có kiểu dữ liệu là lớp cơ sở thì đơng nhiên có thể trỏ đến đối tợng của lớp cơ sở (nếu ta gán con trỏ bằng địa chỉ của đối tợng thuộc lớp cơ sở) nhng hơn nữa nó còn có khả năng trỏ và đối tợng của lớp dẫn xuất (nếu tiếp theo ta gán con trỏ này bằng địa chỉ của một đối tợng thuéc líp dÉn xuÊt). - C++ đa ra nguyên lý liên kết động cho phép một con trỏ kiểu lớp cơ sở sau khi gán bằng địa chỉ của đối tợng thuộc lớp dẫn xuất nào thì tơng ứng nó sẽ thể liên kết với hàm của chính lớp dẫn xuất đó, mặc dù hàm này là dịch chuyển từ hàm của lớp cơ sở.