Sự khác nhau giữa *const và const*

Chào mọi người, em mới học c++ có một thắc mắc nho nhỏ ạ.
Giả sử có 1 class A và một con trỏ p. Vậy việc khai báo const Ap và Aconst p sẽ khác nhau như thế nào? Khi nào thì cần áp dụng những hình thức khai báo này? Em cảm ơn ạ.

Theo như mình được biết thì nó như thế này

int a = 5, b = 10;
const int *p = &a;
*p = 10; //Không được
p = &b; //Được

int a = 5, b = 10;
int* const p = &a;
*p = 10; //Được
p = &b; //Không được
1 Like

Dạ em cảm ơn. Nhân tiện thì việc đặt const sau một hàm là để không thay đổi được giá trị return của hàm đó, nhưng em vẫn không thấy rõ ý nghĩa của việc này lắm, vì vốn dĩ làm sao mà thay đổi giá trị return được @@ Ai có thể giải thích giúp em được không?

1 Like

hàm ở đây ý bạn chắc là method, dịch là phương thức. “Hàm” của 1 class thì được gọi là “phương thức”. Gọi hàm thì ko cần đối tượng nào gọi cũng được, còn gọi phương thức thì phải có 1 đối tượng của class tương ứng để gọi phương thức của class đó.

const đặt phía sau 1 phương thức là để bảo đảm phương thức đó ko thay đổi đối tượng gọi phương thức đó.

ví dụ so sánh bé hơn giữa ab thì nội dung của ab ko cần thay đổi nên ab đều phải được xem như hằng khi so sánh. Hàm so sánh bé hơn có thể viết là:

friend bool operator<(const T& a, const T& b);

lưu ý ở đây friend bool operator< là hàm, ko phải phương thức của class T.
nếu bỏ const của a hoặc b thì ví dụ T là class Date, ta ko thể viết là

Date today(2016, 5, 2);
bool comp1 = today < Date(2016, 5, 3); //ko compile được nếu viết là operator<(const T& a, T& b);
bool comp2 = Date(2016, 5, 3) < today; //ko compile được nếu viết là operator<(T& a, const T& b);
bool comp3 = Date(2016, 5, 3) < Date(2016, 5, 4); //ko compile được nếu a hoặc b ko được đối xử như hằng

vì đối tượng tạm thời Date(2016, 5, 3) Date(2016, 5, 4) được hiểu là hằng.

tương tự, nếu ko xài hàm mà xài phương thức của class thì cách viết khác của phương thức so sánh bé hơn là

bool operator<(const T& b)const; //a ở đây chính là *this

nếu bỏ const phía sau tức là tương đương với friend bool operator<(T& a, const T& b);

1 phương thức luôn có sẵn con trỏ this có thể hiểu là T* this. Nếu có const ở phía sau tên phương thức thì hiểu là const T* this.

(1 điểm trừ của C++ class là ko truyền this theo reference mà lại đi truyền con trỏ)

3 Likes

Mình thấy có bạn viết rồi đấy, bạn có thể tham khảo ở đây.

Tuy nhiên việc nói "const int* p; thì p sẽ chỉ đến vùng dữ liệu hằng" như trong bài trên là chưa chính xác. Nhiều sách nổi tiếng về C++ cũng nói như vậy nhưng thực sự nó không hợp lý và gây nhầm lẫn. p trong trường hợp này chỉ có đặc điểm là không dereference được thôi, tức là phép *p = 255 sẽ không được phép. Nhưng p vẫn chỉ đến vùng không phải là hằng bình thường, không sao, vd:

int a =255; //không nhất thiết phải là const int a = 255; const int*p = &a;

Về việc const ở cuối hàm đơn giản là hàm đó không được phép thay đổi các thành phần của class, không phải là thay đổi return gì đó như bạn nói.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?