Vandenberg

New Member

Download miễn phí 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++





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.Trang5
a. Hằng đối tượng.Trang 5
b. Tham chiếu hằng, con trỏhằng.Trang 5
c. cách hằng.Trang 7
B. KẾT LUẬN .Trang 10
Tài liẹu tham khảo.Trang 10



Để tải bản Đầy Đủ của tài liệu, xin Trả lời bài viết này, Mods sẽ gửi Link download cho bạn sớm nhất qua hòm tin nhắn.
Ai cần download tài liệu gì mà không tìm thấy ở đây, thì đăng yêu cầu down tại đây nhé:
Nhận download tài liệu miễn phí

Tóm tắt 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++
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. cách 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
}
hay
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ỏ hay 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. cách hằng.
Ở trên ta ñã nhắc ñến cách hằng, vậy cách 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 cách 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à cách 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 cách hằng.
Giả sử với lớp A có một cách print() như sau:
class A
{
int a;
public:
A(int t=0){a=t;}
//...
void print();
};
void A::print()
{
cout< }
Ta thấy cách 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 ở cách không hằng vì một cách 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...
 

Các chủ đề có liên quan khác

Top