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ố???
13 trang |
Chia sẻ: oanh_nt | Lượt xem: 1495 | Lượt tải: 0
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:
- tu_khoa_const_trong_c.pdf