1) It's declaring the function as const. This "promises" that the function will not change the state of the object, and therefore allows you to call it on a const object.
Example:
1 2 3 4 5
const inter foo; // two const objects
conar inter bar;
if(foo < bar) // this would error if the < operator was not const
// because 'foo' is a const object
2) It's passing by const reference, instead of by value. Passing by value creates a copy of the object, whereas passing by const reference doesn't.
Basically:
advantage: avoids potentially expensive object copy
disadvantage: adds indirection when accessing data
The general rule is, basic types (int, char, etc) should be passed by value, and complex types (strings, vectors, user defined classes, etc) should be passed by const reference.
There are exceptions to that rule, of course, but it applies a large majority of the time.