Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why can a const member function modify a static data member?

In the following C++ program, modifying a static data member from a const function is working fine:

class A  {   public:        static int a; // static data member      void set() const     {         a = 10;     } }; 

But modifying a non-static data member from a const function does not work:

class A  {   public:        int a; // non-static data member      void set() const     {         a = 10;     } }; 

Why can a const member function modify a static data member?

like image 456
msc Avatar asked May 12 '17 11:05

msc


People also ask

Can a const member function modify a const data member?

The const qualifier on a member function means that you cannot modify non-mutable , non-static class data members.

Can static member functions be const?

A static member function cannot be declared with the keywords virtual , const , volatile , or const volatile . A static member function can access only the names of static members, enumerators, and nested types of the class in which it is declared.

Can const change member variable?

Change the value of member variable of a const function in C++ In this tutorial, we will learn to change the value of member variable of a const function in c++. For this, we will use the mutable keyword in C++.

Can static member variables be changed?

Static methods cannot access or change the values of instance variables or the this reference (since there is no calling object for them), and static methods cannot call non-static methods.


2 Answers

It's the rule, that's all. And for good reason.

The const qualifier on a member function means that you cannot modify non-mutable non-static class member variables.

By way of offering some rationalisation, the this pointer in a const qualified member function is a const type, and this is inherently related to an instance of a class. static members are not related to a class instance. You don't need an instance to modify a static member: you can do it, in your case, by writing A::a = 10;.

So, in your first case, think of a = 10; as shorthand for A::a = 10; and in the second case, think of it as shorthand for this->a = 10;, which is not compilable since the type of this is const A*.

like image 58
Bathsheba Avatar answered Oct 14 '22 03:10

Bathsheba


According to the C++ Standard (9.2.3.2 Static data members)

1 A static data member is not part of the subobjects of a class...

And (9.2.2.1 The this pointer)

1 In the body of a non-static (9.2.1) member function, the keyword this is a prvalue expression whose value is the address of the object for which the function is called. The type of this in a member function of a class X is X*. If the member function is declared const, the type of this is const X*,...

And at last (9.2.2 Non-static member functions)

3 ... if name lookup (3.4) resolves the name in the id-expression to a non-static non-type member of some class C, and if either the id-expression is potentially evaluated or C is X or a base class of X, the id-expression is transformed into a class member access expression (5.2.5) using (*this) (9.2.2.1) as the postfix-expression to the left of the . operator.

Thus in this class definition

class A  {   public:        static int a;       void set() const     {         a = 10;     } }; 

the static data member a is not a subobject of an object of the class type and the pointer this is not used to access the static data member. So any member function, non-static constant or non-constant, or a static member function can change the data member because it is not a constant.

In this class definition

class A  {   public:        int a;       void set() const     {         a = 10;     } }; 

the non-static data member a is an subobject of an object of the class type. To access it in a member function there is used either a member access syntax of this syntax is implied. You may not use a constant pointer this to modify the data member. And the pointer this is indeed has type const A * within the function set because the function is declared with the qualifier const. If the function had no the qualifier in this case the data member could be changed.

like image 25
Vlad from Moscow Avatar answered Oct 14 '22 04:10

Vlad from Moscow