If you just write increment() in counter::inspect(), you are essentially writing this->increment(). Here "this" is a pointer pointing to the object you are using.

For example, when you write a.inspect(), the "this" pointer is pointing to the object a. Because inspect() has a const qualifier, the "this" pointer is a pointer of const counter, which means you cannot change the state of the object a via "this", nor can you call another member function with a non-const qualifier.

For your second question, because you are directly calling increment() on sigma_inspect (without using the "this" pointer), the function's promise of not using "this" pointer to change the state of the object it is referring to still holds.

You are not able to call increment() that way because it has not been declared static. Static member functions have the ability to be called from outside the class without creating an instance of it.

For the cosnt inspect() function, it will not be able to change the value of a member variable(field) of its own instance. From your code, a's inspect call, tends to call a sigma_inspect's increment function, which is non-const, and so can change the value of I in sigma_inspect. What I'm saying is, a const member function cannot change a field with the this pointer(ie: under its own instantiation).

The member of a class can access the protected and public member of the class ,
this statement goes for only "data members" like int i in the above case,and not the functions that are listed in the class above.To access the functions you need a object or declare the function to be static .

Member variables(properties) can also be made static. Members of a class can access every part of the class, including private. Inheriting classes can access(inherit) only public and protected, friends too can access all members, and the public is for the outsiders.

this gives us a total of 12 possible "access" combinations
for example the above example for const methods will not work for external processes and will also not work for static data members, to solve this your class may look something like this: