C++ vs. Java: Mutability
Nguồn: http://mannu.livejournal.com/131085.html
Bài viết này là một thảo luận nhỏ được đề cập đến trong bài báo của Tahir rằng tại sao anh ta thích C++ hơn Java: “Why I Program in C++” (mà tôi sẽ đề cập khi có dịp).
Java thiếu rất nhiều đặc điểm của C++ và ngược lại. Nhưng có một đặc điểm của C++ mà tôi vẫn chưa quen được trong Java là khả năng có một const reference tới objects, làm cho những object là immutable khi sử dụng những references như vậy. Trong Java thì không phải tất cả instances (thể hiện) của một class nào là immutable (ví dụ java.lang.String) hoặc bất cứ một thể hiện nào là immutable. Mutability của một object được xác đính bởi design (thiết kế) của class đó và không có cách nào để nó chịu ảnh hưởng bởi cái reference đến trong hệ thống. Do đó tất cả đối tượng “String” trong Java là immutable, trong khi tất cả ArrayLists là mutable.
Để rõ hơn, sau đây là một lớp contact trong C++: (more…)
C++’s mutable and conceptual constness
Bài viết dưới đây được dịch từ http://www.highprogrammer.com/alan/rants/mutable.html – một tham luận sâu sắc giúp chúng ta hiểu chính xác về mutable.
Ở đầu bài viết tác giả đưa ra một “suy nghĩ” sai của một site nổi tiếng about.com
Trích từ about.com
“Từ khóa mutable được sử dụng để cho phép một data member nào đó của một const object có thể thay đổi được. Nó đặc biệt hữu ích nếu hầu hết member là constant nhưng một số ít có thể được thay đổi. Giả sử chúng ta thêm một “salary” member vào lớp Employee của chúng ta. Khi mà tên và ID có thể là const thì salary không nên là const. Và đây là lớp Employee: (more…)
[C++] Const and mutable members
Chúng ta sẽ bắt đầu bằng cách lược qua lại một vài khái niệm cơ bản của C++.
1. Const member function
class Date
{
int d, m, y;
public:
int day() const { return d; }
int month() const { return m; }
int year() const { return y; }
// …
};
Những member function của class này là const. Điều đó có nghĩa là những function đó không được thay đổi lớp đó. Ví dụ trong hàm year() bạn làm như sau sẽ gây ra lỗi biên dịch
inline int year() const
{
return y++; // error: attempt to change member value in const function
}
Một const member function có thể được thực hiện bởi cả non-const hay const object, trong khi một non-const member function chỉ có thể thực hiện bởi non-const object.
void f( Date &d, const Date& cd )
{
int i = d.year(); // ok
d.add_year(1); // ok
int j = cd.year(); // ok
cd.add_year(1); // error: can not change value of const cd
}
exit vs return
Từ trước đến nay tôi vẫn sử dụng hai hàm exit và return một cách khá “vô tư”, coi như đó đơn thuần là 2 lệnh cần thiết đặt ở dòng cuối cùng của hàm main trong chương trình C (đối với hàm exit) và chương trình C++ (đối với hàm return) mà không thực sự hiểu ý nghĩa của chúng. Cho đến một ngày, tôi gặp phải một tình huống khá rắc rối: Một chương trình C++ đơn giản, cú pháp hoàn toàn đúng nhưng luôn bị lỗi core dumped sau khi chạy qua lệnh return của hàm main. Sau một thời gian đánh vật với chương trình này mà không có hiệu quả, tôi chợt nảy ra ý định tại sao không sử dụng hàm exit thay cho return nhỉ? Kết quả thật bất ngờ: Sau khi thay hàm return bằng exit, lỗi core dumped đã biến mất!!! Vậy phải chăng exit tốt hơn return?