Declaring item of some kind of game, it will be like this.
class Item { int _count; std::string _name; public: Item(std::string const& name, int count) :_name(name), _count(count) {} std::string const& Name() { return _name; } int Count() { return _count; } };
And let's implement a function for print Item.
// take reference to avoid copying object, and set const to avoid modifying that. void PrintItem(Item const& item) { std::cout << "name: " << item.Name() << " count:" << item.Count(); }This is good idea to set 'const' for read-only reference. It prevents to modify data unintendedly. But the code above gets compile-time error.
error: passing 'const Item' as 'this' argument of 'const string& Item::Name()' discards qualifiers [-fpermissive] error: passing 'const Item' as 'this' argument of 'int Item::Count()' discards qualifiers [-fpermissive]Compiler says calling Item::Name() and Item::Count() may modify the internal data of Item. We humans know the Item::Name() and Item::Count() never modify data, but compiler doesn't. So we need to tell the compiler that Item::Name() and Item::Count() does not modify data like this.
class Item { int _count; std::string _name; public: Item(std::string const& name, int count) :_name(name), _count(count) {} std::string const& Name() const { // 'const' after function name tells the function never modify internal data. return _name; } int Count() const { // The same to above. return _count; } };
Now we can compile and call the PrintItem() function.
What if a function declared as 'const' modifies internal data?
It gets compile-time error too.