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

http://s1.liketly.com/flash/edoc/jh2i1fkjb33wa7b577g9lou48iyvfkz6-swf-2014-02-25-tim_hieu_cach_su_dung_tu_khoa_const_trong_ngon_n.chcXh5e9PE.swf /tai-lieu/de-tai-ung-dung-tren-liketly-59139/

Để 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<<a;

}

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…

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ỤCA. Nội Dung.Trang 3I. Mở đầu.Trang 3II. Hằng .Trang 3a. Khai báo hằng trong C++ .Trang 3III Từkhóa const trong C++.Trang 41. Từkhóa const với con trỏ .Trang 42. Từkhóa const với đối tượng.Trang5a. Hằng đối tượng.Trang 5b. Tham chiếu hằng, con trỏhằng.Trang 5c. cách hằng.Trang 7B. KẾT LUẬN .Trang 10Tài liẹu tham khảo.Trang 10Ai 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 HIỂU CÁCH SỬ DỤNG TỪ KHÓA “CONST” TRONGNGÔN NGỮ LẬP TRÌNH HƯỚNG ðỐI TƯỢNG C++MỤC LỤCA. Nội Dung………………………………………………………………Trang 3I. Mở ñầu…………………………………………………………………..Trang 3II. Hằng …………………………………………………………………….Trang 3a. Khai báo hằng trong C++ …………………………………………Trang 3III Từ khóa const trong C++…………………………………………Trang 41. Từ khóa const với con trỏ …………………………………………Trang 42. Từ khóa const với ñối tượng……………………………………..Trang 5a. Hằng ñối tượng……………………………………………………….Trang 5b. Tham chiếu hằng, con trỏ hằng………………………………….Trang 5c. cách hằng……………………………………………………Trang 7B. KẾT LUẬN …………………………………………………………..Trang 10Tài liẹu tham khảo………………………………………………………Trang 10A. NỘI DUNG:I. Mở ñầuNhư ta ñã biết, trong các ñời sống cũng như trong mọi lĩnh vực, luôn có cácgiá trị không thể thay ñổi gọi là hằng số,Vd: số π với 100 chữ sô thập phân:3,1415926535897932384626433832795028841971693993751058209749445923078164 062862089986280348253421170679Vấn ñề là trong tin học, cứ mỗi khi dùng ñến giá trị π thì chả lẽ cứ viết hết tấtcả các chử số???II. HằngNế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 ñó takhông chú ý cứ dùng biến ñó trên các ñoạn mã cần số π, vậy ta phải dùnghằ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: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ỗiCâ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 constcò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ỏ ñếnvà 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ỗipx = &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;*px=&y;//lỗiVớ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ôngthể thay ñổi giá trị vùng nhớ ñó.2. Từ khóa const với ñối tượngGiả sử ta có lớp với hàm tạo sau:class Aint 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ôngqua con trỏ trừ khi dùng cách ñặc biệt.VD: ta có hàm sauvoid 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ằngGiả sử có hàm có ñối tượng ñầu vào sautype C(A a)//Các câu lệnhMột ñối tượng object sẽ ñược tạo và máy sẽ copy toàn bộ giá trị của avà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ớnthì 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ùngnhớ ñã ñược giả phóng.Vì vậy người ta thường dùng tham số chuyền vào là con trỏ hay thamchiếu:type C(A *a)//Các câu lệnhhaytype C(A &a)//Các câu lệnhHàm trên sử dụng tham số hình thức là một biến con trỏ và hàm dướidù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ùnghà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 khivớ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ệnhtype C(const A &a)//Các câu lệnhLư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ạngconst A* functionName(/*các ñối số*/);hayA const * functionName(/*các ñối số*/);hayconst 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ó?Như ta ñã biêt, một hằng ñối tượng thì không thể thay ñổi các thuộctính của nó và không ñược phép gọi các cách có thể làm thay ñổi cácthuộc tính của nó, trừ trường hợp ñặc biệt: các thuộc tính mutable. các phươngthức ñược các hằng ñối tượng sử dụng gọi là cách hằng, hay nói cáchkhá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 Aint a;public:A(int t=0){a=t;}//…void print();};void A::print()cout<