在下面的C++
程序中,从函数修改静态数据成员const
可以正常工作:
class A
{
public:
static int a; // static data member
void set() const
{
a = 10;
}
};
但是,从const
函数修改非静态数据成员不起作用:
class A
{
public:
int a; // non-static data member
void set() const
{
a = 10;
}
};
为什么const
static
成员函数可以修改数据成员?
发布于 2017-05-12 19:14:35
这是规则,仅此而已。这是有充分理由的。
成员函数上的const
限定符意味着您不能修改非mutable
非static
类成员变量。
通过提供一些合理的方法,const
限定成员函数中的this
指针是const
类型,并且this
本质上与类的实例相关。static
成员与类实例无关。修改static
成员不需要实例:在本例中,可以通过编写A::a = 10;
来完成。
因此,在第一种情况下,将a = 10;
视为A::a = 10;
的简写,在第二种情况中,将其视为this->a = 10;
的简写,由于this
的类型为const A*
,因此它是不可编译的。
发布于 2017-05-12 19:51:56
根据C++标准(9.2.3.2静态数据成员)
1静态数据成员is 不是类的子对象的一部分...
和(9.2.2.1 this指针)
1在非静态(9.2.1)成员函数体中,关键字this是一个prvalue表达式,其值是为其调用函数的对象的地址。类X的成员函数中的this类型是X*。如果成员函数声明为const,则其类型为const X*,...
最后(9.2.2非静态成员函数)
3...如果名称查找(3.4)将id表达式中的名称解析为某个类C的非静态非类型成员,并且如果id表达式可能被求值,或者C是X或X的基类,则使用(*this) (9.2.2.1)作为左侧的后缀表达式将id表达式转换为类成员访问表达式(5.2.5)。操作符。
因此,在这个类定义中
class A
{
public:
static int a;
void set() const
{
a = 10;
}
};
静态数据成员a
不是类类型的对象的子对象,并且指针this
不用于访问静态数据成员。因此,任何成员函数,非静态常量或非常量,或静态成员函数都可以更改数据成员,因为它不是常量。
在这个类定义中
class A
{
public:
int a;
void set() const
{
a = 10;
}
};
非静态数据成员a
是类类型的对象的子对象。要在成员函数中访问它,可以使用隐含此语法的成员访问语法。不能使用常量指针this
修改数据成员。在函数set
中,指针this的类型为const A *
,因为该函数是用限定符const
声明的。如果函数没有限定符,则可以更改数据成员。
发布于 2017-05-12 19:32:49
问题是,如果类A
的成员函数是const
,那么this
的类型就是const X*
,从而防止非静态数据成员被更改(例如,C++ standard):
9.3.2此指针class.this
在非静态(9.3)成员函数体中,关键字this是一个prvalue表达式,它的值是为其调用函数的对象的地址。类X的成员函数中的this类型是X*。如果成员函数声明为const,则其类型为const X*,...
如果a
是非静态数据成员,则a=10
与this->a = 10
相同,如果this
的类型为const A*
并且a
尚未声明为mutable
,则不允许这样做。因此,由于void set() const
将this
的类型设置为const A*
,因此不允许这种访问。
相反,如果a
是一个静态数据成员,那么a=10
根本不涉及this
;只要static int a
本身没有被声明为const
,就允许使用语句a=10
。
https://stackoverflow.com/questions/43936404
复制相似问题