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 ạ.
Sự khác nhau giữa *const và const*
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
và
int a = 5, b = 10;
int* const p = &a;
*p = 10; //Được
p = &b; //Không được
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ủa a
và b
ko cần thay đổi nên a
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à:
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ỏ)
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.