This post was initially meant to go straight on with the Unreal coding standards and the way they express C++ in the engine code.
I’ve made a little detour, as this series was meant to include both those new to C++ and those new to Unreal.
I don’t feel that the Unreal coding standard is much used outside of the Unreal Engine, so in the first posts that actually involves how to write C++ I’ve chosen to use my own coding standard.
All the content from the posts that contain C++ introductory material will also be posted to the C++ page on this blog, and it is also meant to be read by those that wish to learn C++ and not necessarily the Unreal Engine as well.
This might seem a bit clunky, and indeed it is, but this is the way I’ve decided to do it.
So this post and the next few posts will mainly contain C++ until I’ve presented what I believe is a minimum of required knowledge to get started with game development using any engine with a C++ API.
So, let’s get started.
C++ is a general purpose programming language with a bias towards systems programming that supports data abstraction, object oriented programming and generic programming.
C++ is a compiled, statically typed language, which means that the compiler must know the type of every object used in a program.
C++ is used in various fields of computer science including computer games.
It received a massive overhaul with the C++11 standard that introduced many new features, such as auto type deduction, lambdas and closures.
The development continues with the C++14 standard and compiler vendors have a great deal of work to do to make their compilers support all the latest features.
What makes C++ a good choice for mobile platforms and systems programming and games is that C++ produces very effective executable code that has low power consumption on mobile platforms combined with great performance in general.
This introduction will make use of some of the new features introduced in C++11, as these features makes C++ easier to understand and more safe to use in many ways.
Most popular compilers that I know of support most of the C++11 standard at the time of this writing, at least what we’ll present in this series of posts.
Why learn C++?
There are many reasons for learning any programming language. What makes C++ a good choice for those who plan on doing programming as a part of their careers?
First of all, C++ has been used in all kinds of systems since the language became an ISO Standard in 1998 and also before that.
Many of those systems that was created back then are still in heavy use today and demands maintenance programmers to keep them up to date.
A great deal of software that we use in our day to day lives today depends on C++ to keep running.
Many new software systems created today also uses C++ because of its universal properties, making it a safe, stable and long-term alternative for cross platform development of various systems, not tied to any manufacturer and not owned or governed by any company.
For more information on C++ as a language and links to various standards, compilers and libraries, visit:
There is a ton of valuable information on that page, covering a vast amount of topics.
How to learn C++
If you’re reading this, my guess is that you either want to learn how to use C++ in your programs.
I do not claim that the introduction offered in this series of posts will be anywhere near sufficient to make you a C++ developer.
This is only meant as a starting point for learning more of the intricate nuances that C++ programming is all about.
I want to introduce you to some of the concepts that I found tricky to wrap my head around when I started learning about the C++ programming language, before the YouTube age and the massive amount of learning opportunities available today.
The fact that the sources for learning C++ has become so many and so diverse actually doesn’t make it that much easier, because you have to know what sources to trust as being good and that in it self is a rather hard task if you don’t know what to look for!
I’ve seen both paid and free resources available for learning C++ that range in quality from down right pathetic and plain wrong to excellent and well worth your precious time. Just remember: What you pay for is not necessarily what you get.
In these posts I’ve tried to extract knowledge from various books I wish I had when first learning C++, and turn it into easily digestible bits of information.
Some of the books I highly recommend and that I’ve used as inspiration for writing this series include:
Programming – Principles and Practice Using C++ 2nd Edition by Bjarne Stroustrup et. al
C++ Primer, 5th Edition by Lippman, Lajoie and Moo
Think Like a Programmer – An Introduction to Creative Problem Solving by V. Anton Spraul
Understanding and Using C Pointers by Richard Reese
Effective Modern C++ by Scott Meyers
Safe C++ by Vladimir Kushnir
The C++ Programming Language 4rd Edition by Bjarne Stroustrup
These are all books that are verified and accepted as good learning material by the C++ community at large and is a safe bet if you want to know more about the vast areas of programming and to find specific information about using C++ in the best ways possible.
How to structure the material
I’ve seen many attempts to divide the beginning concepts of C++ into logical parts that makes it “easy” or easier to understand.
Some introduce functions before references and pointers, some introduce classes before general compound types and some choose to ignore the concepts of memory, pointers and references all together in the beginning chapters.
To me that’s all a bit too abstract. I prefer a more direct path.
Before learning to use functions I feel that it is imperative to know something about constants and references, as this will get more important when trying to write various functions that can both manipulate its arguments directly or being denied to change its
arguments as a whole.
I also feel that even though Object Oriented Programming (OOP) has many important uses it is also maybe the most abused concept in modern programming. This is a direct consequence of pure OOP languages such as Java that requires you to create a class just to do a simple “Hello World!” program.
In C++ OOP is an option but not a requirement. You can choose when to start introducing objects into your code and if you can do without it, why complicate matters if it doesn’t lead to anything other than unnecessary complexity?
Well, enough said.
Let’s get on with the actual introduction to programming in C++.
Variables and Basic Types
C++ defines a set of built-in primitive types that include the arithmetic types and a special type named “void”.
Void will be described later when we start talking about functions.
Arithmetic types are divided into “integral” types (numbers) and also include characters (char), like ‘A’ and Boolean (true/false) and floating point types (numbers with a fractional part), like 3.14.
Before continuing on, let’s detour into how these types are stored in a computer.
How machines represent the built-in types
As many knows, computers store data as a sequence of bits. each holding either the value 0 or 1. This is referred to as the binary number system.
That is a stream of bits, like 0001110011001110 …
To keep track of the stored values in memory, computers group chunks of “bits” and the smallest chunk of addressable memory is referred to as a “byte” and is usually made up of 8 bits.
The computer’s basic character set is used to define the size of a byte and in C++ a byte has “at least” as many bits needed to hold a character.
Most machines operate with 8 bit bytes and the ASCII basic character set.
The basic unit of storage is called a “word” and consists of a small amount of bytes grouped together. On 32-bit systems this is usually 4 bytes (4 * 8 = 32) and on 64-bit systems it is the double of that, 8 bytes (8 * 8 = 64).
You can visually represent a word like this:
There is also a concept of Big-Endian and Little-Endian that describes the order of the bytes in memory and in transmission over a digital link. This is not something you need to concern yourself with when starting out, but it is an important topic later on.
The concept of “Big-Endian” vs. “Little-Endian” can be further investigated here:
The following is a short description of the various arithmetic types.
C++ is designed to let the programmer exploit hardware specific optimizations and therefor provides a number of different types to squeeze the most out of any given hardware platform.
In practice, and when beginning to learn about C++, don’t get caught up in all the details.
The provided information is only provided for the sake of completeness.
There are a few different character types available, to accommodate for various needs and extended character sets.
The basic character type is called char and big enough to hold numerical values corresponding to the machine’s basic character set.
In addition there is wchar_t, char16_t and char32_t, all used for extended character sets.
char16_t and char32_t are intended for Unicode characters. Unicode is an example of an extended character set.
wchar_t is guaranteed to be large enough to hold any character in the machine’s largest character set, whatever that may be.
The character types has corresponding numerical values that maps to the different characters thay can represent,
like the character ‘A’ correspond to the decimal number 65, ‘B’ is 66 and so on.
These represent single (float), double (double) and extended precision (long double) values.
The standard only specifies a minimum number of significant digits but most compilers provide more precision than the required minimum.
Typically a float is represented in 32 bits giving it around 7 significant digits of precision, a double is stored in 64 bits with around 16 digit precision and a long double is stored in either 96 or 128 bits. The precision of all floating types are hardware dependent and the use of long doubles are largely dependent on the given hardware support.
Signed and Unsigned Types
Except for bool and the extended character types, the integral types may be “signed” (can contain negative values) or “unsigned”
(can only contain values 0 or above).
One way to remember this is that to use a negative number, you have to use a sign (the – sign), hence you need a signed type.
The types int, short, long and long long are all signed types and can contain values below 0. (negative numbers).
We can get the corresponding unsigned type by adding the word “unsigned” before the name of the type, as in unsigned int.
In the case of int you can use the abbreviated form of just unsigned, as in:
unsigned count = 0;
Signed and Unsigned Characters
To complicate things a bit more, there are three different types of characters.
char, signed char and unsigned char are all distinct basic character types.
There are actually only two representations of characters in memory, signed or unsigned, but the plain char uses one of these depending on the compiler you use.
The 8-bit unsigned char can hold values from 0..255 (inclusive) while the signed char can hold values from -127..127.
Most modern machines use representations that allow -128..127, but the standard only guarantees -127..127 (inclusive).
What to use when?
As mentioned earlier, all though C++ provides a staggering amount of arithmetic types, you’ll find yourself using only a handful of these on a day to day basis.
Some rules for what to use when can include:
- Use an unsigned type when you KNOW that the values should never be negative
- Use regular int for integer arithmetic. (short is usually to small and long usually has the same size as int)
- Use long long if you KNOW that the value will exceed the minimum guaranteed size of an int
- Use double for floating point computations
- Don’t use char or bool for arithmetic expressions. Only to hold characters or true / false respectively
Next time I’ll cover some information regarding type conversion!