Question: I am very confused about the const version and non-const version member function like below:

```
value_type& top() { return this.item }
const value_type& top() const { return this.item }

```

What is the difference between these two functions? In what situation would they be used?

Answer: 
The const-qualified member function will be called if the member function is called on an object that is const-qualified.

The non-const-qualified member function will be called if the member function is called on an object that is not const-qualified.

For example:

```
MyStack s;
s.top(); // calls non-const member function

const MyStack t;
t.top(); // calls const member function

```

Note that the same rules apply when calling a member function on a reference to an object or through a pointer to an object: if the pointer or reference is to a const object, the const member function will be called; otherwise the non-const member function will be called.
`value_type& top() { return this.item; }` ensures that either the calling object's data members can be modified or the return value can be.

`value_type& top() const { return this.item; }` ensures that the calling object's data members can't be modified, but the return value can be. So, for example, if I perform `value_type item_of_x = x.top();`, `item_of_x` can be modified but `x` cannot. Otherwise, a compiler error occurs (such as having the code `this.item = someValue;` inside of the function body).

`const value_type& top() { return this.item; }` ensures that the calling object's data members are allowed to be modified, but the return value cannot be. It's the opposite of what is discussed above: if I perform `const value_type item_of_x = x.top();`, `item_of_x` can't be modified but `x` can. **NOTE** `value_type item_of_x = x.top();` still allows for modification of `item_of_x`, as `item_of_x` is now non-const.

`const value_type& top() const { return this.item; }` ensures that neither the calling object's data members can be modified nor the return value can be.