[C++] Class: Basic Syntax

As a core User-Defined Type (UDT) in C++, the class is fundamental for object-oriented programming. It encapsulates data and behavior, separating the public interface from the private implementation1, while managing resource lifetime through constructors and destructors (RAII).

This article provides a practical guide to the essential syntax, covering class declaration, access control (class vs. struct), member initialization, const-correctness, and the role of constructors and destructors in object lifecycle management.

Class

This article aims to equip readers with the ability to use C++ classes effectively, focusing on the minimal syntax required without compromising safety or established idioms.

The guiding principle is to distinguish between the interface to a type (to be used by all) and its implementation (which has access to the otherwise inaccessible data)1. Hiding internal implementation details is a cornerstone of robust object-oriented design.

Core Concepts of a Class

Definition: A class is a user-defined type provided to represent an entity in the code of a program.3 Core Philosophy: Whenever our design for a program has a useful idea, entity, etc., we try to represent it as a class in the program so that the idea is there in the code, rather than just in our heads, in a design document, or in some comments.4 Concrete Type: The defining characteristic of a concrete type is that its representation is part of its definition.5

class vs. struct (Basics)

class and struct There is no fundamental difference between a struct and a class; a struct is simply a class with members public by default.6

The Simplest Class: Declaration and Members

A class bundles data and behavior. The interface of a class is defined by its public members, and its private members are accessible only through that interface.7

Here is a simple class declaration:

cpp
class SimpleClass {
public:
    void set(int v) { value_ = v; } // Public member function (setter)
    int get() { return value_; }      // Public member function (getter)
 
private:
    int value_; // Private data member
};

Ensuring Initialization with Constructors

A member function with the same name as its class is called a constructor. Unlike an ordinary function, a constructor is guaranteed to be used to initialize objects of its class. Thus, defining a constructor eliminates the problem of uninitialized variables for a class.9

We can improve SimpleClass by adding a constructor to ensure that objects are always initialized with valid values.

cpp
class SimpleClass {
public:
    // Constructor
    SimpleClass(int v) {
        value_ = v; // Initialization via assignment
    }
 
    int get() const { return value_; }
 
private:
    int value_;
};

Class Instantiation

A class with a defined constructor can be instantiated (i.e., an object can be created) in the following ways: