Trong bài này, chúng ta sẽ thảo luận về việc các rvalue là bất biến (immutable) hay nó có thể được sửa đổi trong C++?
Nếu bạn không biết những điều cơ bản về lvalue và rvalue thì chúng tôi khuyên bạn nên xem qua bài viết trước của chúng tôi. Trong đó chúng ta đã thảo luận về các khái niệm cơ bản lvalue và rvalue, Sự khác biệt của lvalue và rvalue trong C++
Chúng ta không thể lấy địa chỉ của rvalue và nó không thể tồn tại ngoài một biểu thức đơn. Nhưng chúng ta có thể sửa đổi các rvalue không? Trả lời cho câu hỏi này có hai câu trả lời khác nhau dựa trên kiểu dữ liệu của rvalue.
rvalue của kiểu dữ liệu dựng sẵn là bất biến
Chúng ta không thể sửa đổi giá trị của kiểu dữ liệu dựng sẵn, tức là
(x+7) = 7; // Compile error - Can not Modify rvalue
int getData();
getData() = 9; // Compile Error - Can not modify rvalue
rvalue của kiểu dữ liệu do người dùng định nghĩa là không bất biến
rvalue của kiểu dữ liệu do người dùng định nghĩa có thể được sửa đổi. Nhưng nó có thể được sửa đổi trong cùng một biểu thức chỉ bằng các hàm thành viên của riêng nó. Hãy xem một ví dụ sau,
Lớp Person là một kiểu được định nghĩa bởi người lập trình.
class Person {
int mAge;
public:
Person() {
mAge = 10;
}
void incrementAge()
{
mAge = mAge + 1;
}
};
Nó có một hàm thành viên incrementAge() sửa đổi trạng thái của nó, tức là tăng giá trị mAge. Bây giờ, hãy tạo một hàm sẽ trả về đối tượng của Person dưới dạng một giá trị như sau,
Person getPerson()
{
return Person();
}
Bây giờ getPerson() là một rvalue và chúng ta không thể lấy địa chỉ của nó, tức là
Person * personPtr = &getPerson(); // COMPILE ERROR
Nhưng chúng ta có thể sửa đổi giá trị này vì nó thuộc kiểu dữ liệu do người dùng định nghĩa (thuộc lớp Person), tức là
getPerson().incrementAge();
Ở đây chúng ta đã sửa đổi một giá trị của kiểu lớp Person với hàm thành viên của nó trong cùng một biểu thức. Điều này chứng tỏ rằng chúng ta có thể sửa đổi giá trị của kiểu dữ liệu do người dùng định nghĩa bằng hàm thành viên của chính nó nhưng trong cùng một biểu thức vì rvalue chỉ tồn tại trong một biểu thức đơn.
Ví dụ đầy đủ như sau,
#include <iostream>
class Person {
int mAge;
public:
Person() {
mAge = 10;
}
void incrementAge()
{
mAge = mAge + 1;
}
};
Person getPerson()
{
return Person();
}
int main() {
// Person * personPtr = &getPerson();
getPerson().incrementAge();
return 0;
}
Trong phần tiếp theo, chúng ta sẽ thảo luận về tham chiếu rvalue là gì.
Để lại một bình luận