Effective C++ by Scott Meyers (Short Summary)
Effective C++ is one of the best book for improving C++ programs and designs by using C++ best practices. And this book is recommended to every one pursuing career as a C++ developer, So I am writing down this short summary for my own personal use to have a short and to the point summary of the book for future use.
A Declaration tells compiler about the name and type of something, but it omits certain details. For Example:
extern int size; // object declaration
std::size_t numDigits(int number); // function declaration
class Widget; // class declaration
template<typename T> class GraphNode; // template delaration
Each function's declaration reveals its signature i.e. its parameter and return types. A function's signature is the same as its types. In the case of numDigits
, the signature is size_t(int)
, i.e. "Function taking an int
and returning std::size_t
."
A definition provides compilers with details a declaration omits. For an object, the definition is where compilers set aside memory for the object. For a function or a function template, the definition provides the code body. For a class or a class template, the definition lists the members of the class or template:
int x // object definition
std::size_t numDigits(int number) // function definition
{
std::size_t digitsSoFar = 1;
while ((number /= 10) != 0)
++digitsSoFar;
return digitsSoFar
}
class Widget // class definition
{
public:
Widget();
~Widget();
.....
};
template<typename T> // template definition
class GraphNode
{
public:
GraphNode();
~GraphNode();
.....
};
Initialization is the process of giving an object its first value. For objects generated from structs and classes, initialization is performed by constructors.
A Default Constructor is one the can be called without any arguments. Such a constructor has no parameters or has a default value for every parameter:
class A
{
public:
A(); // default constructor
};
class B
{
public:
explicit B(int x=0, bool b=true); // default constructor
};
class C
{
public:
explicit C(int x); // not a default constructor
};
The constructor for class B
and class C
are declared explicit
here. That prevent them from being used to perform implicit type conversions, though they may still be used for explicit type conversions, explicit
is usually preferred because it prevent compilers from performing unexpected (often unintended) type conversions.
The copy constructor is used to initialize an object with a different object of the same type, and the copy assignment operator is used to copy the value from one object to another of the same type:
class Widget
{
public:
Widget(); // default constructor
Widget(const Widget& rhs); // copy constructor
Widget& operator=(const Widget& rhs); // copy assignment operator
.....
};
Widget w1; // invoke default constructor
Widget w2(w1); // invoke copy constructor
w1 = w2; // invoke copy assignment operator
Widget w3 = w2; // invoke copy constructor
Fortunately, copy constructor is easy to distinguish from copy assignment. If a new object is being defined, a constructor has to be called; it can't be assignment. If no new object is being defined, no constructor can be involved, so it's an assignment.
STL is the part of C++'s standard library devoted to containers (e.g., vector, list, set, map, etc), iterators (e.g., vector<int>::iterator
, set<string>::iterator
, etc.), algorithms (e.g. for_each
, find
,sort
etc.), and related functionality.