Tìm hiểu cách sử dụng từ khóa "const" trong ngôn ngữ lập trình hướng đối tượng c++

Nhưta ñã biết, trong các ñời sống cũng nhưtrong mọi lĩnh vực, luôn có các

giá trịkhông thểthay ñổi gọi là hằng số,

Vd: số πvới 100 chữsô thập phân:

3,1415926535897932384626433832795028841971693993751058209749445

923078164 062862089986280348253421170679

Vấn ñềlà trong tin học, cứmỗi khi dùng ñến giá trị πthì chảlẽcứviết hết tất

cảcác chửsố???

pdf13 trang | Chia sẻ: oanh_nt | Lượt xem: 1396 | Lượt tải: 0download
Nội dung tài liệu Tìm hiểu cách sử dụng từ khóa "const" trong ngôn ngữ lập trình hướng đối tượng c++, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
TÌM HIỂU CÁCH SỬ DỤNG TỪ KHÓA "CONST" TRONG NGÔN NGỮ LẬP TRÌNH HƯỚNG ðỐI TƯỢNG C++ 1 MỤC LỤC A. Nội Dung........................................................................Trang 3 I. Mở ñầu.............................................................................Trang 3 II. Hằng ...............................................................................Trang 3 a. Khai báo hằng trong C++ ................................................Trang 3 III Từ khóa const trong C++................................................Trang 4 1. Từ khóa const với con trỏ ................................................Trang 4 2. Từ khóa const với ñối tượng............................................Trang 5 a. Hằng ñối tượng................................................................Trang 5 b. Tham chiếu hằng, con trỏ hằng........................................Trang 5 c. Phương thức hằng............................................................Trang 7 B. KẾT LUẬN ....................................................................Trang 10 Tài liẹu tham khảo...............................................................Trang 10 2 A. NỘI DUNG: I. Mở ñầu Như ta ñã biết, trong các ñời sống cũng như trong mọi lĩnh vực, luôn có các giá trị không thể thay ñổi gọi là hằng số, Vd: số π với 100 chữ sô thập phân: 3,1415926535897932384626433832795028841971693993751058209749445 923078164 062862089986280348253421170679 Vấn ñề là trong tin học, cứ mỗi khi dùng ñến giá trị π thì chả lẽ cứ viết hết tất cả các chử số??? II. Hằng Nếu dùng một biến ñể lưu trữ giá trị của hằng số thì có một vấn ñề là biến thì thay ñổi ñược giá trị lỗi. VD: float PI=3,14; ////// PI=8; ////// ðoạn mã trên không báo lỗi. Loại lỗi này rất khó nhận thấy nhưng ñể lại hậu quả rất to lớn. nếu sau ñó ta không chú ý cứ dùng biến ñó trên các ñoạn mã cần số π, vậy ta phải dùng hằng ñể khai báo cho giá trị này. a. Khai báo hằng trong C++: Có 2 cách khai báo hằng - Dùng chỉ thị #define: #define A "gia tri" tác dụng: ñịnh nghĩa macro A ñại diện cho giá trị dùng ñể thay thế A trong ñoạn mã trừ những ñoạn trong "" thành giá trị. chỉ thị #define còn có nhiều tác dụng khác. - Dùng từ khóa const: const kiểu tên_hằng=giá_trí; kiểu const tên_hằng=giá_trí; VD: 3 const int x=8; Tác dụng: Khai báo 1 hằng kiểu int tên x có giá trị bằng 8. Sau khi khai báo thì ta không thể thay ñổi x, ví dụ: x=8; //lỗi Câu lệnh trên báo lỗi vì ta cố gắng thay ñỏi 1 hằng số. III. Từ khóa const trong C++ Như ta ñã biết ở trên, từ khóa const dùng ñể khai báo hằng: const kiểu tên_hằng=giá_trí; kiểu const tên_hằng=giá_trí; VD: const int x=8; int const y=4; Vấn ñề ở ñây là hai cách khai báo này có khác nhau không? Và từ khóa const còn tác dụng nào không? Câu trả lời là có. 1. Từ khóa const với con trỏ ðối với biến con trỏ ta nên phân biệt hai ñiều: vùng nhớ con trỏ trỏ ñến và giá trị của vùng nhớ ñó. Vd: int x = 10, y = 20; const int *px = &x; Khai báo như vậy, giá trị của vùng nhớ mà px ñang trỏ ñến là không thể thay ñổi ñược thông qua thay ñổi (*px). Do ñó, ta có các câu lệnh sau: *px = 15;// lỗi px = &y; x = 15; Vì ta dùng *px ñể thay ñỏi giá trị của vùng nhớ mà px ñang trỏ ñến. Chú ý: Giá trị của x vẫn có thể ñược thay ñổi, ta chỉ không thể thay ñổi giá trị này thông qua px. Nhưng với các khai báo sau: int x = 10, y = 20; int* const px = &x; Thì px không thể thay ñổi vùng nhớ ñang trỏ ñến, nhưng giá trị của vùng nhớ có thể thay ñổi thông qua px *px=y; 4 *px=&y;//lỗi Với khai báo sau: int x = 10; const int* const px = &x; Bạn không thể thay ñổi nơi px ñang trỏ ñến và thông qua (*px) cũng không thể thay ñổi giá trị vùng nhớ ñó. 2. Từ khóa const với ñối tượng Giả sử ta có lớp với hàm tạo sau: class A { int a; public: A(int t=0){a=t;} //... }; a. Hằng ñối tượng ðể khai báo hằng ñối tượng ta dùng từ khóa const như sau: A const a(4); const A b; Ta không thể thay ñổi giá trị các thuộc tính của hằng ñối tượng, kể cả thông qua con trỏ trừ khi dùng cách ñặc biệt. VD: ta có hàm sau void A::set(int x) { a=x; } Thì ta không thể dùng hàm này ñể thay ñổi giá trị của hằng ñối tượng lớp A. b. Tham chiếu hằng, con trỏ hằng Giả sử có hàm có ñối tượng ñầu vào sau type C(A a) { //Các câu lệnh } Một ñối tượng object sẽ ñược tạo và máy sẽ copy toàn bộ giá trị của a vào object rồi xử lý. Vấn ñề phát sinh là khi ta có một class với kích thước lớn thì việc chép giá trị vào tham số hình thức ở hàm sẽ làm cho chương trình trở nên chậm ñi và ñặc biệt là sẽ hao phí bộ nhớ và sau khi ra khỏi hàm, bộ nhớ bị hủy khi ñó sẽ gọi hàm hủy, rất dễ dẫn ñến tình trạng giải phóng lại vùng nhớ ñã ñược giả phóng. 5 Vì vậy người ta thường dùng tham số chuyền vào là con trỏ hay tham chiếu: type C(A *a) { //Các câu lệnh } hoặc type C(A &a) { //Các câu lệnh } Hàm trên sử dụng tham số hình thức là một biến con trỏ và hàm dưới dùng một biến tham chiếu. Hai cách khai báo này sẽ cho kết quả tương tự nhau nếu ta không dùng con trỏ ñể trỏ vào ñối tượng khác trong khi dùng hàm. Khi này, với lời gọi hàm như trên thì ñịa chỉ của x sẽ ñược truyền vào, do ñó sẽ tránh ñược việc phải chép cả cấu trúc với kích thước lớn. Nhưng với khai báo như thế thì giá trị của biến truyền vào có thể bị thay ñổi thông qua biến object (vì là biến con trỏ hoặc tham chiếu), trong khi với cách khai báo như cũ thì ta không hề muốn giá trị này bị sửa ñổi chút nào. Do ñó, từ khóa const ñược sử dụng: type C(const A *a) { //Các câu lệnh } type C(const A &a) { //Các câu lệnh } Lưu ý: 1. dạng khai báo A const &a không còn ñược khuyến khích. 2. Hàm trả về con trỏ có thể có dạng const A* functionName(/*các ñối số*/); hay A const * functionName(/*các ñối số*/); hay const A const * functionName(/*các ñối số*/); Khi ñó nó ñược hiểu như trường hợp con trỏ ở trên. c. Phương thức hằng. Ở trên ta ñã nhắc ñến phương thức hằng, vậy phương thức hằng là gì? Tác dụng của nó? 6 Như ta ñã biêt, một hằng ñối tượng thì không thể thay ñổi các thuộc tính của nó và không ñược phép gọi các phương thức có thể làm thay ñổi các thuộc tính của nó, trừ trường hợp ñặc biệt: các thuộc tính mutable. các phương thức ñược các hằng ñối tượng sử dụng gọi là phương thức hằng, hay nói cách khác, các hằng ñối tượng chỉ làm việc trên các phương thức hằng. Giả sử với lớp A có một phương thức print() như sau: class A { int a; public: A(int t=0){a=t;} //... void print(); }; void A::print() { cout<<a; } Ta thấy phương thức này không hề làm thay ñổi các thuộc tính của a, Nhưng nó không thể làm việc ñược với hằng ñối tượng. Giả sử ta có 2 câu lệnh sau: const A a; a.print();//////lỗi Vì sao trình dịch báo lỗi? Ta thấy trong hàm print() không hề có lệnh thay ñổi thuộc tính??? Lí do là trình dịch không thể biết ñược là ta có thay ñổi thuộc tính hay không ở phương thức không hằng vì một phương thức không hằng có thể thay ñổi ñược thuộc tính. Vậy làm sao ñể có thể cho hàm trên thực hiện ñược với hằng ñối tượng? Ta phải khai báo hàm print() là một phương thức hằng bằng cách thêm từ khóa const vào sau khai báo của nó trong khai báo lớp như sau: void print() const; Khi ñó print() trở thành mọt phương thức hằng và lớp A Cần ñược khai báo như sau: class A { int a; 7 public: A(int t=0){a=t;} //... void print() const; }; Khi ñó 2 câu lệnh này sẽ chạy ñược: const A a; a.print();//////OK Nếu ta thay ñổi một thuộc tính của ñối tượng thuộc lớp A thông qua phương thức print() thì sẽ có lỗi. VD: void A::print() { cout<<a; a=7; //////lỗi } Vì ta cố gắng thay ñổi thuộc tính thông qua phương thức print() là một phương thức hằng. ðiều này khá hay trong môi trường làm việc cộng tác. Nếu nhiều người cùng xây dựng một lớp: thì cần xác ñịnh cái gì cần thay ñổi, thay ñổi bằng phương thức nào?… Ở trên có nhắc ñến thuộc tính mutable. Vậy thuộc tính này là gì? Ta ñã biết một phương thức hằng thì không ñược thay ñổi các thuộc tính của ñối tượng gọi nó. nhưng ñôi khi cần phải thay ñổi các thuộc tính này thông qua phương thức hằng, kể cả hằng ñối tượng, khi ñó chỉ cần khai báo trước thuộc tính ñó từ khóa mutable. Vậy nếu ta muốn có một phương thức hằng trả về một con trỏ không thể thay ñổi giả trị của vùng nhớ, cũng như vùng nhớ mà con trỏ ấy ñang trỏ tới, có tham số ñầu vào là một con trỏ cũng không thể thay ñổi giả trị của vùng nhớ, và vùng nhớ mà nó trỏ tới thì ta có một câu lệnh khai báo như sau: const A const * functionName(const A const *) const; //5 từ const!! UPDATE trong C++ giả sử có hàm: type1 ham(type&);//không thay ñổi ñối số trong thân hàm nha Khi ñó bạn gọi hàm như sau Code: ham(6);////////loi 8 Khi ñó có lỗi, vì sao? Vì 6 là 1 hằng. bạn cần khai báo tường minh hơn. Và khi ñó cần thay ñổi hàm này như sau type1 ham(const type&);///////// khi ñó lời gọi hàm trên có tác dụng 9 B. KẾT LUẬN: Từ khóa const trong lập trình nói chung và trong C++ nói riêng, ñúng như ý nghĩa của nó trong các lĩnh vực khác, là hằng, không ñổi. Tuy nhiên khi dùng từ khóa này ở các hoàn cảnh khác nhau thì ý nghĩa của chúng cũng khác nhau, cho phép thay ñổi một phần hay không cho thay ñổi hoàn toàn mà vẫn không thay ñổi ý nghĩa ñặc thù của từ khóa này. Trong quá trình làm tài liệu này, không thể tránh ñược các sai xót, mong mọi người góp ý, hoàn thiện thêm. 10 Tài liệu của trungkien45 ở cviet.com, khi bạn sử dụng, vui lòng ghi rõ tác giả. 11 Tài liệu tham khảo 1. Th.s Nguyễn Xuân ðài - Bài giảng lập hướng ñối tượng 2. GS Phạm Văn Ất - C++ Và Lập trình hướng ñối tượng - NXB KHKT - 1999 3. Thư viện MSDN của Microsoft 4. Website congdongcviet.com 5. Website wikipedia.org 6. Website congdongso.com, với url cụ thể: 12 Tài liệu của trungkien45 ở cviet.com, khi bạn sử dụng, vui lòng ghi rõ tác giả, cảm ơn. URL:

Các file đính kèm theo tài liệu này:

  • pdftu_khoa_const_trong_c.pdf
Tài liệu liên quan