I have worked with Python for about a while and have recently started learning C++. In C++ you create a constructor method for each class I I was wondering if it is correct to think that this is equivalent to the __init__(self)
function in Python? Are there any notable differences? Same question for a C++ destructor method vs. Python _exit__(self)
Yes, Python's __init__
is analogous to C++'s constructor. Both are typically where non-static data members are initialized. In both languages, these functions take the in-creation object as the first argument, explicit and by convention named self
in Python and implicit and by language named this
in C++. In both languages, these functions can return nothing. One notable difference between the languages is that in Python base-class __init__
must be called explicitly from an inherited class __init__
and in C++ it is implicit and automatic. C++ also has ways to declare data member initializers outside the body of the constructor, both by member initializer lists and non-static data member initializers. C++ will also generate a default constructor for you in some circumstances.
Python's __new__
is analogous to C++'s class-level operator new
. Both are static class functions which must return a value for the creation to proceed. In C++, that something is a pointer to memory and in Python it is an uninitialized value of the class type being created.
Python's __del__
has no direct analogue in C++. It is an object finalizer, which exist also in other garbage collected languages like Java. It is not called at a lexically predetermined time, but the runtime calls it when it is time to deallocate the object.
__exit__
plays a role similar to C++'s destructor, in that it can provide for deterministic cleanup and a lexically predetermined point. In C++, this tends to be done through the C++ destructor of an RAII type. In Python, the same object can have __enter__
and __exit__
called multiple times. In C++, that would be accomplished with the constructor and destructor of a separate RAII resource holding type. For example, in Python given an instance lock
of a mutual exclusion lock type, one can say with lock:
to introduce a critical section. In C++, we create an instance of a different type taking the lock as a parameter std::lock_guard g{lock}
to accomplish the same thing. The Python __enter__
and __exit__
calls map to the constructor and destructor of the C++ RAII type.