Keywords

The Bird's the Word


This is my notes on some of the reserved keywords in C++. Look at cppreference.com for a full list. Many keywords are used for more then one thing.

Loop constructs

for

Range-based for loops

Makes it easy to loop over a collection.

for(int i : ai) //

for(auto &x : ax) // Use a ref allows modifying and avoids copy.

do

while

break

continue

Conditional statements

if

Good If Statements – Self Documenting Code - 2015

else

switch, case, default(1)

Fundamental types

void

Used to create pointers to void (any type) and to indicate lack of return value and lack of arguments to functions.

nullptr (C++11)

Null pointer type designed to replace C's NULL or 0. It removes the ambiguity if it is a pointer or a number when passing it to function calls.

bool - false / true

Type that holds one of the two values: true or false. They are also keywords. The value of a sizeof(bool) is implementation defined and might be different from 1.

char / wchar_t and (since C++11) char16_t / char32_t

int

Create a integer type.

    • signed / unsigned : These keywords select if it can be positive/negative or positive values only.

    • short / long / long long: Size of the int and how big values it can contain. Implementation defined.

float / double

Creates a floating point type, usually of the IEEE-754 form.

auto (C++11)

Specify that the variable that is being declared should be automatically deduced from it's initializer. It can be used to create a iterator to loop the content of an STL container for example.

Generalized function return type deduction (c++14)

Use auto as the return type of the function to let the compiler deduce the return type based on the return call in the function.

String (c++11)

UTF-8 u8"Hello world"

UTF-16 u"Hello world"

UTF-32 U"Hello world"

Raw R"Hello \ world"

User-defined types

enum

Declares an enumaration, a distict type that consist of a set of named constants. This is a unscoped enumeration with the named constants in the same scope as the enum name. In C++11 it is also possible to specify the the underlying type of the enum.

enum class (C++11)

This is a scoped enum that improves some of the issues that was common with the enum.

    • They don't convert implicitly to int.

    • They don't pollute the surrounding namespace.

    • They can be forward-declared.

    • You can specify the underlying type for the enum.

struct

union

class

typedef

This keyword is used to create an alias name for another datatype. Often used to simplify the syntax for complex types.

typedef int AnimId;

typedef int (*AnimCallback)(int)

using

Like typedef this keyword is used to create a named alias for another datatype. Using also support templates.

using AnimId = int;

using AnimCallback = int (*)(int)

Data initialization

int i; // uninitialized built-in type

int j=42; // initialized built-in type

int k(666); // initialized built-in type

X x1; // default constructor

X x2(1000); // Parametrized constructor

X x3=x2; // copy-constructor

Initializer List (c++11)

Support to use brace Initialization syntax on any user-defined type. Do it by adding support of constructor/assignment operator from std::initializer_list.

Default member initializer:

In-class member initializers is when you assign the default value inside the class. It provide the compiler with the default value at the same time as it learns it exist. This should be the standard way to init member variables.

Member initializer list:

This set the values before a constructor run. The member variables is still initialized in the order they are declared in the class so write them in the same order here.

Member Assignment

access specifiers

private

protected

public

friend

Prefer nonmember, nonfriends? - 2017

Member function specifier

inline

Let the compiler know that we would like the function to be inlined in each place where it is called instead of leaving the function call in the compiled code. It is a hint to the compiler and it might ignore it. It might also do it with other functions that we have not marked as inline.

Inline namespaces (C++11)

Namespaces can be nested inside each other. A nested namespace marked as inline will be put inside the parent namespace.

explicit

C++ can use implicit conversion to resolve the parameters to a function. This is done using constructors callable with a single parameter to convert from one type to another. The explicit keyword lets you tell the compiler that it is not allowed to use it for implicit conversion.

virtual

Specify that a non-static member function is virtual. It will support dynamic binding and can be overridden in derived classes.

override (C++11)

Add override after any virtual function in a derived class. It ensures that the function is really overriding a virtual function from a base class.

Final (C++11)

Can be used on virtual function declarations or classes to specify that it can not be overridden or derived from.

= delete (C++11)

If a deleted function is used the program will not compile. That includes both explicit and implicit function calls. Useful to do to special member functions to limit copy of an object.

= default (C++11)

Tell the compiler to generate member function.



Essential Operations

This is member functions that the language expect to work in a certain way. They are often called automatically and some of them are created by default by the compiler if they are not provided.


Constructors - C::C()

Have the same name as the class and are called to initialize a object when it is created.


  • Default Constructor: A constructor with no argument is the known as the default constructor.

  • Conversion constructor: A constructor with a single argument, ex C::C(int), is used to convert from the given type to the object of a class. Use the keyword explicit to say the no conversion should be done and only allow the constructor to be used directly.

  • Delegating Constructors (C++11) - Constructors may call other constructors.


Copy constructor - C::C(const C&)

Move constructor - C::C(C&&) - (C++11)

Destructors - C::~C()

Called when the the lifetime of an object ends and have the same name as the class with a ~ at the start.


Copy assignment operator - C& C::operator==(const C&)

Move assignment operator - C& C::operator==(C&&) - (C++11)


Conventional Operations

Some member functions are commonly expected to work a certain way by sane programmers and the standard library.


Comparison

Container operations

Input << and >> operators

User defined literals

swap

hash<>


cast

dynamic_cast<>

reinterpret_cast<>

static_cast<>

Converts Y to X and return it. No checks are made that the cast is valid. If A is not related to B in any way using the pointer returned is undefined.

const_cast<>

To modify the constness of a object pointed to by a pointer const_cast is used. It can be used to set or remove const from the object. Useful when using api's that can not be modified so one needs to send in a non const pointer.

Run-time type information

RTTI is a way to allow the type of on object to be determined when the program is running.

typeid

Exceptions

try

catch

throw

noexcept (since C++11)

Tell the compiler that the function should not throw any exceptions. If an exception is thrown by the function the program will terminate at runtime.

type qualifiers

const

Const is used to inform the compilers that something should not be allowed to change. It can be a variable, arguments to a function or a member function. The main use of const is to prevent programming mistakes. Const is like the Borg so when you start adding it to you code you will need to add it everywhere where it's needed.

http://www.cprogramming.com/tutorial/const_correctness.html

volatile

Tells the compiler that every access (read or write operation, member call, etc) to the object must be performed and can not be optimized away even if it looks like the action is redundant. It can be used when accessing memory ports to hardware that do not act like normal memory.

mutable

Used on non-static and non-const data members of a class this tells the compiler that it is legal to assign a value to this data member from a const member function. This can be used on internal data that does not change the externally visible state of the class. One example is a class where advanced calculations are needed to get some form of data about the object. It can then be stored in a mutable variable so it can be updated any time even in a const accessor function.

Memory

delete

new

alignas (C++11)

Specifies the alignment requirement of a type or an object.

alignof (C++11)

Get the alignment requirements of a type, in bytes.

sizeof

Return the size in bytes of the object or type.

Storage

register (deprecated C++11)

Hint's the compiler to place the object in a processor register. Deprecated in C++11 as the compiler does as it wish anyway.

static

extern (c++11)

Declare a template specialization extern to tell the compiler not to instantiate the template functions in the module. Then explicitly instantiate the class template in one cpp module. Improves compile speed, obj file size and link time.

template class vector<Entity>; // In a single module

extern template class vector<Entity>; // In all other modules (from h file)

thread_local (C++11)

Namespace

namespace

using

Like typedef this keyword is used to create a named alias for another datatype. Using also support templates.

using AnimId = int;

using AnimCallback = int (*)(int)

template<typename T> using setEntity = std::set<T std::greater<T>>;

Others

asm

constexpr (C++11)

Declares a function or variable that can be evaluated at compile time. Limited to a single return expression in C++11 but in C++14 more things can be used as long as it does not have any side effects outside the function.

decltype (C++11)

Trailing return type

Use auto as a return type in a function then use -> decltype() after the function to tell the compiler to find out the return type. For templates.

export

goto

typename

this

Lambda expressions

static_assert (C++11)

Performs an assertion check at compile-time. If true nothing happens, if false the compiler displays the specified error messages. Useful with template code to verify that the template will work with the provided types. The content of the <type_traits> header is useful when doing that.

template

template

Bitwise operation

Same, same, but different: when different values compare equal - 2018

Attribute (C++11)

Attributes is the standard syntax for implementation-defined attributes for types, objects, etc. Only standard attributes listed below.

[[noreturn]]

Indicates that the function does not return.

[[carries_dependency]]

[[deprecated]] and [[deprecated("reason")] (C++14)

[[fallthrough]] (C++17)

[[nodiscard]](C++17)

[[maybe_unused]](C++17)

Other 2 ;)

User defined literals

Classes can deine literal operators to convert from special suffix literals into objects.

Generalized unions

POD

Pods, trivially copyable types, trivial types and standard-layout types

[[deprecated]] and [[deprecated("reason")] (C++14)

Compiler will issue warning if labeled entity is used. Used for: functions, classes, typedefs, enums, variablers and non static data members.

Variadic templates

A C variadic functions is one that takes an unknown number of argument, ex printf.

Non member begin/end

Can be used on arrays. In C++ add a c for const iterators (cbegin/cend), r for reverse iterators (rbegin/rend) or combine them (crbegin/crend).

Lambdas (C++11)

A lambda expression is an anonymous, on demand function object. capturelist can be used to put get local variables that are in scope available inside the lambda code. They are normally by value so they are not the same object but using a & before the name they can be captured by reference. [=] and [&] can be used to capture all variables in the selected mode. Only non-static local variables and parameters can be captured. Data members can not be captured but this can be captured to access and modify them. Using auto and a lambda one can store the function in a variable and call it. Uses of lambdas.

* On-the-fly callback functions.

* STL algorithms

* Custom delete for unique_ptr and shared_ptr

* Predicates for condition variables in threading API.

[capturelist](arguments) { code }

Rvalue reference

Lvalues - Things you can take the address of. They may or may not have a name.

Rvalues - Things you cant take the address of. Usually they have no name.

A rvalue reference is declared with && and binds only to temporary objects.

C++ have the copy operations (constructor/assignment) and C++11 adds the move operations, move constructor and move assignment operators.

In general, move operations should be added only when moving can be faster the copying.

std::move

std::forward

C++ Attributes - 2018

C++: Deleting destructors and virtual operator delete - 2015

(Not) using namespace std; - 2019

Understanding lvalues and rvalues in C and C++ - 2011

How I use references - 2020

References, simply - 2020

How to Make a Copyable Object Assignable in C++

https://www.fluentcpp.com/2020/11/06/how-to-make-a-copyable-object-assignable-in-cpp/