A Very Simple Inline Class in C++

Watch out! This tutorial is over 7 years old. Please keep this in mind as some code snippets provided may no longer work or need modification to work on current systems.
Tutorial Difficulty Level    

This is the first example of a C++ class definition we have shown you. This not-too-exciting program shows some differences between C++ and Java classes.

/*
 * This program makes use of a trivial C++ class in order to point out
 * some basic syntax and other issues.
 */

#include <iostream>
#include <string>

using namespace std;

/*
 * This class represents an integer value with a label for printing.
 */
class LabeledInt {
public:
        // Create an object.
        LabeledInt(string label, int value = 0) {
                m_label = label;
                m_value = value;
        }

        // Get the labeled value for easy printing
        string to_string() const {
                return m_label + ": " + std::to_string(m_value);
        }
        
        // Change the label.
        void relabel(string label) { m_label = label; }

        // Get or set the value.
        int get() const { return m_value; }
        void set(int value) { m_value = value; }
private:
        string m_label;
        int m_value;
};

void munge(LabeledInt ll)
{
        ll.relabel("Nothing");
        ll.set(0);
}

void set(LabeledInt & ll)
{
        ll.relabel("something");
        ll.set(99);
}

int main()
{
        // Make some.
        LabeledInt li1("Peanuts", 487);
        LabeledInt li2("Acorns", 9871);
        LabeledInt li3("Marbles");

        // Print them.
        cout << "A " << li1.to_string() << ", " << li2.to_string() << ", "
             << li3.to_string() << endl;

        // Some pretty random changes.
        li1.set(li1.get() + 13);
        li3.set(17);
        li2.set(li3.get() * li1.get());

        // Print them.
        cout << "B " << li1.to_string() << ", " << li2.to_string() << ", "
             << li3.to_string() << endl;

        // Compare to Java.
        LabeledInt cpy = li1;
        li1.set(3);
        li1.relabel("Pebbles");
        li2 = li3;
        li2.set(3*li2.get());

        // Print them.
        cout << "C " << li1.to_string() << ", " << li2.to_string() << ", "
             << li3.to_string() << ", " << cpy.to_string() << endl;

        // Note that each function uses a different parameter passing method.
        munge(li1);
        set(li2);

        // Print them.
        cout << "D " << li1.to_string() << ", " << li2.to_string() << ", "
             << li3.to_string() << endl;
}

To note:

  • The class is declared in the same program as main and couple other functions. In C++, classes aren’t required to be in a file by themselves, or a file with any particular name. It just needs to be defined before it is used, like anything else. Smaller classes are often placed in code with other things.
  • The class definitnion is followed by a the semicolon.
  • The public and private controls mean the same as in Java, but the syntax differs. The keywords are followed by a colon, and introduce sections. The classification applies until changed, and may be changed (or changed back) at any time.
  • The constructor uses a default parameter. These are allowed in any function or method, but are often particularly convenient in constructors.
  • The const after the parameter list declares that the method will not change any object variables. That is, a call to x.f() will not change x.
  • There are two top-level functions, munge and set, which are sent an object as a parameter. When sent without marks, objects are passed by value like other parameters. Objects are often passed by reference (with &).
  • Note that the variables declared as type Point actually contain the objects, not references. Likewise, assignment copies objects; it does not just copy a reference as in Java.