- Cấu trúc lặ p
1. tên mảng là một const pointer
2. char str[]=”I am first_pace, from congdongCViet”; // str là con trỏ hằng, nhưng
các str[i] không phải hằng
3. char* p1;
4. char* p2;
5. p1=str; // ok: vì p1 khơng phải con trỏ hằng nên được phép trỏ đi chỗ khác6. str=p2; // error: vì str là con trỏ hằng nên không thể trỏ đi chỗ khác được 6. str=p2; // error: vì str là con trỏ hằng nên không thể trỏ đi chỗ khác được
Con trỏ tới hằng (pointer to const): là con trỏ trỏ tới một đối tượng hằng, tức là với con
trỏ đó, đối tượng được "hiểu" là hằng. Con trỏ này có thể đọc (read) dữ liệu của đối tượng nhưng không được sửa đổi (write) nội dung của đối tượng. Mọi nỗ lực sửa đổi nội dung của đối tượng sẽ gây ra lỗi biên dịch.Con trỏ tới hằng khác con trỏ hằng ở hai điểm: thứ
nhất, khi khơng thích trỏ tới đối tượng này nó có thể trỏ tới đối tượng khác, con trỏ hằng không được phép làm điều này. Thứ hai, con trỏ tới đối tượng hằng (pointer to constant) thì nó hiểu đối tượng là hằng, và khơng được phép “ghi” dữ liệu lên đối tượng, còn con trỏ hằng nó vẫn cho phép thao tác trên dữ liệu, nó hồn tồn giống con trỏ bình thường ngồi việc nó chỉ trỏ tới một địa chỉ cố định.
Khi ta đặt từ khóa const trước một khai báo con trỏ thơng thường thì điều đó khiến
con trỏ “hiểu” đối tượng là hằng chứ không phải con trỏ là hằng. Nghĩa là nó chỉ có
thể “đọc” dữ liệu từ đối tượng nhưng không thể “ghi” dữ liệu lên đối tượng. Trong trường hợp này nó là con trỏ đến đối tượng hằng (pointer to const). Tuy nhiên đối tượng khơng
phải là trở thành hằng, mà nó chỉ được con trỏ đó “hiểu là hằng” (chỉ là là hằng đối
với con trỏ đó), đối với con trỏ khác nó có thể là biến. Để hiểu rõ hơn ta xem xét ví dụ sau: C++ Code:
1. char str[]="Hello, Ajinomoto"; // str là con trỏ hằng, nhưng str[i] thì khơng
2. const char* p=str; // con trỏ p (pointer to const) trỏ đến đầu mảng str, và p
66 Hướng dẫn lập trình hướng đối tượng với C++_ first_pace Hướng dẫn lập trình hướng đối tượng với C++_ first_pace
3. p[3]='X'; // Error: khơng được, vì p chỉ được đọc dữ liệu chứ không được ghi dữ
liệu lên str[i]
4. str[3]='X'; // Ok: vì str[i] chỉ được coi là hằng theo “cách hiểu” của p, với
str thì các str[i] vẫn là biến
Để khai báo một con trỏ hằng ta phải sử dụng *const chứ khơng phải const. Xem xét ví dụ sau:
C++ Code:
1. int x, y;
2. int *const px=&x; // bây giờ px luôn luôn trỏ đến x, không thể thay đổi được
3. px=&y; // Error: px là con trỏ hằng, khơng được phép trỏ đi chỗ khác
Có thể tóm lại như trong ví dụ sau: C++ Code:
1. const int* p1=&x; // con trỏ tới hằng int (pointer to const char)
2. int const* p2=&x; // hoàn toàn giống p1, con trỏ tới hằng int (pointer to const
char)
3. int *const p3=&x; // con trỏ hằng tới biến char (pointer to const char)
Để dễ nhớ các bạn có thể đọc từ trái sang phải như sau: “p3 là con trỏ hằng tới kiểu
int”.
Chú ý: một đối tượng hằng là cố định, vì vậy gán địa chỉ của nó cho một “con trỏ tự do” sẽ
gây lỗi biên dịch. Bởi vì thơng qua con trỏ ta có thể thay đổi giá trị của hằng, và điều này là không được phép. C++ chỉ cho phép gán địa chỉ của một đối tượng hằng cho một con
trỏ trỏ tới đối tượng hằng (pointer to const). Ví dụ chương trình sau:
C++ Code:
1. const int x=100; // khai báo hằng nguyên x=100
2. const int* p1=&x; // Ok: con trỏ p1 trỏ tới hằng x
3. int* p2=&x; // Error: con trỏ p2 là “con trỏ tự do”, không được phép trỏ tới
hằng x
Câu hỏi mở rộng nhé: việc gán địa chỉ của một đối tượng hằng cho con trỏ hằng (const
pointer) là có được phép hay khơng? Tại sao? Nhưng từ từ hãy post vội, đợi mình viết nốt loạt tut này đã