Theo Tiêu chuẩn C ++ (9.2.3.2 Các thành viên dữ liệu tĩnh)
1 Thành viên dữ liệu tĩnh không phải là một phần của subobjects của một lớp ...
Và (9.2.2.1 Con trỏ this)
1 Trong phần thân của một hàm thành viên không tĩnh (9.2.1), từ khóa đây là một biểu thức prvalue có giá trị là địa chỉ của đối tượng mà hàm được gọi. Loại này trong một hàm thành viên của lớp X là X *. Nếu hàm thành viên được khai báo là const, thì kiểu này là const X * , ...
Và cuối cùng (9.2.2 Các hàm thành viên không tĩnh)
3 ... nếu tra cứu tên (3.4) giải quyết tên trong biểu thức id thành một thành viên không phải kiểu tĩnh của một số lớp C và nếu biểu thức id có khả năng được đánh giá hoặc C là X hoặc một lớp cơ sở của X, biểu thức id được chuyển thành biểu thức truy cập thành viên lớp (5.2.5) sử dụng (* this) (9.2.2.1) làm biểu thức hậu tố ở bên trái của. nhà điều hành.
Do đó trong định nghĩa lớp này
class A
{
public:
static int a;
void set() const
{
a = 10;
}
};
thành viên dữ liệu tĩnh a
không phải là đối tượng subobject của đối tượng thuộc kiểu lớp và con trỏ this
không được sử dụng để truy cập thành viên dữ liệu tĩnh. Vì vậy, bất kỳ hàm thành viên nào, hằng số không tĩnh hoặc không hằng số, hoặc một hàm thành viên tĩnh đều có thể thay đổi thành viên dữ liệu vì nó không phải là hằng số.
Trong định nghĩa lớp này
class A
{
public:
int a;
void set() const
{
a = 10;
}
};
thành viên dữ liệu không tĩnh a
là một subobject của một đối tượng thuộc loại lớp. Để truy cập nó trong một chức năng thành viên, người ta sử dụng cú pháp truy cập thành viên của cú pháp này. Bạn không thể sử dụng một con trỏ hằng this
để sửa đổi thành viên dữ liệu. Và con trỏ này thực sự có kiểu const A *
bên trong hàm set
vì hàm được khai báo với định nghĩa const
. Nếu hàm không có định nghĩa trong trường hợp này, thành viên dữ liệu có thể bị thay đổi.