30/09/2018, 20:43
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 ạ.
Bài liên quan
Theo như mình được biết thì nó như thế này
và
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?
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
a
vàb
thì nội dung củaa
vàb
ko cần thay đổi nêna
vàb
đề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à: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ủaa
hoặcb
thì ví dụT
là classDate
, ta ko thể viết là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à
nếu bỏ
const
phía sau tức là tương đương vớifriend 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ỏ)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ưngp
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 đổireturn
gì đó như bạn nói.